TextBlobTest.cpp revision aaa3056e46ed9004097dc784db94c3a97d070569
1c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita/* 2c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita * Copyright 2014 Google Inc. 3c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita * 4c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita * Use of this source code is governed by a BSD-style license that can be 5c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita * found in the LICENSE file. 6c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita */ 7c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita 8c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita#include "SkPaint.h" 9c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita#include "SkPoint.h" 10337797580de42cdb722caab4bed121311ed7d0d2halcanary#include "SkTextBlobRunIterator.h" 1132d6b876163580711a07e96d9f29c9c1490a7271fmalita#include "SkTypeface.h" 12c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita 13c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita#include "Test.h" 14c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita 15c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalitaclass TextBlobTester { 16c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalitapublic: 1751bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita // This unit test feeds an SkTextBlobBuilder various runs then checks to see if 1851bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita // the result contains the provided data and merges runs when appropriate. 1951bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita static void TestBuilder(skiatest::Reporter* reporter) { 20c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita SkTextBlobBuilder builder; 21c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita 22c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita // empty run set 2396fcdcc219d2a0d3579719b84b28bede76efba64halcanary RunBuilderTest(reporter, builder, nullptr, 0, nullptr, 0); 24c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita 2551bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita RunDef set1[] = { 26c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kDefault_Positioning, 100, 100 }, 27c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita }; 2851bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita RunBuilderTest(reporter, builder, set1, SK_ARRAY_COUNT(set1), set1, SK_ARRAY_COUNT(set1)); 29c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita 3051bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita RunDef set2[] = { 31c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kHorizontal_Positioning, 100, 100 }, 32c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita }; 3351bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita RunBuilderTest(reporter, builder, set2, SK_ARRAY_COUNT(set2), set2, SK_ARRAY_COUNT(set2)); 34c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita 3551bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita RunDef set3[] = { 36c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kFull_Positioning, 100, 100 }, 37c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita }; 3851bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita RunBuilderTest(reporter, builder, set3, SK_ARRAY_COUNT(set3), set3, SK_ARRAY_COUNT(set3)); 39c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita 4051bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita RunDef set4[] = { 41c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kDefault_Positioning, 100, 150 }, 42c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kDefault_Positioning, 100, 150 }, 43c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kDefault_Positioning, 100, 150 }, 44c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita }; 4551bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita RunBuilderTest(reporter, builder, set4, SK_ARRAY_COUNT(set4), set4, SK_ARRAY_COUNT(set4)); 46c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita 4751bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita RunDef set5[] = { 48c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kHorizontal_Positioning, 100, 150 }, 49c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kHorizontal_Positioning, 200, 150 }, 50c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kHorizontal_Positioning, 300, 250 }, 51c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita }; 5251bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita RunDef mergedSet5[] = { 53c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 256, SkTextBlob::kHorizontal_Positioning, 0, 150 }, 54c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kHorizontal_Positioning, 0, 250 }, 55c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita }; 5651bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita RunBuilderTest(reporter, builder, set5, SK_ARRAY_COUNT(set5), mergedSet5, 5751bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita SK_ARRAY_COUNT(mergedSet5)); 58c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita 5951bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita RunDef set6[] = { 60c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kFull_Positioning, 100, 100 }, 61c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kFull_Positioning, 200, 200 }, 62c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kFull_Positioning, 300, 300 }, 63c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita }; 6451bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita RunDef mergedSet6[] = { 65c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 384, SkTextBlob::kFull_Positioning, 0, 0 }, 66c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita }; 6751bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita RunBuilderTest(reporter, builder, set6, SK_ARRAY_COUNT(set6), mergedSet6, 6851bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita SK_ARRAY_COUNT(mergedSet6)); 69c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita 7051bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita RunDef set7[] = { 71c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kDefault_Positioning, 100, 150 }, 72c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kDefault_Positioning, 100, 150 }, 73c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kHorizontal_Positioning, 100, 150 }, 74c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kHorizontal_Positioning, 200, 150 }, 75c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kFull_Positioning, 400, 350 }, 76c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kFull_Positioning, 400, 350 }, 77c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kDefault_Positioning, 100, 450 }, 78c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kDefault_Positioning, 100, 450 }, 79c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kHorizontal_Positioning, 100, 550 }, 80c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kHorizontal_Positioning, 200, 650 }, 81c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kFull_Positioning, 400, 750 }, 82c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kFull_Positioning, 400, 850 }, 83c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita }; 8451bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita RunDef mergedSet7[] = { 85c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kDefault_Positioning, 100, 150 }, 86c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kDefault_Positioning, 100, 150 }, 87c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 256, SkTextBlob::kHorizontal_Positioning, 0, 150 }, 88c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 256, SkTextBlob::kFull_Positioning, 0, 0 }, 89c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kDefault_Positioning, 100, 450 }, 90c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kDefault_Positioning, 100, 450 }, 91c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kHorizontal_Positioning, 0, 550 }, 92c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 128, SkTextBlob::kHorizontal_Positioning, 0, 650 }, 93c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita { 256, SkTextBlob::kFull_Positioning, 0, 0 }, 94c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita }; 9551bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita RunBuilderTest(reporter, builder, set7, SK_ARRAY_COUNT(set7), mergedSet7, 9651bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita SK_ARRAY_COUNT(mergedSet7)); 9751bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita } 9851bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita 9951bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita // This unit test verifies blob bounds computation. 10051bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita static void TestBounds(skiatest::Reporter* reporter) { 10151bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita SkTextBlobBuilder builder; 10251bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita SkPaint font; 10351bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita font.setTextEncoding(SkPaint::kGlyphID_TextEncoding); 10451bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita 10551bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita // Explicit bounds. 10651bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita { 10737283c28aa5bea2204c18956e74f83b238d7a891fmalita sk_sp<SkTextBlob> blob(builder.make()); 1083a9a7a310c5cff72bc1c2388a496af1b82326355Florin Malita REPORTER_ASSERT(reporter, !blob); 10951bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita } 11051bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita 11151bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita { 11251bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita SkRect r1 = SkRect::MakeXYWH(10, 10, 20, 20); 11351bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita builder.allocRun(font, 16, 0, 0, &r1); 11437283c28aa5bea2204c18956e74f83b238d7a891fmalita sk_sp<SkTextBlob> blob(builder.make()); 11551bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita REPORTER_ASSERT(reporter, blob->bounds() == r1); 11651bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita } 11751bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita 11851bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita { 11951bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita SkRect r1 = SkRect::MakeXYWH(10, 10, 20, 20); 12051bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita builder.allocRunPosH(font, 16, 0, &r1); 12137283c28aa5bea2204c18956e74f83b238d7a891fmalita sk_sp<SkTextBlob> blob(builder.make()); 12251bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita REPORTER_ASSERT(reporter, blob->bounds() == r1); 12351bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita } 12451bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita 12551bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita { 12651bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita SkRect r1 = SkRect::MakeXYWH(10, 10, 20, 20); 12751bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita builder.allocRunPos(font, 16, &r1); 12837283c28aa5bea2204c18956e74f83b238d7a891fmalita sk_sp<SkTextBlob> blob(builder.make()); 12951bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita REPORTER_ASSERT(reporter, blob->bounds() == r1); 13051bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita } 13151bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita 13251bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita { 13351bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita SkRect r1 = SkRect::MakeXYWH(10, 10, 20, 20); 13451bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita SkRect r2 = SkRect::MakeXYWH(15, 20, 50, 50); 13551bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita SkRect r3 = SkRect::MakeXYWH(0, 5, 10, 5); 13651bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita 13751bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita builder.allocRun(font, 16, 0, 0, &r1); 13851bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita builder.allocRunPosH(font, 16, 0, &r2); 13951bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita builder.allocRunPos(font, 16, &r3); 14051bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita 14137283c28aa5bea2204c18956e74f83b238d7a891fmalita sk_sp<SkTextBlob> blob(builder.make()); 14251bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita REPORTER_ASSERT(reporter, blob->bounds() == SkRect::MakeXYWH(0, 5, 65, 65)); 14351bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita } 14451bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita 14551bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita { 14637283c28aa5bea2204c18956e74f83b238d7a891fmalita sk_sp<SkTextBlob> blob(builder.make()); 1473a9a7a310c5cff72bc1c2388a496af1b82326355Florin Malita REPORTER_ASSERT(reporter, !blob); 14851bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita } 14951bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita 15051bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita // Implicit bounds 1519ae8fe1c601ecb7fef9962f9eb1adf11032378e4fmalita 1529ae8fe1c601ecb7fef9962f9eb1adf11032378e4fmalita { 1539ae8fe1c601ecb7fef9962f9eb1adf11032378e4fmalita // Exercise the empty bounds path, and ensure that RunRecord-aligned pos buffers 1549ae8fe1c601ecb7fef9962f9eb1adf11032378e4fmalita // don't trigger asserts (http://crbug.com/542643). 1559ae8fe1c601ecb7fef9962f9eb1adf11032378e4fmalita SkPaint p; 1569ae8fe1c601ecb7fef9962f9eb1adf11032378e4fmalita p.setTextSize(0); 1570b01da7bca9dacdd58affe5d5433860cb3d59194fmalita p.setTextEncoding(SkPaint::kUTF8_TextEncoding); 1589ae8fe1c601ecb7fef9962f9eb1adf11032378e4fmalita 1599ae8fe1c601ecb7fef9962f9eb1adf11032378e4fmalita const char* txt = "BOOO"; 1600b01da7bca9dacdd58affe5d5433860cb3d59194fmalita const size_t txtLen = strlen(txt); 1610b01da7bca9dacdd58affe5d5433860cb3d59194fmalita const int glyphCount = p.textToGlyphs(txt, txtLen, nullptr); 1620b01da7bca9dacdd58affe5d5433860cb3d59194fmalita 1630b01da7bca9dacdd58affe5d5433860cb3d59194fmalita p.setTextEncoding(SkPaint::kGlyphID_TextEncoding); 1640b01da7bca9dacdd58affe5d5433860cb3d59194fmalita const SkTextBlobBuilder::RunBuffer& buffer = builder.allocRunPos(p, glyphCount); 1650b01da7bca9dacdd58affe5d5433860cb3d59194fmalita 1660b01da7bca9dacdd58affe5d5433860cb3d59194fmalita p.setTextEncoding(SkPaint::kUTF8_TextEncoding); 1670b01da7bca9dacdd58affe5d5433860cb3d59194fmalita p.textToGlyphs(txt, txtLen, buffer.glyphs); 1680b01da7bca9dacdd58affe5d5433860cb3d59194fmalita 1690b01da7bca9dacdd58affe5d5433860cb3d59194fmalita memset(buffer.pos, 0, sizeof(SkScalar) * glyphCount * 2); 17037283c28aa5bea2204c18956e74f83b238d7a891fmalita sk_sp<SkTextBlob> blob(builder.make()); 1719ae8fe1c601ecb7fef9962f9eb1adf11032378e4fmalita REPORTER_ASSERT(reporter, blob->bounds().isEmpty()); 1729ae8fe1c601ecb7fef9962f9eb1adf11032378e4fmalita } 173c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita } 174c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita 17532d6b876163580711a07e96d9f29c9c1490a7271fmalita // Verify that text-related properties are captured in run paints. 17632d6b876163580711a07e96d9f29c9c1490a7271fmalita static void TestPaintProps(skiatest::Reporter* reporter) { 17732d6b876163580711a07e96d9f29c9c1490a7271fmalita SkPaint font; 17832d6b876163580711a07e96d9f29c9c1490a7271fmalita font.setTextEncoding(SkPaint::kGlyphID_TextEncoding); 17932d6b876163580711a07e96d9f29c9c1490a7271fmalita 18032d6b876163580711a07e96d9f29c9c1490a7271fmalita // Kitchen sink font. 18132d6b876163580711a07e96d9f29c9c1490a7271fmalita font.setTextSize(42); 18232d6b876163580711a07e96d9f29c9c1490a7271fmalita font.setTextScaleX(4.2f); 18313b9c95295f4c5732e34574789e721a6bc08f7b4bungeman font.setTypeface(SkTypeface::MakeDefault()); 18432d6b876163580711a07e96d9f29c9c1490a7271fmalita font.setTextSkewX(0.42f); 18532d6b876163580711a07e96d9f29c9c1490a7271fmalita font.setTextAlign(SkPaint::kCenter_Align); 18632d6b876163580711a07e96d9f29c9c1490a7271fmalita font.setHinting(SkPaint::kFull_Hinting); 18732d6b876163580711a07e96d9f29c9c1490a7271fmalita font.setAntiAlias(true); 18832d6b876163580711a07e96d9f29c9c1490a7271fmalita font.setFakeBoldText(true); 18932d6b876163580711a07e96d9f29c9c1490a7271fmalita font.setLinearText(true); 19032d6b876163580711a07e96d9f29c9c1490a7271fmalita font.setSubpixelText(true); 19132d6b876163580711a07e96d9f29c9c1490a7271fmalita font.setDevKernText(true); 19232d6b876163580711a07e96d9f29c9c1490a7271fmalita font.setLCDRenderText(true); 19332d6b876163580711a07e96d9f29c9c1490a7271fmalita font.setEmbeddedBitmapText(true); 19432d6b876163580711a07e96d9f29c9c1490a7271fmalita font.setAutohinted(true); 19532d6b876163580711a07e96d9f29c9c1490a7271fmalita font.setVerticalText(true); 19632d6b876163580711a07e96d9f29c9c1490a7271fmalita font.setFlags(font.getFlags() | SkPaint::kGenA8FromLCD_Flag); 19732d6b876163580711a07e96d9f29c9c1490a7271fmalita 19832d6b876163580711a07e96d9f29c9c1490a7271fmalita // Ensure we didn't pick default values by mistake. 19932d6b876163580711a07e96d9f29c9c1490a7271fmalita SkPaint defaultPaint; 20032d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, defaultPaint.getTextSize() != font.getTextSize()); 20132d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, defaultPaint.getTextScaleX() != font.getTextScaleX()); 20232d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, defaultPaint.getTypeface() != font.getTypeface()); 20332d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, defaultPaint.getTextSkewX() != font.getTextSkewX()); 20432d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, defaultPaint.getTextAlign() != font.getTextAlign()); 20532d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, defaultPaint.getHinting() != font.getHinting()); 20632d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, defaultPaint.isAntiAlias() != font.isAntiAlias()); 20732d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, defaultPaint.isFakeBoldText() != font.isFakeBoldText()); 20832d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, defaultPaint.isLinearText() != font.isLinearText()); 20932d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, defaultPaint.isSubpixelText() != font.isSubpixelText()); 21032d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, defaultPaint.isDevKernText() != font.isDevKernText()); 21132d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, defaultPaint.isLCDRenderText() != font.isLCDRenderText()); 21232d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, defaultPaint.isEmbeddedBitmapText() != font.isEmbeddedBitmapText()); 21332d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, defaultPaint.isAutohinted() != font.isAutohinted()); 21432d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, defaultPaint.isVerticalText() != font.isVerticalText()); 21532d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, (defaultPaint.getFlags() & SkPaint::kGenA8FromLCD_Flag) != 21632d6b876163580711a07e96d9f29c9c1490a7271fmalita (font.getFlags() & SkPaint::kGenA8FromLCD_Flag)); 21732d6b876163580711a07e96d9f29c9c1490a7271fmalita 21832d6b876163580711a07e96d9f29c9c1490a7271fmalita SkTextBlobBuilder builder; 21932d6b876163580711a07e96d9f29c9c1490a7271fmalita AddRun(font, 1, SkTextBlob::kDefault_Positioning, SkPoint::Make(0, 0), builder); 22032d6b876163580711a07e96d9f29c9c1490a7271fmalita AddRun(font, 1, SkTextBlob::kHorizontal_Positioning, SkPoint::Make(0, 0), builder); 22132d6b876163580711a07e96d9f29c9c1490a7271fmalita AddRun(font, 1, SkTextBlob::kFull_Positioning, SkPoint::Make(0, 0), builder); 22237283c28aa5bea2204c18956e74f83b238d7a891fmalita sk_sp<SkTextBlob> blob(builder.make()); 22332d6b876163580711a07e96d9f29c9c1490a7271fmalita 22437283c28aa5bea2204c18956e74f83b238d7a891fmalita SkTextBlobRunIterator it(blob.get()); 22532d6b876163580711a07e96d9f29c9c1490a7271fmalita while (!it.done()) { 22632d6b876163580711a07e96d9f29c9c1490a7271fmalita SkPaint paint; 22732d6b876163580711a07e96d9f29c9c1490a7271fmalita it.applyFontToPaint(&paint); 22832d6b876163580711a07e96d9f29c9c1490a7271fmalita 22932d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, paint.getTextSize() == font.getTextSize()); 23032d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, paint.getTextScaleX() == font.getTextScaleX()); 23132d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, paint.getTypeface() == font.getTypeface()); 23232d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, paint.getTextSkewX() == font.getTextSkewX()); 23332d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, paint.getTextAlign() == font.getTextAlign()); 23432d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, paint.getHinting() == font.getHinting()); 23532d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, paint.isAntiAlias() == font.isAntiAlias()); 23632d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, paint.isFakeBoldText() == font.isFakeBoldText()); 23732d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, paint.isLinearText() == font.isLinearText()); 23832d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, paint.isSubpixelText() == font.isSubpixelText()); 23932d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, paint.isDevKernText() == font.isDevKernText()); 24032d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, paint.isLCDRenderText() == font.isLCDRenderText()); 24132d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, paint.isEmbeddedBitmapText() == font.isEmbeddedBitmapText()); 24232d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, paint.isAutohinted() == font.isAutohinted()); 24332d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, paint.isVerticalText() == font.isVerticalText()); 24432d6b876163580711a07e96d9f29c9c1490a7271fmalita REPORTER_ASSERT(reporter, (paint.getFlags() & SkPaint::kGenA8FromLCD_Flag) == 24532d6b876163580711a07e96d9f29c9c1490a7271fmalita (font.getFlags() & SkPaint::kGenA8FromLCD_Flag)); 24632d6b876163580711a07e96d9f29c9c1490a7271fmalita 24732d6b876163580711a07e96d9f29c9c1490a7271fmalita it.next(); 24832d6b876163580711a07e96d9f29c9c1490a7271fmalita } 24932d6b876163580711a07e96d9f29c9c1490a7271fmalita 25032d6b876163580711a07e96d9f29c9c1490a7271fmalita } 25132d6b876163580711a07e96d9f29c9c1490a7271fmalita 252c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalitaprivate: 253c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita struct RunDef { 254c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita unsigned count; 255c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita SkTextBlob::GlyphPositioning pos; 256c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita SkScalar x, y; 257c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita }; 258c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita 25951bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita static void RunBuilderTest(skiatest::Reporter* reporter, SkTextBlobBuilder& builder, 260c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita const RunDef in[], unsigned inCount, 261c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita const RunDef out[], unsigned outCount) { 26251bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita SkPaint font; 26351bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita font.setTextEncoding(SkPaint::kGlyphID_TextEncoding); 26451bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita 265c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita unsigned glyphCount = 0; 266c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita unsigned posCount = 0; 267c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita 268c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita for (unsigned i = 0; i < inCount; ++i) { 26951bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita AddRun(font, in[i].count, in[i].pos, SkPoint::Make(in[i].x, in[i].y), builder); 270c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita glyphCount += in[i].count; 271c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita posCount += in[i].count * in[i].pos; 272c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita } 273c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita 27437283c28aa5bea2204c18956e74f83b238d7a891fmalita sk_sp<SkTextBlob> blob(builder.make()); 2753a9a7a310c5cff72bc1c2388a496af1b82326355Florin Malita REPORTER_ASSERT(reporter, (inCount > 0) == SkToBool(blob)); 2763a9a7a310c5cff72bc1c2388a496af1b82326355Florin Malita if (!blob) { 2773a9a7a310c5cff72bc1c2388a496af1b82326355Florin Malita return; 2783a9a7a310c5cff72bc1c2388a496af1b82326355Florin Malita } 279c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita 28037283c28aa5bea2204c18956e74f83b238d7a891fmalita SkTextBlobRunIterator it(blob.get()); 281c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita for (unsigned i = 0; i < outCount; ++i) { 282c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita REPORTER_ASSERT(reporter, !it.done()); 283c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita REPORTER_ASSERT(reporter, out[i].pos == it.positioning()); 284c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita REPORTER_ASSERT(reporter, out[i].count == it.glyphCount()); 285c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita if (SkTextBlob::kDefault_Positioning == out[i].pos) { 286c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita REPORTER_ASSERT(reporter, out[i].x == it.offset().x()); 287c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita REPORTER_ASSERT(reporter, out[i].y == it.offset().y()); 288c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita } else if (SkTextBlob::kHorizontal_Positioning == out[i].pos) { 289c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita REPORTER_ASSERT(reporter, out[i].y == it.offset().y()); 290c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita } 291c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita 292c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita for (unsigned k = 0; k < it.glyphCount(); ++k) { 293c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita REPORTER_ASSERT(reporter, k % 128 == it.glyphs()[k]); 294c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita if (SkTextBlob::kHorizontal_Positioning == it.positioning()) { 295c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita REPORTER_ASSERT(reporter, SkIntToScalar(k % 128) == it.pos()[k]); 296c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita } else if (SkTextBlob::kFull_Positioning == it.positioning()) { 297c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita REPORTER_ASSERT(reporter, SkIntToScalar(k % 128) == it.pos()[k * 2]); 298c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita REPORTER_ASSERT(reporter, -SkIntToScalar(k % 128) == it.pos()[k * 2 + 1]); 299c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita } 300c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita } 301c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita 302c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita it.next(); 303c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita } 304c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita 305c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita REPORTER_ASSERT(reporter, it.done()); 306c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita } 307c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita 30851bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita static void AddRun(const SkPaint& font, int count, SkTextBlob::GlyphPositioning pos, 309c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita const SkPoint& offset, SkTextBlobBuilder& builder, 31096fcdcc219d2a0d3579719b84b28bede76efba64halcanary const SkRect* bounds = nullptr) { 311c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita switch (pos) { 312c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita case SkTextBlob::kDefault_Positioning: { 313c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita const SkTextBlobBuilder::RunBuffer& rb = builder.allocRun(font, count, offset.x(), 314c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita offset.y(), bounds); 315c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita for (int i = 0; i < count; ++i) { 316c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita rb.glyphs[i] = i; 317c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita } 318c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita } break; 319c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita case SkTextBlob::kHorizontal_Positioning: { 320c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita const SkTextBlobBuilder::RunBuffer& rb = builder.allocRunPosH(font, count, offset.y(), 321c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita bounds); 322c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita for (int i = 0; i < count; ++i) { 323c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita rb.glyphs[i] = i; 324c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita rb.pos[i] = SkIntToScalar(i); 325c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita } 326c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita } break; 327c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita case SkTextBlob::kFull_Positioning: { 328c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita const SkTextBlobBuilder::RunBuffer& rb = builder.allocRunPos(font, count, bounds); 329c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita for (int i = 0; i < count; ++i) { 330c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita rb.glyphs[i] = i; 331c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita rb.pos[i * 2] = SkIntToScalar(i); 332c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita rb.pos[i * 2 + 1] = -SkIntToScalar(i); 333c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita } 334c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita } break; 335c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita default: 336c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita SkFAIL("unhandled positioning value"); 337c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita } 338c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita } 339c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita}; 340c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita 341c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalitaDEF_TEST(TextBlob_builder, reporter) { 34251bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita TextBlobTester::TestBuilder(reporter); 34351bf9573b8b875aec47cbeb9f4649f58bcbf56b7fmalita TextBlobTester::TestBounds(reporter); 344c6765d69e3aceaa316fe2d2ef00a7f0d138def2ffmalita} 34532d6b876163580711a07e96d9f29c9c1490a7271fmalita 34632d6b876163580711a07e96d9f29c9c1490a7271fmalitaDEF_TEST(TextBlob_paint, reporter) { 34732d6b876163580711a07e96d9f29c9c1490a7271fmalita TextBlobTester::TestPaintProps(reporter); 34832d6b876163580711a07e96d9f29c9c1490a7271fmalita} 3494f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary 3504f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanaryDEF_TEST(TextBlob_extended, reporter) { 3514f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary SkTextBlobBuilder textBlobBuilder; 3524f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary SkPaint paint; 3534f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary const char text1[] = "Foo"; 3544f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary const char text2[] = "Bar"; 3554f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary 3564f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary int glyphCount = paint.textToGlyphs(text1, strlen(text1), nullptr); 3574f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary SkAutoTMalloc<uint16_t> glyphs(glyphCount); 3584f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary (void)paint.textToGlyphs(text1, strlen(text1), glyphs.get()); 3594f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); 3604f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary 3614f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary auto run = textBlobBuilder.allocRunText( 3624f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary paint, glyphCount, 0, 0, SkToInt(strlen(text2)), SkString(), nullptr); 3634f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary memcpy(run.glyphs, glyphs.get(), sizeof(uint16_t) * glyphCount); 3644f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary memcpy(run.utf8text, text2, strlen(text2)); 3654f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary for (int i = 0; i < glyphCount; ++i) { 3664f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary run.clusters[i] = SkTMin(SkToU32(i), SkToU32(strlen(text2))); 3674f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary } 36837283c28aa5bea2204c18956e74f83b238d7a891fmalita sk_sp<SkTextBlob> blob(textBlobBuilder.make()); 3694f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary REPORTER_ASSERT(reporter, blob); 3704f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary 3714f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary for (SkTextBlobRunIterator it(blob.get()); !it.done(); it.next()) { 3724f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary REPORTER_ASSERT(reporter, it.glyphCount() == (uint32_t)glyphCount); 3734f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary for (uint32_t i = 0; i < it.glyphCount(); ++i) { 3744f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary REPORTER_ASSERT(reporter, it.glyphs()[i] == glyphs[i]); 3754f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary } 3764f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary REPORTER_ASSERT(reporter, SkTextBlob::kDefault_Positioning == it.positioning()); 3774f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary REPORTER_ASSERT(reporter, (SkPoint{0.0f, 0.0f}) == it.offset()); 3784f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary REPORTER_ASSERT(reporter, it.textSize() > 0); 3794f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary REPORTER_ASSERT(reporter, it.clusters()); 3804f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary for (uint32_t i = 0; i < it.glyphCount(); ++i) { 3814f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary REPORTER_ASSERT(reporter, i == it.clusters()[i]); 3824f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary } 3834f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary REPORTER_ASSERT(reporter, 0 == strncmp(text2, it.text(), it.textSize())); 3844f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary } 3854f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary} 386b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed 387b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed/////////////////////////////////////////////////////////////////////////////////////////////////// 388b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed#include "SkCanvas.h" 389b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed#include "SkSurface.h" 390b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed#include "SkTDArray.h" 391b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed 392b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reedstatic void add_run(SkTextBlobBuilder* builder, const char text[], SkScalar x, SkScalar y, 393b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed sk_sp<SkTypeface> tf) { 394b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed SkPaint paint; 395b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed paint.setAntiAlias(true); 396b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed paint.setSubpixelText(true); 397b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed paint.setTextSize(16); 398b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed paint.setTypeface(tf); 399b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed 400b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed int glyphCount = paint.textToGlyphs(text, strlen(text), nullptr); 401b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed 402b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); 403b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed SkTextBlobBuilder::RunBuffer buffer = builder->allocRun(paint, glyphCount, x, y); 404b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed 405b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed paint.setTextEncoding(SkPaint::kUTF8_TextEncoding); 406b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed (void)paint.textToGlyphs(text, strlen(text), buffer.glyphs); 407b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed} 408b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed 409b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reedstatic sk_sp<SkImage> render(const SkTextBlob* blob) { 410b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed auto surf = SkSurface::MakeRasterN32Premul(SkScalarRoundToInt(blob->bounds().width()), 411b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed SkScalarRoundToInt(blob->bounds().height())); 4127e49d534d71d3e7b053fe6f23dfe018ddbceb45bMike Reed if (!surf) { 4137e49d534d71d3e7b053fe6f23dfe018ddbceb45bMike Reed return nullptr; // bounds are empty? 4147e49d534d71d3e7b053fe6f23dfe018ddbceb45bMike Reed } 415b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed surf->getCanvas()->clear(SK_ColorWHITE); 416b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed surf->getCanvas()->drawTextBlob(blob, -blob->bounds().left(), -blob->bounds().top(), SkPaint()); 417b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed return surf->makeImageSnapshot(); 418b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed} 419b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed 420b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed/* 421b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed * Build a blob with more than one typeface. 422b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed * Draw it into an offscreen, 423b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed * then serialize and deserialize, 424b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed * Then draw the new instance and assert it draws the same as the original. 425b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed */ 426b99beddc7a0f6003d6dd88119e7f2734fc508322Mike ReedDEF_TEST(TextBlob_serialize, reporter) { 427b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed SkTextBlobBuilder builder; 428b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed 429b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed sk_sp<SkTypeface> tf0; 430b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed sk_sp<SkTypeface> tf1 = SkTypeface::MakeFromName("Times", SkFontStyle()); 431b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed 432b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed add_run(&builder, "Hello", 10, 20, tf0); 433b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed add_run(&builder, "World", 10, 40, tf1); 434b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed sk_sp<SkTextBlob> blob0 = builder.make(); 435b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed 436b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed SkTDArray<SkTypeface*> array; 437aaa3056e46ed9004097dc784db94c3a97d070569Mike Reed sk_sp<SkData> data = blob0->serialize([](SkTypeface* tf, void* ctx) { 438aaa3056e46ed9004097dc784db94c3a97d070569Mike Reed auto array = (SkTDArray<SkTypeface*>*)ctx; 439aaa3056e46ed9004097dc784db94c3a97d070569Mike Reed if (array->find(tf) < 0) { 440aaa3056e46ed9004097dc784db94c3a97d070569Mike Reed *array->append() = tf; 441b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed } 442aaa3056e46ed9004097dc784db94c3a97d070569Mike Reed }, &array); 443b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed REPORTER_ASSERT(reporter, array.count() > 0); 444b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed 445b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed sk_sp<SkTextBlob> blob1 = SkTextBlob::Deserialize(data->data(), data->size(), 446aaa3056e46ed9004097dc784db94c3a97d070569Mike Reed [](uint32_t uniqueID, void* ctx) { 447aaa3056e46ed9004097dc784db94c3a97d070569Mike Reed auto array = (SkTDArray<SkTypeface*>*)ctx; 448aaa3056e46ed9004097dc784db94c3a97d070569Mike Reed for (int i = 0; i < array->count(); ++i) { 449aaa3056e46ed9004097dc784db94c3a97d070569Mike Reed if ((*array)[i]->uniqueID() == uniqueID) { 450aaa3056e46ed9004097dc784db94c3a97d070569Mike Reed return sk_ref_sp((*array)[i]); 451b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed } 452b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed } 453aaa3056e46ed9004097dc784db94c3a97d070569Mike Reed SkASSERT(false); 454b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed return sk_sp<SkTypeface>(nullptr); 455aaa3056e46ed9004097dc784db94c3a97d070569Mike Reed }, &array); 456b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed 4577e49d534d71d3e7b053fe6f23dfe018ddbceb45bMike Reed sk_sp<SkImage> img0 = render(blob0.get()); 4587e49d534d71d3e7b053fe6f23dfe018ddbceb45bMike Reed sk_sp<SkImage> img1 = render(blob1.get()); 4597e49d534d71d3e7b053fe6f23dfe018ddbceb45bMike Reed if (img0 && img1) { 4607e49d534d71d3e7b053fe6f23dfe018ddbceb45bMike Reed REPORTER_ASSERT(reporter, img0->width() == img1->width()); 4617e49d534d71d3e7b053fe6f23dfe018ddbceb45bMike Reed REPORTER_ASSERT(reporter, img0->height() == img1->height()); 4627e49d534d71d3e7b053fe6f23dfe018ddbceb45bMike Reed 4636409f84fc3ae5e3b2df9eb0a900957fce404ad5cMike Reed sk_sp<SkData> enc0 = img0->encodeToData(); 4646409f84fc3ae5e3b2df9eb0a900957fce404ad5cMike Reed sk_sp<SkData> enc1 = img1->encodeToData(); 4657e49d534d71d3e7b053fe6f23dfe018ddbceb45bMike Reed REPORTER_ASSERT(reporter, enc0->equals(enc1.get())); 4667e49d534d71d3e7b053fe6f23dfe018ddbceb45bMike Reed if (false) { // in case you want to actually see the images... 4677e49d534d71d3e7b053fe6f23dfe018ddbceb45bMike Reed SkFILEWStream("textblob_serialize_img0.png").write(enc0->data(), enc0->size()); 4687e49d534d71d3e7b053fe6f23dfe018ddbceb45bMike Reed SkFILEWStream("textblob_serialize_img1.png").write(enc1->data(), enc1->size()); 4697e49d534d71d3e7b053fe6f23dfe018ddbceb45bMike Reed } 470b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed } 471b99beddc7a0f6003d6dd88119e7f2734fc508322Mike Reed} 472