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