diff options
| author | 2015-09-01 15:58:01 +0900 | |
|---|---|---|
| committer | 2015-09-10 13:59:07 +0900 | |
| commit | 5532c34613753044b834a1e8cfb8c20d76405af7 (patch) | |
| tree | 58dd22647fa8e6515c44fbab21864b22457f6899 | |
| parent | bbec1e16f2dcc3376859c5528adeef08b8d62fc5 (diff) | |
Introduce getTextWidths test cases.
This CL includes HintedAdvanceWidthTest-Regular.{ttx|ttf} for fixing
test expectation, which has hinting information.
Bug: 11256006
Change-Id: Ia79a1d093e39cd47c914395e034cb90eda51c5c0
| -rw-r--r-- | core/tests/coretests/assets/fonts/HintedAdvanceWidthTest-Regular.ttf | bin | 0 -> 1136 bytes | |||
| -rw-r--r-- | core/tests/coretests/assets/fonts/HintedAdvanceWidthTest-Regular.ttx | 328 | ||||
| -rw-r--r-- | core/tests/coretests/src/android/graphics/PaintTest.java | 97 |
3 files changed, 425 insertions, 0 deletions
diff --git a/core/tests/coretests/assets/fonts/HintedAdvanceWidthTest-Regular.ttf b/core/tests/coretests/assets/fonts/HintedAdvanceWidthTest-Regular.ttf Binary files differnew file mode 100644 index 000000000000..1924c35a9c0a --- /dev/null +++ b/core/tests/coretests/assets/fonts/HintedAdvanceWidthTest-Regular.ttf diff --git a/core/tests/coretests/assets/fonts/HintedAdvanceWidthTest-Regular.ttx b/core/tests/coretests/assets/fonts/HintedAdvanceWidthTest-Regular.ttx new file mode 100644 index 000000000000..2b8478d522d2 --- /dev/null +++ b/core/tests/coretests/assets/fonts/HintedAdvanceWidthTest-Regular.ttx @@ -0,0 +1,328 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.0"> + + <GlyphOrder> + <!-- The 'id' attribute is only for humans; it is ignored when parsed. --> + <GlyphID id="0" name=".notdef"/> + <GlyphID id="1" name="space"/> + <GlyphID id="9" name="H"/> + <GlyphID id="16" name="O"/> + </GlyphOrder> + + <head> + <!-- Most of this table will be recalculated by the compiler --> + <tableVersion value="1.0"/> + <fontRevision value="1.0"/> + <checkSumAdjustment value="0x640cdb2f"/> + <magicNumber value="0x5f0f3cf5"/> + <flags value="00000000 00000011"/> + <unitsPerEm value="1000"/> + <created value="Wed Sep 9 08:01:17 2015"/> + <modified value="Wed Sep 9 08:48:07 2015"/> + <xMin value="30"/> + <yMin value="-200"/> + <xMax value="629"/> + <yMax value="800"/> + <macStyle value="00000000 00000000"/> + <lowestRecPPEM value="7"/> + <fontDirectionHint value="2"/> + <indexToLocFormat value="0"/> + <glyphDataFormat value="0"/> + </head> + + <hhea> + <tableVersion value="1.0"/> + <ascent value="1000"/> + <descent value="-200"/> + <lineGap value="0"/> + <advanceWidthMax value="659"/> + <minLeftSideBearing value="0"/> + <minRightSideBearing value="30"/> + <xMaxExtent value="629"/> + <caretSlopeRise value="1"/> + <caretSlopeRun value="0"/> + <caretOffset value="0"/> + <reserved0 value="0"/> + <reserved1 value="0"/> + <reserved2 value="0"/> + <reserved3 value="0"/> + <metricDataFormat value="0"/> + <numberOfHMetrics value="18"/> + </hhea> + + <maxp> + <!-- Most of this table will be recalculated by the compiler --> + <tableVersion value="0x10000"/> + <numGlyphs value="54"/> + <maxPoints value="73"/> + <maxContours value="10"/> + <maxCompositePoints value="0"/> + <maxCompositeContours value="0"/> + <maxZones value="2"/> + <maxTwilightPoints value="12"/> + <maxStorage value="28"/> + <maxFunctionDefs value="119"/> + <maxInstructionDefs value="0"/> + <maxStackElements value="61"/> + <maxSizeOfInstructions value="2967"/> + <maxComponentElements value="0"/> + <maxComponentDepth value="0"/> + </maxp> + + <OS_2> + <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex' + will be recalculated by the compiler --> + <version value="3"/> + <xAvgCharWidth value="594"/> + <usWeightClass value="400"/> + <usWidthClass value="5"/> + <fsType value="00000000 00001000"/> + <ySubscriptXSize value="650"/> + <ySubscriptYSize value="600"/> + <ySubscriptXOffset value="0"/> + <ySubscriptYOffset value="75"/> + <ySuperscriptXSize value="650"/> + <ySuperscriptYSize value="600"/> + <ySuperscriptXOffset value="0"/> + <ySuperscriptYOffset value="350"/> + <yStrikeoutSize value="50"/> + <yStrikeoutPosition value="300"/> + <sFamilyClass value="0"/> + <panose> + <bFamilyType value="0"/> + <bSerifStyle value="0"/> + <bWeight value="5"/> + <bProportion value="0"/> + <bContrast value="0"/> + <bStrokeVariation value="0"/> + <bArmStyle value="0"/> + <bLetterForm value="0"/> + <bMidline value="0"/> + <bXHeight value="0"/> + </panose> + <ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/> + <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/> + <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/> + <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/> + <achVendID value="UKWN"/> + <fsSelection value="00000000 01000000"/> + <usFirstCharIndex value="32"/> + <usLastCharIndex value="122"/> + <sTypoAscender value="800"/> + <sTypoDescender value="-200"/> + <sTypoLineGap value="200"/> + <usWinAscent value="1000"/> + <usWinDescent value="200"/> + <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/> + <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/> + <sxHeight value="500"/> + <sCapHeight value="700"/> + <usDefaultChar value="0"/> + <usBreakChar value="32"/> + <usMaxContext value="0"/> + </OS_2> + + <hmtx> + <mtx name=".notdef" width="500" lsb="93"/> + <mtx name="H" width="627" lsb="50"/> + <mtx name="O" width="659" lsb="30"/> + <mtx name="space" width="300" lsb="0"/> + </hmtx> + + <cmap> + <tableVersion version="0"/> + <cmap_format_4 platformID="0" platEncID="3" language="0"> + <map code="0x20" name="space"/><!-- SPACE --> + <map code="0x48" name="H"/><!-- LATIN CAPITAL LETTER H --> + <map code="0x4f" name="O"/><!-- LATIN CAPITAL LETTER O --> + </cmap_format_4> + <cmap_format_4 platformID="3" platEncID="1" language="0"> + <map code="0x20" name="space"/><!-- SPACE --> + <map code="0x48" name="H"/><!-- LATIN CAPITAL LETTER H --> + <map code="0x4f" name="O"/><!-- LATIN CAPITAL LETTER O --> + </cmap_format_4> + </cmap> + + <fpgm> + <assembly> + </assembly> + </fpgm> + + <prep> + <assembly> + </assembly> + </prep> + + <cvt> + <cv index="0" value="0"/> + </cvt> + + <loca> + <!-- The 'loca' table will be calculated by the compiler --> + </loca> + + <glyf> + + <!-- The xMin, yMin, xMax and yMax values + will be recalculated by the compiler. --> + + <TTGlyph name=".notdef" xMin="93" yMin="-200" xMax="410" yMax="800"> + <contour> + <pt x="410" y="0" on="1"/> + <pt x="50" y="0" on="1"/> + <pt x="50" y="700" on="1"/> + <pt x="410" y="700" on="1"/> + </contour> + <instructions><assembly> + PUSHB[] 1 2 4 3 + SLOOP[] + PUSH[] -400 + SHPIX[] + + PUSHB[] 0 3 5 3 + SLOOP[] + PUSH[] 400 + SHPIX[] + </assembly></instructions> + </TTGlyph> + + <TTGlyph name="H" xMin="50" yMin="0" xMax="577" yMax="700"> + <contour> + <pt x="50" y="700" on="1"/> + <pt x="200" y="700" on="1"/> + <pt x="200" y="447" on="1"/> + <pt x="427" y="447" on="1"/> + <pt x="427" y="700" on="1"/> + <pt x="577" y="700" on="1"/> + <pt x="577" y="0" on="1"/> + <pt x="427" y="0" on="1"/> + <pt x="427" y="297" on="1"/> + <pt x="200" y="297" on="1"/> + <pt x="200" y="0" on="1"/> + <pt x="50" y="0" on="1"/> + </contour> + <instructions><assembly> + PUSHB[] 0 11 12 3 + SLOOP[] + PUSH[] -200 + SHPIX[] + PUSHB[] 5 6 13 3 + SLOOP[] + PUSH[] 200 + SHPIX[] + </assembly></instructions> + </TTGlyph> + + <TTGlyph name="O" xMin="30" yMin="0" xMax="629" yMax="700"> + <contour> + <pt x="248" y="0" on="0"/> + <pt x="111" y="94" on="0"/> + <pt x="30" y="255" on="0"/> + <pt x="30" y="350" on="1"/> + <pt x="30" y="445" on="0"/> + <pt x="111" y="606" on="0"/> + <pt x="248" y="700" on="0"/> + <pt x="330" y="700" on="1"/> + <pt x="411" y="700" on="0"/> + <pt x="548" y="606" on="0"/> + <pt x="629" y="445" on="0"/> + <pt x="629" y="350" on="1"/> + <pt x="629" y="255" on="0"/> + <pt x="548" y="94" on="0"/> + <pt x="411" y="0" on="0"/> + <pt x="330" y="0" on="1"/> + </contour> + <contour> + <pt x="370" y="150" on="0"/> + <pt x="439" y="209" on="0"/> + <pt x="480" y="302" on="0"/> + <pt x="480" y="350" on="1"/> + <pt x="480" y="398" on="0"/> + <pt x="439" y="491" on="0"/> + <pt x="370" y="550" on="0"/> + <pt x="330" y="550" on="1"/> + <pt x="289" y="550" on="0"/> + <pt x="220" y="491" on="0"/> + <pt x="179" y="398" on="0"/> + <pt x="179" y="350" on="1"/> + <pt x="179" y="302" on="0"/> + <pt x="220" y="209" on="0"/> + <pt x="289" y="150" on="0"/> + <pt x="330" y="150" on="1"/> + </contour> + <instructions><assembly> + PUSH[] 32 -200 + SHPIX[] + PUSHB[] 33 200 + SHPIX[] + </assembly></instructions> + </TTGlyph> + + <TTGlyph name="space"> + <contour></contour> + <instructions><assembly> + PUSH[] 0 -200 + SHPIX[] + PUSHB[] 1 200 + SHPIX[] + </assembly></instructions> + </TTGlyph> + + </glyf> + + <name> + <namerecord nameID="1" platformID="1" platEncID="0" langID="0x0" unicode="True"> + Hinted Advance Width Test + </namerecord> + <namerecord nameID="2" platformID="1" platEncID="0" langID="0x0" unicode="True"> + Regular + </namerecord> + <namerecord nameID="4" platformID="1" platEncID="0" langID="0x0" unicode="True"> + Hinted Advance Width Test + </namerecord> + <namerecord nameID="6" platformID="1" platEncID="0" langID="0x0" unicode="True"> + HintedAdvanceWidthTest-Regular + </namerecord> + <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409"> + Hinted Advance Width Test + </namerecord> + <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409"> + Regular + </namerecord> + <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409"> + Hinted Advance Width Test + </namerecord> + <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409"> + HintedAdvanceWidthTest-Regular + </namerecord> + </name> + + <post> + <formatType value="2.0"/> + <italicAngle value="0.0"/> + <underlinePosition value="-75"/> + <underlineThickness value="50"/> + <isFixedPitch value="0"/> + <minMemType42 value="0"/> + <maxMemType42 value="0"/> + <minMemType1 value="0"/> + <maxMemType1 value="0"/> + <psNames> + <!-- This file uses unique glyph names based on the information + found in the 'post' table. Since these names might not be unique, + we have to invent artificial names in case of clashes. In order to + be able to retain the original information, we need a name to + ps name mapping for those cases where they differ. That's what + you see below. + --> + </psNames> + <extraNames> + <!-- following are the name that are not taken from the standard Mac glyph order --> + </extraNames> + </post> + + <gasp> + <gaspRange rangeMaxPPEM="65535" rangeGaspBehavior="15"/> + </gasp> + +</ttFont> diff --git a/core/tests/coretests/src/android/graphics/PaintTest.java b/core/tests/coretests/src/android/graphics/PaintTest.java new file mode 100644 index 000000000000..e97bb33487c4 --- /dev/null +++ b/core/tests/coretests/src/android/graphics/PaintTest.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.graphics; + +import android.graphics.Paint; +import android.test.InstrumentationTestCase; +import android.test.suitebuilder.annotation.SmallTest; + +/** + * PaintTest tests {@link Paint}. + */ +public class PaintTest extends InstrumentationTestCase { + private static final String FONT_PATH = "fonts/HintedAdvanceWidthTest-Regular.ttf"; + + static void assertEquals(String message, float[] expected, float[] actual) { + if (expected.length != actual.length) { + fail(message + " expected array length:<" + expected.length + "> but was:<" + + actual.length + ">"); + } + for (int i = 0; i < expected.length; ++i) { + if (expected[i] != actual[i]) { + fail(message + " expected array element[" +i + "]:<" + expected[i] + ">but was:<" + + actual[i] + ">"); + } + } + } + + static class HintingTestCase { + public final String mText; + public final float mTextSize; + public final float[] mWidthWithoutHinting; + public final float[] mWidthWithHinting; + + public HintingTestCase(String text, float textSize, float[] widthWithoutHinting, + float[] widthWithHinting) { + mText = text; + mTextSize = textSize; + mWidthWithoutHinting = widthWithoutHinting; + mWidthWithHinting = widthWithHinting; + } + } + + // Following test cases are only valid for HintedAdvanceWidthTest-Regular.ttf in assets/fonts. + HintingTestCase[] HINTING_TESTCASES = { + new HintingTestCase("H", 11f, new float[] { 7f }, new float[] { 13f }), + new HintingTestCase("O", 11f, new float[] { 7f }, new float[] { 13f }), + + new HintingTestCase("H", 13f, new float[] { 8f }, new float[] { 14f }), + new HintingTestCase("O", 13f, new float[] { 9f }, new float[] { 15f }), + + new HintingTestCase("HO", 11f, new float[] { 7f, 7f }, new float[] { 13f, 13f }), + new HintingTestCase("OH", 11f, new float[] { 7f, 7f }, new float[] { 13f, 13f }), + + new HintingTestCase("HO", 13f, new float[] { 8f, 9f }, new float[] { 14f, 15f }), + new HintingTestCase("OH", 13f, new float[] { 9f, 8f }, new float[] { 15f, 14f }), + }; + + @SmallTest + public void testHintingWidth() { + final Typeface fontTypeface = Typeface.createFromAsset( + getInstrumentation().getContext().getAssets(), FONT_PATH); + Paint paint = new Paint(); + paint.setTypeface(fontTypeface); + + for (int i = 0; i < HINTING_TESTCASES.length; ++i) { + HintingTestCase testCase = HINTING_TESTCASES[i]; + + paint.setTextSize(testCase.mTextSize); + + float[] widths = new float[testCase.mText.length()]; + + paint.setHinting(Paint.HINTING_OFF); + paint.getTextWidths(String.valueOf(testCase.mText), widths); + assertEquals("Text width of '" + testCase.mText + "' without hinting is not expected.", + testCase.mWidthWithoutHinting, widths); + + paint.setHinting(Paint.HINTING_ON); + paint.getTextWidths(String.valueOf(testCase.mText), widths); + assertEquals("Text width of '" + testCase.mText + "' with hinting is not expected.", + testCase.mWidthWithHinting, widths); + } + } +} |