1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2020 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include <vector> 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "include/utils/SkNoDrawCanvas.h" 11cb93a386Sopenharmony_ci#include "modules/svg/src/SkSVGTextPriv.h" 12cb93a386Sopenharmony_ci#include "tests/Test.h" 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_ciDEF_TEST(Svg_Text_PosProvider, r) { 15cb93a386Sopenharmony_ci const auto L = [](float x) { return SkSVGLength(x); }; 16cb93a386Sopenharmony_ci const float N = SkSVGTextContext::PosAttrs()[SkSVGTextContext::PosAttrs::kX]; 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_ci static const struct PosTestDesc { 19cb93a386Sopenharmony_ci size_t offseta; 20cb93a386Sopenharmony_ci std::vector<SkSVGLength> xa, ya; 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_ci size_t offsetb; 23cb93a386Sopenharmony_ci std::vector<SkSVGLength> xb, yb; 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ci std::vector<SkPoint> expected; 26cb93a386Sopenharmony_ci } gTests[] = { 27cb93a386Sopenharmony_ci { 28cb93a386Sopenharmony_ci 0, {}, {}, 29cb93a386Sopenharmony_ci 0, {}, {}, 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ci { {N,N} } 32cb93a386Sopenharmony_ci }, 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ci { 35cb93a386Sopenharmony_ci 0, { L(1) }, {}, 36cb93a386Sopenharmony_ci 0, { }, {}, 37cb93a386Sopenharmony_ci 38cb93a386Sopenharmony_ci { {1,N}, {N,N} } 39cb93a386Sopenharmony_ci }, 40cb93a386Sopenharmony_ci { 41cb93a386Sopenharmony_ci 0, { }, {}, 42cb93a386Sopenharmony_ci 0, { L(10) }, {}, 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_ci { {10,N}, {N,N} } 45cb93a386Sopenharmony_ci }, 46cb93a386Sopenharmony_ci { 47cb93a386Sopenharmony_ci 0, { L( 1) }, {}, 48cb93a386Sopenharmony_ci 0, { L(10) }, {}, 49cb93a386Sopenharmony_ci 50cb93a386Sopenharmony_ci { {10,N}, {N,N} } 51cb93a386Sopenharmony_ci }, 52cb93a386Sopenharmony_ci { 53cb93a386Sopenharmony_ci 0, { L( 1), L(2) }, {}, 54cb93a386Sopenharmony_ci 0, { L(10) }, {}, 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci { {10,N}, {2,N}, {N,N} } 57cb93a386Sopenharmony_ci }, 58cb93a386Sopenharmony_ci { 59cb93a386Sopenharmony_ci 0, { L(1), L( 2) }, {}, 60cb93a386Sopenharmony_ci 1, { L(20) }, {}, 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ci { {1,N}, {20,N}, {N,N} } 63cb93a386Sopenharmony_ci }, 64cb93a386Sopenharmony_ci { 65cb93a386Sopenharmony_ci 0, { L(1), L( 2), L(3) }, {}, 66cb93a386Sopenharmony_ci 1, { L(20) }, {}, 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ci { {1,N}, {20,N}, {3,N}, {N,N} } 69cb93a386Sopenharmony_ci }, 70cb93a386Sopenharmony_ci { 71cb93a386Sopenharmony_ci 0, { L(1), L(2), L( 3) }, {}, 72cb93a386Sopenharmony_ci 2, { L(30) }, {}, 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ci { {1,N}, {2,N}, {30,N}, {N,N} } 75cb93a386Sopenharmony_ci }, 76cb93a386Sopenharmony_ci { 77cb93a386Sopenharmony_ci 0, { L(1) }, {}, 78cb93a386Sopenharmony_ci 2, { L(30) }, {}, 79cb93a386Sopenharmony_ci 80cb93a386Sopenharmony_ci { {1,N}, {N,N}, {30,N}, {N,N} } 81cb93a386Sopenharmony_ci }, 82cb93a386Sopenharmony_ci 83cb93a386Sopenharmony_ci 84cb93a386Sopenharmony_ci { 85cb93a386Sopenharmony_ci 0, {}, { L(4) }, 86cb93a386Sopenharmony_ci 0, {}, { }, 87cb93a386Sopenharmony_ci 88cb93a386Sopenharmony_ci { {N,4}, {N,N} } 89cb93a386Sopenharmony_ci }, 90cb93a386Sopenharmony_ci { 91cb93a386Sopenharmony_ci 0, {}, { }, 92cb93a386Sopenharmony_ci 0, {}, { L(40) }, 93cb93a386Sopenharmony_ci 94cb93a386Sopenharmony_ci { {N,40}, {N,N} } 95cb93a386Sopenharmony_ci }, 96cb93a386Sopenharmony_ci { 97cb93a386Sopenharmony_ci 0, {}, { L( 4) }, 98cb93a386Sopenharmony_ci 0, {}, { L(40) }, 99cb93a386Sopenharmony_ci 100cb93a386Sopenharmony_ci { {N,40}, {N,N} } 101cb93a386Sopenharmony_ci }, 102cb93a386Sopenharmony_ci { 103cb93a386Sopenharmony_ci 0, {}, { L( 4), L(5) }, 104cb93a386Sopenharmony_ci 0, {}, { L(40) }, 105cb93a386Sopenharmony_ci 106cb93a386Sopenharmony_ci { {N,40}, {N,5}, {N,N} } 107cb93a386Sopenharmony_ci }, 108cb93a386Sopenharmony_ci { 109cb93a386Sopenharmony_ci 0, {}, { L(4), L( 5) }, 110cb93a386Sopenharmony_ci 1, {}, { L(50) }, 111cb93a386Sopenharmony_ci 112cb93a386Sopenharmony_ci { {N,4}, {N,50}, {N,N} } 113cb93a386Sopenharmony_ci }, 114cb93a386Sopenharmony_ci { 115cb93a386Sopenharmony_ci 0, {}, { L(4), L( 5), L(6) }, 116cb93a386Sopenharmony_ci 1, {}, { L(50) }, 117cb93a386Sopenharmony_ci 118cb93a386Sopenharmony_ci { {N,4}, {N,50}, {N,6}, {N,N} } 119cb93a386Sopenharmony_ci }, 120cb93a386Sopenharmony_ci { 121cb93a386Sopenharmony_ci 0, {}, { L(4), L(5), L( 6) }, 122cb93a386Sopenharmony_ci 2, {}, { L(60) }, 123cb93a386Sopenharmony_ci 124cb93a386Sopenharmony_ci { {N,4}, {N,5}, {N,60}, {N,N} } 125cb93a386Sopenharmony_ci }, 126cb93a386Sopenharmony_ci { 127cb93a386Sopenharmony_ci 0, {}, { L(4) }, 128cb93a386Sopenharmony_ci 2, {}, { L(60) }, 129cb93a386Sopenharmony_ci 130cb93a386Sopenharmony_ci { {N,4}, {N,N}, {N,60}, {N,N} } 131cb93a386Sopenharmony_ci }, 132cb93a386Sopenharmony_ci 133cb93a386Sopenharmony_ci { 134cb93a386Sopenharmony_ci 0, { L( 1), L(2)}, { L( 4) }, 135cb93a386Sopenharmony_ci 0, { L(10) }, { L(40), L(50) }, 136cb93a386Sopenharmony_ci 137cb93a386Sopenharmony_ci { {10,40}, {2,50}, {N,N} } 138cb93a386Sopenharmony_ci }, 139cb93a386Sopenharmony_ci { 140cb93a386Sopenharmony_ci 0, { L(1), L( 2), L(3) }, { L(4), L( 5) }, 141cb93a386Sopenharmony_ci 1, { L(20) }, { L(50), L(60) }, 142cb93a386Sopenharmony_ci 143cb93a386Sopenharmony_ci { {1,4}, {20,50}, {3,60}, {N,N} } 144cb93a386Sopenharmony_ci }, 145cb93a386Sopenharmony_ci }; 146cb93a386Sopenharmony_ci 147cb93a386Sopenharmony_ci const SkSVGTextContext::ShapedTextCallback mock_cb = 148cb93a386Sopenharmony_ci [](const SkSVGRenderContext&, const sk_sp<SkTextBlob>&, const SkPaint*, const SkPaint*) {}; 149cb93a386Sopenharmony_ci 150cb93a386Sopenharmony_ci auto test = [&](const PosTestDesc& tst) { 151cb93a386Sopenharmony_ci auto a = SkSVGText::Make(); 152cb93a386Sopenharmony_ci auto b = SkSVGTSpan::Make(); 153cb93a386Sopenharmony_ci a->appendChild(b); 154cb93a386Sopenharmony_ci 155cb93a386Sopenharmony_ci a->setX(tst.xa); 156cb93a386Sopenharmony_ci a->setY(tst.ya); 157cb93a386Sopenharmony_ci b->setX(tst.xb); 158cb93a386Sopenharmony_ci b->setY(tst.yb); 159cb93a386Sopenharmony_ci 160cb93a386Sopenharmony_ci const SkSVGIDMapper mapper; 161cb93a386Sopenharmony_ci const SkSVGLengthContext lctx({0,0}); 162cb93a386Sopenharmony_ci const SkSVGPresentationContext pctx; 163cb93a386Sopenharmony_ci SkNoDrawCanvas canvas(0, 0); 164cb93a386Sopenharmony_ci sk_sp<SkFontMgr> fmgr; 165cb93a386Sopenharmony_ci sk_sp<skresources::ResourceProvider> rp; 166cb93a386Sopenharmony_ci const SkSVGRenderContext ctx(&canvas, fmgr, rp, mapper, lctx, pctx, {nullptr, nullptr}); 167cb93a386Sopenharmony_ci 168cb93a386Sopenharmony_ci SkSVGTextContext tctx(ctx, mock_cb); 169cb93a386Sopenharmony_ci SkSVGTextContext::ScopedPosResolver pa(*a, lctx, &tctx, tst.offseta); 170cb93a386Sopenharmony_ci SkSVGTextContext::ScopedPosResolver pb(*b, lctx, &tctx, tst.offsetb); 171cb93a386Sopenharmony_ci 172cb93a386Sopenharmony_ci for (size_t i = 0; i < tst.expected.size(); ++i) { 173cb93a386Sopenharmony_ci const auto& exp = tst.expected[i]; 174cb93a386Sopenharmony_ci auto pos = i >= tst.offsetb ? pb.resolve(i) : pa.resolve(i); 175cb93a386Sopenharmony_ci 176cb93a386Sopenharmony_ci REPORTER_ASSERT(r, pos[SkSVGTextContext::PosAttrs::kX] == exp.fX); 177cb93a386Sopenharmony_ci REPORTER_ASSERT(r, pos[SkSVGTextContext::PosAttrs::kY] == exp.fY); 178cb93a386Sopenharmony_ci } 179cb93a386Sopenharmony_ci }; 180cb93a386Sopenharmony_ci 181cb93a386Sopenharmony_ci for (const auto& tst : gTests) { 182cb93a386Sopenharmony_ci test(tst); 183cb93a386Sopenharmony_ci } 184cb93a386Sopenharmony_ci} 185