StaticLayoutTest.java revision 08209a767b7d960f5396df3aa45913b2194c46be
16ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt/* 26ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * Copyright (C) 2010 The Android Open Source Project 36ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * 46ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * Licensed under the Apache License, Version 2.0 (the "License"); you may not 56ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * use this file except in compliance with the License. You may obtain a copy of 66ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * the License at 76ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * 86ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * http://www.apache.org/licenses/LICENSE-2.0 96ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * 106ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * Unless required by applicable law or agreed to in writing, software 116ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 126ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 136ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * License for the specific language governing permissions and limitations under 146ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * the License. 156ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt */ 166ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 176ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Feltpackage android.text; 186ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 196ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Feltimport android.graphics.Paint.FontMetricsInt; 206ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Feltimport android.test.suitebuilder.annotation.SmallTest; 216ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Feltimport android.text.Layout.Alignment; 226ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Feltimport static android.text.Layout.Alignment.*; 236ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Feltimport android.util.Log; 246ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 256ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Feltimport junit.framework.TestCase; 266ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 276ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt/** 286ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * Tests StaticLayout vertical metrics behavior. 2908209a767b7d960f5396df3aa45913b2194c46beDoug Felt * 3008209a767b7d960f5396df3aa45913b2194c46beDoug Felt * Requires disabling access checks in the vm since this calls package-private 3108209a767b7d960f5396df3aa45913b2194c46beDoug Felt * APIs. 3208209a767b7d960f5396df3aa45913b2194c46beDoug Felt * 3308209a767b7d960f5396df3aa45913b2194c46beDoug Felt * @Suppress 346ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt */ 356ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Feltpublic class StaticLayoutTest extends TestCase { 366ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 376ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt /** 386ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * Basic test showing expected behavior and relationship between font 396ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * metrics and line metrics. 406ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt */ 4108209a767b7d960f5396df3aa45913b2194c46beDoug Felt //@SmallTest 426ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt public void testGetters1() { 436ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt LayoutBuilder b = builder(); 446ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt FontMetricsInt fmi = b.paint.getFontMetricsInt(); 456ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 466ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt // check default paint 476ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt Log.i("TG1:paint", fmi.toString()); 486ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 496ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt Layout l = b.build(); 506ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertVertMetrics(l, 0, 0, 516ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt fmi.ascent, fmi.descent); 526ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 536ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt // other quick metrics 546ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertEquals(0, l.getLineStart(0)); 556ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertEquals(Layout.DIR_LEFT_TO_RIGHT, l.getParagraphDirection(0)); 566ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertEquals(false, l.getLineContainsTab(0)); 576ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertEquals(Layout.DIRS_ALL_LEFT_TO_RIGHT, l.getLineDirections(0)); 586ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertEquals(0, l.getEllipsisCount(0)); 596ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertEquals(0, l.getEllipsisStart(0)); 606ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertEquals(b.width, l.getEllipsizedWidth()); 616ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 626ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 636ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt /** 646ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * Basic test showing effect of includePad = true with 1 line. 656ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * Top and bottom padding are affected, as is the line descent and height. 666ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt */ 6708209a767b7d960f5396df3aa45913b2194c46beDoug Felt //@SmallTest 686ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt public void testGetters2() { 696ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt LayoutBuilder b = builder() 706ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt .setIncludePad(true); 716ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt FontMetricsInt fmi = b.paint.getFontMetricsInt(); 726ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 736ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt Layout l = b.build(); 746ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertVertMetrics(l, fmi.top - fmi.ascent, fmi.bottom - fmi.descent, 756ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt fmi.top, fmi.bottom); 766ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 776ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 786ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt /** 796ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * Basic test showing effect of includePad = true wrapping to 2 lines. 806ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * Ascent of top line and descent of bottom line are affected. 816ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt */ 8208209a767b7d960f5396df3aa45913b2194c46beDoug Felt //@SmallTest 836ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt public void testGetters3() { 846ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt LayoutBuilder b = builder() 856ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt .setIncludePad(true) 866ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt .setWidth(50); 876ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt FontMetricsInt fmi = b.paint.getFontMetricsInt(); 886ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 896ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt Layout l = b.build(); 906ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertVertMetrics(l, fmi.top - fmi.ascent, fmi.bottom - fmi.descent, 916ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt fmi.top, fmi.descent, 926ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt fmi.ascent, fmi.bottom); 936ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 946ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 956ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt /** 966ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * Basic test showing effect of includePad = true wrapping to 3 lines. 976ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * First line ascent is top, bottom line descent is bottom. 986ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt */ 9908209a767b7d960f5396df3aa45913b2194c46beDoug Felt //@SmallTest 1006ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt public void testGetters4() { 1016ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt LayoutBuilder b = builder() 1026ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt .setText("This is a longer test") 1036ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt .setIncludePad(true) 1046ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt .setWidth(50); 1056ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt FontMetricsInt fmi = b.paint.getFontMetricsInt(); 1066ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 1076ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt Layout l = b.build(); 1086ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertVertMetrics(l, fmi.top - fmi.ascent, fmi.bottom - fmi.descent, 1096ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt fmi.top, fmi.descent, 1106ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt fmi.ascent, fmi.descent, 1116ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt fmi.ascent, fmi.bottom); 1126ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 1136ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 1146ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt /** 1156ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * Basic test showing effect of includePad = true wrapping to 3 lines and 1166ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * large text. See effect of leading. Currently, we don't expect there to 1176ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * even be non-zero leading. 1186ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt */ 11908209a767b7d960f5396df3aa45913b2194c46beDoug Felt //@SmallTest 1206ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt public void testGetters5() { 1216ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt LayoutBuilder b = builder() 1226ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt .setText("This is a longer test") 1236ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt .setIncludePad(true) 1246ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt .setWidth(150); 1256ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt b.paint.setTextSize(36); 1266ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt FontMetricsInt fmi = b.paint.getFontMetricsInt(); 1276ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 1286ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt if (fmi.leading == 0) { // nothing to test 1296ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt Log.i("TG5", "leading is 0, skipping test"); 1306ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt return; 1316ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 1326ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 1336ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt // So far, leading is not used, so this is the same as TG4. If we start 1346ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt // using leading, this will fail. 1356ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt Layout l = b.build(); 1366ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertVertMetrics(l, fmi.top - fmi.ascent, fmi.bottom - fmi.descent, 1376ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt fmi.top, fmi.descent, 1386ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt fmi.ascent, fmi.descent, 1396ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt fmi.ascent, fmi.bottom); 1406ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 1416ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 1426ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt /** 1436ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * Basic test showing effect of includePad = true, spacingAdd = 2, wrapping 1446ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * to 3 lines. 1456ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt */ 14608209a767b7d960f5396df3aa45913b2194c46beDoug Felt //@SmallTest 1476ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt public void testGetters6() { 1486ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt int spacingAdd = 2; // int so expressions return int 1496ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt LayoutBuilder b = builder() 1506ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt .setText("This is a longer test") 1516ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt .setIncludePad(true) 1526ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt .setWidth(50) 1536ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt .setSpacingAdd(spacingAdd); 1546ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt FontMetricsInt fmi = b.paint.getFontMetricsInt(); 1556ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 1566ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt Layout l = b.build(); 1576ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertVertMetrics(l, fmi.top - fmi.ascent, fmi.bottom - fmi.descent, 1586ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt fmi.top, fmi.descent + spacingAdd, 1596ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt fmi.ascent, fmi.descent + spacingAdd, 1606ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt fmi.ascent, fmi.bottom + spacingAdd); 1616ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 1626ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 1636ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt /** 1646ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * Basic test showing effect of includePad = true, spacingAdd = 2, 1656ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * spacingMult = 1.5, wrapping to 3 lines. 1666ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt */ 16708209a767b7d960f5396df3aa45913b2194c46beDoug Felt //@SmallTest 1686ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt public void testGetters7() { 1696ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt LayoutBuilder b = builder() 1706ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt .setText("This is a longer test") 1716ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt .setIncludePad(true) 1726ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt .setWidth(50) 1736ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt .setSpacingAdd(2) 1746ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt .setSpacingMult(1.5f); 1756ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt FontMetricsInt fmi = b.paint.getFontMetricsInt(); 1766ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt Scaler s = new Scaler(b.spacingMult, b.spacingAdd); 1776ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 1786ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt Layout l = b.build(); 1796ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertVertMetrics(l, fmi.top - fmi.ascent, fmi.bottom - fmi.descent, 1806ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt fmi.top, fmi.descent + s.scale(fmi.descent - fmi.top), 1816ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt fmi.ascent, fmi.descent + s.scale(fmi.descent - fmi.ascent), 1826ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt fmi.ascent, fmi.bottom + s.scale(fmi.bottom - fmi.ascent)); 1836ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 1846ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 1856ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt /** 1866ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * Basic test showing effect of includePad = true, spacingAdd = 0, 1876ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt * spacingMult = 0.8 when wrapping to 3 lines. 1886ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt */ 18908209a767b7d960f5396df3aa45913b2194c46beDoug Felt //@SmallTest 1906ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt public void testGetters8() { 1916ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt LayoutBuilder b = builder() 1926ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt .setText("This is a longer test") 1936ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt .setIncludePad(true) 1946ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt .setWidth(50) 1956ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt .setSpacingAdd(2) 1966ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt .setSpacingMult(.8f); 1976ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt FontMetricsInt fmi = b.paint.getFontMetricsInt(); 1986ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt Scaler s = new Scaler(b.spacingMult, b.spacingAdd); 1996ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 2006ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt Layout l = b.build(); 2016ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertVertMetrics(l, fmi.top - fmi.ascent, fmi.bottom - fmi.descent, 2026ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt fmi.top, fmi.descent + s.scale(fmi.descent - fmi.top), 2036ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt fmi.ascent, fmi.descent + s.scale(fmi.descent - fmi.ascent), 2046ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt fmi.ascent, fmi.bottom + s.scale(fmi.bottom - fmi.ascent)); 2056ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 2066ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 2076ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt // ----- test utility classes and methods ----- 2086ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 2096ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt // Models the effect of the scale and add parameters. I think the current 2106ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt // implementation misbehaves. 2116ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt private static class Scaler { 2126ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt private final float sMult; 2136ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt private final float sAdd; 2146ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 2156ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt Scaler(float sMult, float sAdd) { 2166ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt this.sMult = sMult - 1; 2176ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt this.sAdd = sAdd; 2186ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 2196ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 2206ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt public int scale(float height) { 2211065758a0f8966a8597a61492112f7859a7050a4Doug Felt int altVal = (int)(height * sMult + sAdd + 0.5); 2226ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt int rndVal = Math.round(height * sMult + sAdd); 2236ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt if (altVal != rndVal) { 2246ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt Log.i("Scale", "expected scale: " + rndVal + 2256ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt " != returned scale: " + altVal); 2266ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 2271065758a0f8966a8597a61492112f7859a7050a4Doug Felt return rndVal; 2286ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 2296ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 2306ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 2316ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt private static LayoutBuilder builder() { 2326ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt return new LayoutBuilder(); 2336ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 2346ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 2356ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt private static class LayoutBuilder { 2366ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt String text = "This is a test"; 2376ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt TextPaint paint = new TextPaint(); // default 2386ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt int width = 100; 2396ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt Alignment align = ALIGN_NORMAL; 2406ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt float spacingMult = 1; 2416ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt float spacingAdd = 0; 2426ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt boolean includePad = false; 2436ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 2446ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt LayoutBuilder setText(String text) { 2456ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt this.text = text; 2466ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt return this; 2476ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 2486ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 2496ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt LayoutBuilder setPaint(TextPaint paint) { 2506ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt this.paint = paint; 2516ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt return this; 2526ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 2536ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 2546ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt LayoutBuilder setWidth(int width) { 2556ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt this.width = width; 2566ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt return this; 2576ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 2586ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 2596ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt LayoutBuilder setAlignment(Alignment align) { 2606ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt this.align = align; 2616ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt return this; 2626ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 2636ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 2646ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt LayoutBuilder setSpacingMult(float spacingMult) { 2656ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt this.spacingMult = spacingMult; 2666ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt return this; 2676ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 2686ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 2696ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt LayoutBuilder setSpacingAdd(float spacingAdd) { 2706ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt this.spacingAdd = spacingAdd; 2716ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt return this; 2726ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 2736ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 2746ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt LayoutBuilder setIncludePad(boolean includePad) { 2756ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt this.includePad = includePad; 2766ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt return this; 2776ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 2786ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 2796ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt Layout build() { 2806ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt return new StaticLayout(text, paint, width, align, spacingMult, 2816ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt spacingAdd, includePad); 2826ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 2836ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 2846ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 2856ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt private void assertVertMetrics(Layout l, int topPad, int botPad, int... values) { 2866ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertTopBotPadding(l, topPad, botPad); 2876ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertLinesMetrics(l, values); 2886ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 2896ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 2906ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt private void assertLinesMetrics(Layout l, int... values) { 2916ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt // sanity check 2926ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt if ((values.length & 0x1) != 0) { 2936ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt throw new IllegalArgumentException(String.valueOf(values.length)); 2946ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 2956ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 2966ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt int lines = values.length >> 1; 2976ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertEquals(lines, l.getLineCount()); 2986ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 2996ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt int t = 0; 3006ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt for (int i = 0, n = 0; i < lines; ++i, n += 2) { 3016ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt int a = values[n]; 3026ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt int d = values[n+1]; 3036ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt int h = -a + d; 3046ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertLineMetrics(l, i, t, a, d, h); 3056ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt t += h; 3066ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 3076ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 3086ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertEquals(t, l.getHeight()); 3096ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 3106ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 3116ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt private void assertLineMetrics(Layout l, int line, 3126ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt int top, int ascent, int descent, int height) { 3136ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt String info = "line " + line; 3146ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertEquals(info, top, l.getLineTop(line)); 3156ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertEquals(info, ascent, l.getLineAscent(line)); 3166ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertEquals(info, descent, l.getLineDescent(line)); 3176ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertEquals(info, height, l.getLineBottom(line) - top); 3186ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 3196ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt 3206ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt private void assertTopBotPadding(Layout l, int topPad, int botPad) { 3216ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertEquals(topPad, l.getTopPadding()); 3226ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt assertEquals(botPad, l.getBottomPadding()); 3236ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt } 3246ad5a7a7c78799ecb306cb97d979bdb98cc52d15Doug Felt} 325