utc: increase coverage SwEngine
[platform/core/graphics/tizenvg.git] / test / testSwEngine.cpp
1 /*
2  * Copyright (c) 2021 Samsung Electronics Co., Ltd. All rights reserved.
3
4  * Permission is hereby granted, free of charge, to any person obtaining a copy
5  * of this software and associated documentation files (the "Software"), to deal
6  * in the Software without restriction, including without limitation the rights
7  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8  * copies of the Software, and to permit persons to whom the Software is
9  * furnished to do so, subject to the following conditions:
10
11  * The above copyright notice and this permission notice shall be included in all
12  * copies or substantial portions of the Software.
13
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20  * SOFTWARE.
21  */
22
23 #include <thorvg.h>
24 #include "catch.hpp"
25
26 using namespace tvg;
27
28
29 TEST_CASE("Basic draw", "[tvgSwEngine]")
30 {
31     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
32
33     auto canvas = SwCanvas::gen();
34     REQUIRE(canvas);
35
36     uint32_t buffer[100*100];
37     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
38
39     //Arc Line
40     auto shape1 = tvg::Shape::gen();
41     REQUIRE(shape1);
42
43     REQUIRE(shape1->appendArc(150, 150, 80, 10, 180, false) == Result::Success);
44     REQUIRE(shape1->stroke(255, 255, 255, 255) == Result::Success);
45     REQUIRE(shape1->stroke(2) == Result::Success);
46     REQUIRE(canvas->push(move(shape1)) == Result::Success);
47
48     //Cubic Line
49     auto shape2 = tvg::Shape::gen();
50     REQUIRE(shape2);
51
52     REQUIRE(shape2->moveTo(50, 25) == Result::Success);
53     REQUIRE(shape2->cubicTo(62, 25, 75, 38, 75, 50) == Result::Success);
54     REQUIRE(shape2->close() == Result::Success);
55     REQUIRE(shape2->stroke(1) == Result::Success);
56     REQUIRE(canvas->push(move(shape2)) == Result::Success);
57
58     //Draw
59     REQUIRE(canvas->draw() == Result::Success);
60     REQUIRE(canvas->sync() == Result::Success);
61
62     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
63 }
64
65
66 TEST_CASE("Rect Draw", "[tvgSwEngine]")
67 {
68     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
69
70     auto canvas = SwCanvas::gen();
71     REQUIRE(canvas);
72
73     uint32_t buffer[100*100];
74     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
75
76     //Basic shapes and masking
77     auto basicShape = tvg::Shape::gen();
78     REQUIRE(basicShape);
79     auto basicMask = tvg::Shape::gen();
80     REQUIRE(basicMask);
81     REQUIRE(basicShape->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
82     REQUIRE(basicMask->appendRect(10, 10, 30, 30, 0, 0) == Result::Success);
83     REQUIRE(basicShape->fill(255, 255, 255, 255) == Result::Success);
84
85     auto basicShape2 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
86     REQUIRE(basicShape2);
87     auto basicMask2 = std::unique_ptr<Shape>(static_cast<Shape*>(basicMask->duplicate()));
88     REQUIRE(basicMask2);
89
90     auto basicShape3 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
91     REQUIRE(basicShape3);
92     auto basicMask3 = std::unique_ptr<Shape>(static_cast<Shape*>(basicMask->duplicate()));
93     REQUIRE(basicMask3);
94
95     auto basicShape4 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
96     REQUIRE(basicShape4);
97
98     REQUIRE(basicShape->composite(move(basicMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
99     REQUIRE(canvas->push(move(basicShape)) == Result::Success);
100
101     REQUIRE(basicShape2->composite(move(basicMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
102     REQUIRE(canvas->push(move(basicShape2)) == Result::Success);
103
104     REQUIRE(basicShape3->composite(move(basicMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
105     REQUIRE(canvas->push(move(basicShape3)) == Result::Success);
106
107     REQUIRE(canvas->push(move(basicShape4)) == Result::Success);
108
109     //Draw
110     REQUIRE(canvas->draw() == Result::Success);
111     REQUIRE(canvas->sync() == Result::Success);
112
113     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
114 }
115
116
117 TEST_CASE("RLE Rect Draw", "[tvgSwEngine]")
118 {
119     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
120
121     auto canvas = SwCanvas::gen();
122     REQUIRE(canvas);
123
124     uint32_t buffer[100*100];
125     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
126
127     //Basic shapes and masking
128     auto basicShape = tvg::Shape::gen();
129     REQUIRE(basicShape);
130     auto basicMask = tvg::Shape::gen();
131     REQUIRE(basicMask);
132     REQUIRE(basicShape->appendRect(0, 0, 50, 50, 50, 50) == Result::Success);
133     REQUIRE(basicMask->appendRect(10, 10, 30, 30, 0, 0) == Result::Success);
134     REQUIRE(basicShape->fill(255, 255, 255, 100) == Result::Success);
135
136     auto basicShape2 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
137     REQUIRE(basicShape2);
138     auto basicMask2 = std::unique_ptr<Shape>(static_cast<Shape*>(basicMask->duplicate()));
139     REQUIRE(basicMask2);
140
141     auto basicShape3 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
142     REQUIRE(basicShape3);
143     auto basicMask3 = std::unique_ptr<Shape>(static_cast<Shape*>(basicMask->duplicate()));
144     REQUIRE(basicMask3);
145
146     auto basicShape4 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
147     REQUIRE(basicShape4);
148
149     REQUIRE(basicShape->composite(move(basicMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
150     REQUIRE(canvas->push(move(basicShape)) == Result::Success);
151
152     REQUIRE(basicShape2->composite(move(basicMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
153     REQUIRE(canvas->push(move(basicShape2)) == Result::Success);
154
155     REQUIRE(basicShape3->composite(move(basicMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
156     REQUIRE(canvas->push(move(basicShape3)) == Result::Success);
157
158     REQUIRE(canvas->push(move(basicShape4)) == Result::Success);
159
160     //Draw
161     REQUIRE(canvas->draw() == Result::Success);
162     REQUIRE(canvas->sync() == Result::Success);
163
164     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
165 }
166
167
168 TEST_CASE("Filling Draw", "[tvgSwEngine]")
169 {
170     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
171
172     auto canvas = SwCanvas::gen();
173     REQUIRE(canvas);
174
175     uint32_t buffer[100*100];
176     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
177
178     //Fill
179     auto linearFill = LinearGradient::gen();
180     REQUIRE(linearFill);
181
182     auto radialFill = RadialGradient::gen();
183     REQUIRE(radialFill);
184
185     Fill::ColorStop cs[4] = {
186         {0.0f, 0, 0, 0, 0},
187         {0.2f, 50, 25, 50, 25},
188         {0.5f, 100, 100, 100, 125},
189         {1.0f, 255, 255, 255, 255}
190     };
191     REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
192     REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
193     REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
194     REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
195
196     //Filled Shapes
197     auto shape3 = tvg::Shape::gen();
198     REQUIRE(shape3);
199     auto shape4 = tvg::Shape::gen();
200     REQUIRE(shape4);
201     REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
202     REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
203
204     REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
205     REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
206
207     REQUIRE(canvas->push(move(shape3)) == Result::Success);
208     REQUIRE(canvas->push(move(shape4)) == Result::Success);
209
210     //Draw
211     REQUIRE(canvas->draw() == Result::Success);
212     REQUIRE(canvas->sync() == Result::Success);
213
214     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
215 }
216
217
218 TEST_CASE("Filling Opaque Draw", "[tvgSwEngine]")
219 {
220     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
221
222     auto canvas = SwCanvas::gen();
223     REQUIRE(canvas);
224
225     uint32_t buffer[100*100];
226     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
227
228     //Fill
229     auto linearFill = LinearGradient::gen();
230     REQUIRE(linearFill);
231
232     auto radialFill = RadialGradient::gen();
233     REQUIRE(radialFill);
234
235     Fill::ColorStop cs[4] = {
236         {0.0f, 0, 0, 0, 255},
237         {0.2f, 50, 25, 50, 255},
238         {0.5f, 100, 100, 100, 255},
239         {1.0f, 255, 255, 255, 255}
240     };
241     REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
242     REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
243     REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
244     REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
245
246     //Filled Shapes
247     auto shape3 = tvg::Shape::gen();
248     REQUIRE(shape3);
249     auto shape4 = tvg::Shape::gen();
250     REQUIRE(shape4);
251     REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
252     REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
253
254     REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
255     REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
256
257     REQUIRE(canvas->push(move(shape3)) == Result::Success);
258     REQUIRE(canvas->push(move(shape4)) == Result::Success);
259
260     //Draw
261     REQUIRE(canvas->draw() == Result::Success);
262     REQUIRE(canvas->sync() == Result::Success);
263
264     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
265 }
266
267
268 TEST_CASE("Filling AlphaMask", "[tvgSwEngine]")
269 {
270     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
271
272     auto canvas = SwCanvas::gen();
273     REQUIRE(canvas);
274
275     uint32_t buffer[100*100];
276     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
277
278     //Fill
279     auto linearFill = LinearGradient::gen();
280     REQUIRE(linearFill);
281
282     auto radialFill = RadialGradient::gen();
283     REQUIRE(radialFill);
284
285     Fill::ColorStop cs[4] = {
286         {0.0f, 0, 0, 0, 0},
287         {0.2f, 50, 25, 50, 25},
288         {0.5f, 100, 100, 100, 125},
289         {1.0f, 255, 255, 255, 255}
290     };
291     REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
292     REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
293     REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
294     REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
295
296     //Mask
297     auto mask = tvg::Shape::gen();
298     REQUIRE(mask);
299     REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
300
301     //Filled Shapes
302     auto shape3 = tvg::Shape::gen();
303     REQUIRE(shape3);
304     auto shape4 = tvg::Shape::gen();
305     REQUIRE(shape4);
306     REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
307     REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
308
309     REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
310     REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
311
312     //Scene
313     auto scene = tvg::Scene::gen();
314     REQUIRE(scene);
315     REQUIRE(scene->push(move(shape3)) == Result::Success);
316     REQUIRE(scene->push(move(shape4)) == Result::Success);
317     REQUIRE(scene->composite(move(mask), tvg::CompositeMethod::AlphaMask) == Result::Success);
318     REQUIRE(canvas->push(move(scene)) == Result::Success);
319
320     //Draw
321     REQUIRE(canvas->draw() == Result::Success);
322     REQUIRE(canvas->sync() == Result::Success);
323
324     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
325 }
326
327
328 TEST_CASE("Filling InvAlphaMask", "[tvgSwEngine]")
329 {
330     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
331
332     auto canvas = SwCanvas::gen();
333     REQUIRE(canvas);
334
335     uint32_t buffer[100*100];
336     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
337
338     //Fill
339     auto linearFill = LinearGradient::gen();
340     REQUIRE(linearFill);
341
342     auto radialFill = RadialGradient::gen();
343     REQUIRE(radialFill);
344
345     Fill::ColorStop cs[4] = {
346         {0.0f, 0, 0, 0, 0},
347         {0.2f, 50, 25, 50, 25},
348         {0.5f, 100, 100, 100, 125},
349         {1.0f, 255, 255, 255, 255}
350     };
351     REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
352     REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
353     REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
354     REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
355
356     //Mask
357     auto mask = tvg::Shape::gen();
358     REQUIRE(mask);
359     REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
360
361     //Filled Shapes
362     auto shape3 = tvg::Shape::gen();
363     REQUIRE(shape3);
364     auto shape4 = tvg::Shape::gen();
365     REQUIRE(shape4);
366     REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
367     REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
368
369     REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
370     REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
371
372     //Scene
373     auto scene = tvg::Scene::gen();
374     REQUIRE(scene);
375     REQUIRE(scene->push(move(shape3)) == Result::Success);
376     REQUIRE(scene->push(move(shape4)) == Result::Success);
377     REQUIRE(scene->composite(move(mask), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
378     REQUIRE(canvas->push(move(scene)) == Result::Success);
379
380     //Draw
381     REQUIRE(canvas->draw() == Result::Success);
382     REQUIRE(canvas->sync() == Result::Success);
383
384     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
385 }
386
387
388 TEST_CASE("Filling ClipPath", "[tvgSwEngine]")
389 {
390     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
391
392     auto canvas = SwCanvas::gen();
393     REQUIRE(canvas);
394
395     uint32_t buffer[100*100];
396     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
397
398     //Fill
399     auto linearFill = LinearGradient::gen();
400     REQUIRE(linearFill);
401
402     auto radialFill = RadialGradient::gen();
403     REQUIRE(radialFill);
404
405     Fill::ColorStop cs[4] = {
406         {0.0f, 0, 0, 0, 0},
407         {0.2f, 50, 25, 50, 25},
408         {0.5f, 100, 100, 100, 125},
409         {1.0f, 255, 255, 255, 255}
410     };
411     REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
412     REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
413     REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
414     REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
415
416     //Mask
417     auto mask = tvg::Shape::gen();
418     REQUIRE(mask);
419     REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
420
421     //Filled Shapes
422     auto shape3 = tvg::Shape::gen();
423     REQUIRE(shape3);
424     auto shape4 = tvg::Shape::gen();
425     REQUIRE(shape4);
426     REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
427     REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
428
429     REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
430     REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
431
432     //Scene
433     auto scene = tvg::Scene::gen();
434     REQUIRE(scene);
435     REQUIRE(scene->push(move(shape3)) == Result::Success);
436     REQUIRE(scene->push(move(shape4)) == Result::Success);
437     REQUIRE(scene->composite(move(mask), tvg::CompositeMethod::ClipPath) == Result::Success);
438     REQUIRE(canvas->push(move(scene)) == Result::Success);
439
440     //Draw
441     REQUIRE(canvas->draw() == Result::Success);
442     REQUIRE(canvas->sync() == Result::Success);
443
444     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
445 }
446
447
448 TEST_CASE("RLE Filling Draw", "[tvgSwEngine]")
449 {
450     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
451
452     auto canvas = SwCanvas::gen();
453     REQUIRE(canvas);
454
455     uint32_t buffer[100*100];
456     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
457
458     //Fill
459     auto linearFill = LinearGradient::gen();
460     REQUIRE(linearFill);
461
462     auto radialFill = RadialGradient::gen();
463     REQUIRE(radialFill);
464
465     Fill::ColorStop cs[4] = {
466         {0.0f, 0, 0, 0, 0},
467         {0.2f, 50, 25, 50, 25},
468         {0.5f, 100, 100, 100, 125},
469         {1.0f, 255, 255, 255, 255}
470     };
471     REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
472     REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
473     REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
474     REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
475
476     //Filled Shapes
477     auto shape3 = tvg::Shape::gen();
478     REQUIRE(shape3);
479     auto shape4 = tvg::Shape::gen();
480     REQUIRE(shape4);
481     REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
482     REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
483
484     REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
485     REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
486
487     REQUIRE(canvas->push(move(shape3)) == Result::Success);
488     REQUIRE(canvas->push(move(shape4)) == Result::Success);
489
490     //Draw
491     REQUIRE(canvas->draw() == Result::Success);
492     REQUIRE(canvas->sync() == Result::Success);
493
494     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
495 }
496
497
498 TEST_CASE("RLE Filling Opaque Draw", "[tvgSwEngine]")
499 {
500     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
501
502     auto canvas = SwCanvas::gen();
503     REQUIRE(canvas);
504
505     uint32_t buffer[100*100];
506     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
507
508     //Fill
509     auto linearFill = LinearGradient::gen();
510     REQUIRE(linearFill);
511
512     auto radialFill = RadialGradient::gen();
513     REQUIRE(radialFill);
514
515     Fill::ColorStop cs[4] = {
516         {0.0f, 0, 0, 0, 255},
517         {0.2f, 50, 25, 50, 255},
518         {0.5f, 100, 100, 100, 255},
519         {1.0f, 255, 255, 255, 255}
520     };
521     REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
522     REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
523     REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
524     REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
525
526     //Filled Shapes
527     auto shape3 = tvg::Shape::gen();
528     REQUIRE(shape3);
529     auto shape4 = tvg::Shape::gen();
530     REQUIRE(shape4);
531     REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
532     REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
533
534     REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
535     REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
536
537     REQUIRE(canvas->push(move(shape3)) == Result::Success);
538     REQUIRE(canvas->push(move(shape4)) == Result::Success);
539
540     //Draw
541     REQUIRE(canvas->draw() == Result::Success);
542     REQUIRE(canvas->sync() == Result::Success);
543
544     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
545 }
546
547
548 TEST_CASE("RLE Filling AlphaMask", "[tvgSwEngine]")
549 {
550     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
551
552     auto canvas = SwCanvas::gen();
553     REQUIRE(canvas);
554
555     uint32_t buffer[100*100];
556     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
557
558     //Fill
559     auto linearFill = LinearGradient::gen();
560     REQUIRE(linearFill);
561
562     auto radialFill = RadialGradient::gen();
563     REQUIRE(radialFill);
564
565     Fill::ColorStop cs[4] = {
566         {0.0f, 0, 0, 0, 0},
567         {0.2f, 50, 25, 50, 25},
568         {0.5f, 100, 100, 100, 125},
569         {1.0f, 255, 255, 255, 255}
570     };
571     REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
572     REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
573     REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
574     REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
575
576     //Mask
577     auto mask = tvg::Shape::gen();
578     REQUIRE(mask);
579     REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
580
581     //Filled Shapes
582     auto shape3 = tvg::Shape::gen();
583     REQUIRE(shape3);
584     auto shape4 = tvg::Shape::gen();
585     REQUIRE(shape4);
586     REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
587     REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
588
589     REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
590     REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
591
592     //Scene
593     auto scene = tvg::Scene::gen();
594     REQUIRE(scene);
595     REQUIRE(scene->push(move(shape3)) == Result::Success);
596     REQUIRE(scene->push(move(shape4)) == Result::Success);
597     REQUIRE(scene->composite(move(mask), tvg::CompositeMethod::AlphaMask) == Result::Success);
598     REQUIRE(canvas->push(move(scene)) == Result::Success);
599
600     //Draw
601     REQUIRE(canvas->draw() == Result::Success);
602     REQUIRE(canvas->sync() == Result::Success);
603
604     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
605 }
606
607
608 TEST_CASE("RLE Filling InvAlphaMask", "[tvgSwEngine]")
609 {
610     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
611
612     auto canvas = SwCanvas::gen();
613     REQUIRE(canvas);
614
615     uint32_t buffer[100*100];
616     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
617
618     //Fill
619     auto linearFill = LinearGradient::gen();
620     REQUIRE(linearFill);
621
622     auto radialFill = RadialGradient::gen();
623     REQUIRE(radialFill);
624
625     Fill::ColorStop cs[4] = {
626         {0.0f, 0, 0, 0, 0},
627         {0.2f, 50, 25, 50, 25},
628         {0.5f, 100, 100, 100, 125},
629         {1.0f, 255, 255, 255, 255}
630     };
631     REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
632     REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
633     REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
634     REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
635
636     //Mask
637     auto mask = tvg::Shape::gen();
638     REQUIRE(mask);
639     REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
640
641     //Filled Shapes
642     auto shape3 = tvg::Shape::gen();
643     REQUIRE(shape3);
644     auto shape4 = tvg::Shape::gen();
645     REQUIRE(shape4);
646     REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
647     REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
648
649     REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
650     REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
651
652     //Scene
653     auto scene = tvg::Scene::gen();
654     REQUIRE(scene);
655     REQUIRE(scene->push(move(shape3)) == Result::Success);
656     REQUIRE(scene->push(move(shape4)) == Result::Success);
657     REQUIRE(scene->composite(move(mask), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
658     REQUIRE(canvas->push(move(scene)) == Result::Success);
659
660     //Draw
661     REQUIRE(canvas->draw() == Result::Success);
662     REQUIRE(canvas->sync() == Result::Success);
663
664     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
665 }
666
667
668 TEST_CASE("RLE Filling ClipPath", "[tvgSwEngine]")
669 {
670     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
671
672     auto canvas = SwCanvas::gen();
673     REQUIRE(canvas);
674
675     uint32_t buffer[100*100];
676     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
677
678     //Fill
679     auto linearFill = LinearGradient::gen();
680     REQUIRE(linearFill);
681
682     auto radialFill = RadialGradient::gen();
683     REQUIRE(radialFill);
684
685     Fill::ColorStop cs[4] = {
686         {0.0f, 0, 0, 0, 0},
687         {0.2f, 50, 25, 50, 25},
688         {0.5f, 100, 100, 100, 125},
689         {1.0f, 255, 255, 255, 255}
690     };
691     REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
692     REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
693     REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
694     REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
695
696     //Mask
697     auto mask = tvg::Shape::gen();
698     REQUIRE(mask);
699     REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
700
701     //Filled Shapes
702     auto shape3 = tvg::Shape::gen();
703     REQUIRE(shape3);
704     auto shape4 = tvg::Shape::gen();
705     REQUIRE(shape4);
706     REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
707     REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
708
709     REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
710     REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
711
712     //Scene
713     auto scene = tvg::Scene::gen();
714     REQUIRE(scene);
715     REQUIRE(scene->push(move(shape3)) == Result::Success);
716     REQUIRE(scene->push(move(shape4)) == Result::Success);
717     REQUIRE(scene->composite(move(mask), tvg::CompositeMethod::ClipPath) == Result::Success);
718     REQUIRE(canvas->push(move(scene)) == Result::Success);
719
720     //Draw
721     REQUIRE(canvas->draw() == Result::Success);
722     REQUIRE(canvas->sync() == Result::Success);
723
724     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
725 }