1acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka/* 2acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka * Copyright (C) 2016 The Android Open Source Project 3acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka * 4acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka * Licensed under the Apache License, Version 2.0 (the "License"); 5acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka * you may not use this file except in compliance with the License. 6acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka * You may obtain a copy of the License at 7acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka * 8acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka * http://www.apache.org/licenses/LICENSE-2.0 9acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka * 10acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka * Unless required by applicable law or agreed to in writing, software 11acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka * distributed under the License is distributed on an "AS IS" BASIS, 12acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka * See the License for the specific language governing permissions and 14acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka * limitations under the License. 15acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka */ 16acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 17acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka#include <gtest/gtest.h> 18acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 19acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka#include "ICUTestBase.h" 20acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka#include "minikin/FontCollection.h" 21acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka#include "minikin/Layout.h" 22acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka#include "../util/FontTestUtils.h" 23acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka#include "../util/UnicodeUtils.h" 24acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 25acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonakaconst char* SYSTEM_FONT_PATH = "/system/fonts/"; 26acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonakaconst char* SYSTEM_FONT_XML = "/system/etc/fonts.xml"; 27acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 28acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonakanamespace minikin { 29acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 30acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonakaconst float UNTOUCHED_MARKER = 1e+38; 31acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 32acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonakastatic void expectAdvances(std::vector<float> expected, float* advances, size_t length) { 33acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_LE(expected.size(), length); 34acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka for (size_t i = 0; i < expected.size(); ++i) { 35acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(expected[i], advances[i]) 36acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka << i << "th element is different. Expected: " << expected[i] 37acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka << ", Actual: " << advances[i]; 38acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 39acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(UNTOUCHED_MARKER, advances[expected.size()]); 40acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka} 41acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 42acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonakastatic void resetAdvances(float* advances, size_t length) { 43acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka for (size_t i = 0; i < length; ++i) { 44acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka advances[i] = UNTOUCHED_MARKER; 45acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 46acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka} 47acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 48acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonakaclass LayoutTest : public ICUTestBase { 49acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonakaprotected: 50acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka LayoutTest() : mCollection(nullptr) { 51acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 52acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 53acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka virtual ~LayoutTest() {} 54acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 55acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka virtual void SetUp() override { 56dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka mCollection = std::shared_ptr<FontCollection>( 57dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka getFontCollection(SYSTEM_FONT_PATH, SYSTEM_FONT_XML)); 58acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 59acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 60acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka virtual void TearDown() override { 61acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 62acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 63dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka std::shared_ptr<FontCollection> mCollection; 64acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka}; 65acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 66acd401d02981af51419f4b740abb2c41e4980fdbSeigo NonakaTEST_F(LayoutTest, doLayoutTest) { 67acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka MinikinPaint paint; 68acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka MinikinRect rect; 69acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka const size_t kMaxAdvanceLength = 32; 70acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka float advances[kMaxAdvanceLength]; 71acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka std::vector<float> expectedValues; 72acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 7399ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka Layout layout; 74acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka std::vector<uint16_t> text; 75acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 76acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka // The mock implementation returns 10.0f advance and 0,0-10x10 bounds for all glyph. 77acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka { 78acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka SCOPED_TRACE("one word"); 79acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka text = utf8ToUtf16("oneword"); 8099ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint, 8199ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka mCollection); 82acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(70.0f, layout.getAdvance()); 83acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getBounds(&rect); 84acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(0.0f, rect.mLeft); 85acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(0.0f, rect.mTop); 86acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(70.0f, rect.mRight); 87acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(10.0f, rect.mBottom); 88acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka resetAdvances(advances, kMaxAdvanceLength); 89acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getAdvances(advances); 90acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues.resize(text.size()); 91acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka for (size_t i = 0; i < expectedValues.size(); ++i) { 92acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues[i] = 10.0f; 93acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 94acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectAdvances(expectedValues, advances, kMaxAdvanceLength); 95acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 96acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka { 97acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka SCOPED_TRACE("two words"); 98acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka text = utf8ToUtf16("two words"); 9999ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint, 10099ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka mCollection); 101acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(90.0f, layout.getAdvance()); 102acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getBounds(&rect); 103acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(0.0f, rect.mLeft); 104acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(0.0f, rect.mTop); 105acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(90.0f, rect.mRight); 106acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(10.0f, rect.mBottom); 107acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka resetAdvances(advances, kMaxAdvanceLength); 108acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getAdvances(advances); 109acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues.resize(text.size()); 110acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka for (size_t i = 0; i < expectedValues.size(); ++i) { 111acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues[i] = 10.0f; 112acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 113acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectAdvances(expectedValues, advances, kMaxAdvanceLength); 114acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 115acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka { 116acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka SCOPED_TRACE("three words"); 117acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka text = utf8ToUtf16("three words test"); 11899ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint, 11999ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka mCollection); 120acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(160.0f, layout.getAdvance()); 121acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getBounds(&rect); 122acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(0.0f, rect.mLeft); 123acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(0.0f, rect.mTop); 124acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(160.0f, rect.mRight); 125acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(10.0f, rect.mBottom); 126acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka resetAdvances(advances, kMaxAdvanceLength); 127acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getAdvances(advances); 128acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues.resize(text.size()); 129acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka for (size_t i = 0; i < expectedValues.size(); ++i) { 130acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues[i] = 10.0f; 131acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 132acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectAdvances(expectedValues, advances, kMaxAdvanceLength); 133acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 134acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka { 135acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka SCOPED_TRACE("two spaces"); 136acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka text = utf8ToUtf16("two spaces"); 13799ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint, 13899ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka mCollection); 139acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(110.0f, layout.getAdvance()); 140acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getBounds(&rect); 141acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(0.0f, rect.mLeft); 142acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(0.0f, rect.mTop); 143acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(110.0f, rect.mRight); 144acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(10.0f, rect.mBottom); 145acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka resetAdvances(advances, kMaxAdvanceLength); 146acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getAdvances(advances); 147acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues.resize(text.size()); 148acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka for (size_t i = 0; i < expectedValues.size(); ++i) { 149acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues[i] = 10.0f; 150acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 151acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectAdvances(expectedValues, advances, kMaxAdvanceLength); 152acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 153acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka} 154acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 155acd401d02981af51419f4b740abb2c41e4980fdbSeigo NonakaTEST_F(LayoutTest, doLayoutTest_wordSpacing) { 156acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka MinikinPaint paint; 157acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka MinikinRect rect; 158acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka const size_t kMaxAdvanceLength = 32; 159acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka float advances[kMaxAdvanceLength]; 160acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka std::vector<float> expectedValues; 161acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka std::vector<uint16_t> text; 162acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 16399ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka Layout layout; 164acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 165acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka paint.wordSpacing = 5.0f; 166acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 167acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka // The mock implementation returns 10.0f advance and 0,0-10x10 bounds for all glyph. 168acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka { 169acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka SCOPED_TRACE("one word"); 170acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka text = utf8ToUtf16("oneword"); 17199ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint, 17299ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka mCollection); 173acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(70.0f, layout.getAdvance()); 174acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getBounds(&rect); 175acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(0.0f, rect.mLeft); 176acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(0.0f, rect.mTop); 177acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(70.0f, rect.mRight); 178acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(10.0f, rect.mBottom); 179acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka resetAdvances(advances, kMaxAdvanceLength); 180acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getAdvances(advances); 181acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues.resize(text.size()); 182acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka for (size_t i = 0; i < expectedValues.size(); ++i) { 183acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues[i] = 10.0f; 184acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 185acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectAdvances(expectedValues, advances, kMaxAdvanceLength); 186acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 187acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka { 188acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka SCOPED_TRACE("two words"); 189acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka text = utf8ToUtf16("two words"); 19099ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint, 19199ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka mCollection); 192acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(95.0f, layout.getAdvance()); 193acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getBounds(&rect); 194acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(0.0f, rect.mLeft); 195acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(0.0f, rect.mTop); 196acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(95.0f, rect.mRight); 197acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(10.0f, rect.mBottom); 198acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka resetAdvances(advances, kMaxAdvanceLength); 199acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getAdvances(advances); 200acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(UNTOUCHED_MARKER, advances[text.size()]); 201acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka resetAdvances(advances, kMaxAdvanceLength); 202acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getAdvances(advances); 203acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues.resize(text.size()); 204acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka for (size_t i = 0; i < expectedValues.size(); ++i) { 205acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues[i] = 10.0f; 206acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 207acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues[3] = 15.0f; 208acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectAdvances(expectedValues, advances, kMaxAdvanceLength); 209acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 210acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka { 211acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka SCOPED_TRACE("three words test"); 212acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka text = utf8ToUtf16("three words test"); 21399ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint, 21499ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka mCollection); 215acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(170.0f, layout.getAdvance()); 216acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getBounds(&rect); 217acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(0.0f, rect.mLeft); 218acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(0.0f, rect.mTop); 219acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(170.0f, rect.mRight); 220acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(10.0f, rect.mBottom); 221acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka resetAdvances(advances, kMaxAdvanceLength); 222acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getAdvances(advances); 223acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues.resize(text.size()); 224acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka for (size_t i = 0; i < expectedValues.size(); ++i) { 225acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues[i] = 10.0f; 226acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 227acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues[5] = 15.0f; 228acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues[11] = 15.0f; 229acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectAdvances(expectedValues, advances, kMaxAdvanceLength); 230acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 231acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka { 232acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka SCOPED_TRACE("two spaces"); 233acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka text = utf8ToUtf16("two spaces"); 23499ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint, 23599ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka mCollection); 236acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(120.0f, layout.getAdvance()); 237acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getBounds(&rect); 238acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(0.0f, rect.mLeft); 239acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(0.0f, rect.mTop); 240acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(120.0f, rect.mRight); 241acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(10.0f, rect.mBottom); 242acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka resetAdvances(advances, kMaxAdvanceLength); 243acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getAdvances(advances); 244acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues.resize(text.size()); 245acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka for (size_t i = 0; i < expectedValues.size(); ++i) { 246acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues[i] = 10.0f; 247acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 248acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues[3] = 15.0f; 249acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues[4] = 15.0f; 250acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectAdvances(expectedValues, advances, kMaxAdvanceLength); 251acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 252acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka} 253acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 254acd401d02981af51419f4b740abb2c41e4980fdbSeigo NonakaTEST_F(LayoutTest, doLayoutTest_negativeWordSpacing) { 255acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka MinikinPaint paint; 256acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka MinikinRect rect; 257acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka const size_t kMaxAdvanceLength = 32; 258acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka float advances[kMaxAdvanceLength]; 259acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka std::vector<float> expectedValues; 260acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 26199ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka Layout layout; 262acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka std::vector<uint16_t> text; 263acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 264acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka // Negative word spacing also should work. 265acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka paint.wordSpacing = -5.0f; 266acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 267acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka { 268acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka SCOPED_TRACE("one word"); 269acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka text = utf8ToUtf16("oneword"); 27099ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint, 27199ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka mCollection); 272acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(70.0f, layout.getAdvance()); 273acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getBounds(&rect); 274acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(0.0f, rect.mLeft); 275acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(0.0f, rect.mTop); 276acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(70.0f, rect.mRight); 277acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(10.0f, rect.mBottom); 278acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka resetAdvances(advances, kMaxAdvanceLength); 279acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getAdvances(advances); 280acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues.resize(text.size()); 281acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka for (size_t i = 0; i < expectedValues.size(); ++i) { 282acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues[i] = 10.0f; 283acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 284acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectAdvances(expectedValues, advances, kMaxAdvanceLength); 285acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 286acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka { 287acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka SCOPED_TRACE("two words"); 288acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka text = utf8ToUtf16("two words"); 28999ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint, 29099ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka mCollection); 291acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(85.0f, layout.getAdvance()); 292acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getBounds(&rect); 293acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(0.0f, rect.mLeft); 294acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(0.0f, rect.mTop); 295acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(85.0f, rect.mRight); 296acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(10.0f, rect.mBottom); 297acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka resetAdvances(advances, kMaxAdvanceLength); 298acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getAdvances(advances); 299acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues.resize(text.size()); 300acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka for (size_t i = 0; i < expectedValues.size(); ++i) { 301acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues[i] = 10.0f; 302acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 303acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues[3] = 5.0f; 304acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectAdvances(expectedValues, advances, kMaxAdvanceLength); 305acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 306acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka { 307acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka SCOPED_TRACE("three words"); 308acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka text = utf8ToUtf16("three word test"); 30999ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint, 31099ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka mCollection); 311acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(140.0f, layout.getAdvance()); 312acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getBounds(&rect); 313acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(0.0f, rect.mLeft); 314acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(0.0f, rect.mTop); 315acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(140.0f, rect.mRight); 316acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(10.0f, rect.mBottom); 317acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka resetAdvances(advances, kMaxAdvanceLength); 318acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getAdvances(advances); 319acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues.resize(text.size()); 320acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka for (size_t i = 0; i < expectedValues.size(); ++i) { 321acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues[i] = 10.0f; 322acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 323acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues[5] = 5.0f; 324acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues[10] = 5.0f; 325acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectAdvances(expectedValues, advances, kMaxAdvanceLength); 326acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 327acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka { 328acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka SCOPED_TRACE("two spaces"); 329acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka text = utf8ToUtf16("two spaces"); 33099ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint, 33199ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka mCollection); 332acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(100.0f, layout.getAdvance()); 333acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getBounds(&rect); 334acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(0.0f, rect.mLeft); 335acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(0.0f, rect.mTop); 336acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(100.0f, rect.mRight); 337acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka EXPECT_EQ(10.0f, rect.mBottom); 338acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka resetAdvances(advances, kMaxAdvanceLength); 339acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka layout.getAdvances(advances); 340acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues.resize(text.size()); 341acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka for (size_t i = 0; i < expectedValues.size(); ++i) { 342acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues[i] = 10.0f; 343acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 344acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues[3] = 5.0f; 345acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectedValues[4] = 5.0f; 346acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka expectAdvances(expectedValues, advances, kMaxAdvanceLength); 347acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka } 348acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka} 349acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 350dfbc6e374259f9d81940b5195ac013b02429af27Seigo NonakaTEST_F(LayoutTest, doLayoutTest_rtlTest) { 351dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka MinikinPaint paint; 352dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka 353dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka std::vector<uint16_t> text = parseUnicodeString("'a' 'b' U+3042 U+3043 'c' 'd'"); 354dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka 35599ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka Layout ltrLayout; 35699ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka ltrLayout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint, 35799ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka mCollection); 358dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka 35999ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka Layout rtlLayout; 36099ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka rtlLayout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_RTL, FontStyle(), paint, 36199ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka mCollection); 362dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka 363dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka ASSERT_EQ(ltrLayout.nGlyphs(), rtlLayout.nGlyphs()); 364dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka ASSERT_EQ(6u, ltrLayout.nGlyphs()); 365dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka 366dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka size_t nGlyphs = ltrLayout.nGlyphs(); 367dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka for (size_t i = 0; i < nGlyphs; ++i) { 368dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka EXPECT_EQ(ltrLayout.getFont(i), rtlLayout.getFont(nGlyphs - i - 1)); 369dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka EXPECT_EQ(ltrLayout.getGlyphId(i), rtlLayout.getGlyphId(nGlyphs - i - 1)); 370dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka } 371dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka} 372dfbc6e374259f9d81940b5195ac013b02429af27Seigo Nonaka 373c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh PournaderTEST_F(LayoutTest, hyphenationTest) { 37499ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka Layout layout; 375c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader std::vector<uint16_t> text; 376c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader 377c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader // The mock implementation returns 10.0f advance for all glyphs. 378c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader { 379c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader SCOPED_TRACE("one word with no hyphen edit"); 380c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader text = utf8ToUtf16("oneword"); 381c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader MinikinPaint paint; 382c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader paint.hyphenEdit = HyphenEdit::NO_EDIT; 38399ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint, 38499ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka mCollection); 385c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader EXPECT_EQ(70.0f, layout.getAdvance()); 386c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader } 387c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader { 388c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader SCOPED_TRACE("one word with hyphen insertion at the end"); 389c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader text = utf8ToUtf16("oneword"); 390c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader MinikinPaint paint; 391c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader paint.hyphenEdit = HyphenEdit::INSERT_HYPHEN_AT_END; 39299ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint, 39399ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka mCollection); 394c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader EXPECT_EQ(80.0f, layout.getAdvance()); 395c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader } 396c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader { 397c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader SCOPED_TRACE("one word with hyphen replacement at the end"); 398c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader text = utf8ToUtf16("oneword"); 399c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader MinikinPaint paint; 400c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader paint.hyphenEdit = HyphenEdit::REPLACE_WITH_HYPHEN_AT_END; 40199ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint, 40299ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka mCollection); 403c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader EXPECT_EQ(70.0f, layout.getAdvance()); 404c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader } 405c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader { 406c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader SCOPED_TRACE("one word with hyphen insertion at the start"); 407c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader text = utf8ToUtf16("oneword"); 408c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader MinikinPaint paint; 409c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader paint.hyphenEdit = HyphenEdit::INSERT_HYPHEN_AT_START; 41099ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint, 41199ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka mCollection); 412c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader EXPECT_EQ(80.0f, layout.getAdvance()); 413c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader } 414c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader { 415c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader SCOPED_TRACE("one word with hyphen insertion at the both ends"); 416c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader text = utf8ToUtf16("oneword"); 417c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader MinikinPaint paint; 418c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader paint.hyphenEdit = HyphenEdit::INSERT_HYPHEN_AT_START | HyphenEdit::INSERT_HYPHEN_AT_END; 41999ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka layout.doLayout(text.data(), 0, text.size(), text.size(), kBidi_LTR, FontStyle(), paint, 42099ef32cef014231c0d544e8d4f97449695d429c0Seigo Nonaka mCollection); 421c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader EXPECT_EQ(90.0f, layout.getAdvance()); 422c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader } 423c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader} 424c7ef4000c1e840c3d3b66e85a40ebd34a5a2a8eeRoozbeh Pournader 425acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka// TODO: Add more test cases, e.g. measure text, letter spacing. 426acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka 427acd401d02981af51419f4b740abb2c41e4980fdbSeigo Nonaka} // namespace minikin 428