test SwEngine: raster image functions included into the unit tests
[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("Image 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
77     //Not transformed images
78     auto basicPicture = Picture::gen();
79     REQUIRE(basicPicture);
80     REQUIRE(basicPicture->load(TEST_DIR"/test.png") == Result::Success);
81     auto rectMask = tvg::Shape::gen();
82     REQUIRE(rectMask);
83     REQUIRE(rectMask->appendRect(10, 10, 30, 30, 0, 0) == Result::Success);
84     auto rleMask = tvg::Shape::gen();
85     REQUIRE(rleMask);
86     REQUIRE(rleMask->appendRect(0, 10, 20, 30, 5, 5) == Result::Success);
87
88     // Rect images
89     auto basicPicture2 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
90     REQUIRE(basicPicture2);
91     auto rectMask2 = std::unique_ptr<Shape>(static_cast<Shape*>(rectMask->duplicate()));
92     REQUIRE(rectMask2);
93
94     auto basicPicture3 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
95     REQUIRE(basicPicture3);
96     auto rectMask3 = std::unique_ptr<Shape>(static_cast<Shape*>(rectMask->duplicate()));
97     REQUIRE(rectMask3);
98
99     auto basicPicture4 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
100     REQUIRE(basicPicture4);
101
102     // Rle images
103     auto basicPicture5 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
104     REQUIRE(basicPicture5);
105
106     auto basicPicture6 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
107     REQUIRE(basicPicture6);
108     auto rleMask6 = std::unique_ptr<Shape>(static_cast<Shape*>(rleMask->duplicate()));
109     REQUIRE(rleMask6);
110
111     // Rect
112     REQUIRE(basicPicture->composite(move(rectMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
113     REQUIRE(canvas->push(move(basicPicture)) == Result::Success);
114
115     REQUIRE(basicPicture2->composite(move(rectMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
116     REQUIRE(canvas->push(move(basicPicture2)) == Result::Success);
117
118     REQUIRE(basicPicture3->composite(move(rectMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
119     REQUIRE(canvas->push(move(basicPicture3)) == Result::Success);
120
121     REQUIRE(basicPicture4->opacity(100) == Result::Success);
122     REQUIRE(canvas->push(move(basicPicture4)) == Result::Success);
123
124     // Rle 
125     REQUIRE(basicPicture5->composite(move(rleMask), tvg::CompositeMethod::ClipPath) == Result::Success);
126     REQUIRE(canvas->push(move(basicPicture5)) == Result::Success);
127
128     REQUIRE(basicPicture6->composite(move(rleMask6), tvg::CompositeMethod::ClipPath) == Result::Success);
129     REQUIRE(basicPicture6->opacity(100) == Result::Success);
130     REQUIRE(canvas->push(move(basicPicture6)) == Result::Success);
131
132
133     // Transformed images
134     basicPicture = Picture::gen();
135     REQUIRE(basicPicture);
136     REQUIRE(basicPicture->load(TEST_DIR"/test.png") == Result::Success);
137     REQUIRE(basicPicture->rotate(45) == Result::Success);
138     rectMask = tvg::Shape::gen();
139     REQUIRE(rectMask);
140     REQUIRE(rectMask->appendRect(10, 10, 30, 30, 0, 0) == Result::Success);
141     rleMask = tvg::Shape::gen();
142     REQUIRE(rleMask);
143     REQUIRE(rleMask->appendRect(0, 10, 20, 30, 5, 5) == Result::Success);
144
145     // Rect images
146     basicPicture2 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
147     REQUIRE(basicPicture2);
148     rectMask2 = std::unique_ptr<Shape>(static_cast<Shape*>(rectMask->duplicate()));
149     REQUIRE(rectMask2);
150
151     basicPicture3 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
152     REQUIRE(basicPicture3);
153     rectMask3 = std::unique_ptr<Shape>(static_cast<Shape*>(rectMask->duplicate()));
154     REQUIRE(rectMask3);
155
156     basicPicture4 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
157     REQUIRE(basicPicture4);
158
159     // Rle images
160     basicPicture5 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
161     REQUIRE(basicPicture5);
162
163     basicPicture6 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
164     REQUIRE(basicPicture6);
165     rleMask6 = std::unique_ptr<Shape>(static_cast<Shape*>(rleMask->duplicate()));
166     REQUIRE(rleMask6);
167
168     // Rect
169     REQUIRE(basicPicture->composite(move(rectMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
170     REQUIRE(canvas->push(move(basicPicture)) == Result::Success);
171
172     REQUIRE(basicPicture2->composite(move(rectMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
173     REQUIRE(canvas->push(move(basicPicture2)) == Result::Success);
174
175     REQUIRE(basicPicture3->composite(move(rectMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
176     REQUIRE(canvas->push(move(basicPicture3)) == Result::Success);
177
178     REQUIRE(basicPicture4->opacity(100) == Result::Success);
179     REQUIRE(canvas->push(move(basicPicture4)) == Result::Success);
180
181     // Rle 
182     REQUIRE(basicPicture5->composite(move(rleMask), tvg::CompositeMethod::ClipPath) == Result::Success);
183     REQUIRE(canvas->push(move(basicPicture5)) == Result::Success);
184
185     REQUIRE(basicPicture6->composite(move(rleMask6), tvg::CompositeMethod::ClipPath) == Result::Success);
186     REQUIRE(basicPicture6->opacity(100) == Result::Success);
187     REQUIRE(canvas->push(move(basicPicture6)) == Result::Success);
188
189
190     // Upscaled images
191     basicPicture = Picture::gen();
192     REQUIRE(basicPicture);
193     REQUIRE(basicPicture->load(TEST_DIR"/test.png") == Result::Success);
194     REQUIRE(basicPicture->scale(2) == Result::Success);
195     rectMask = tvg::Shape::gen();
196     REQUIRE(rectMask);
197     REQUIRE(rectMask->appendRect(10, 10, 30, 30, 0, 0) == Result::Success);
198     rleMask = tvg::Shape::gen();
199     REQUIRE(rleMask);
200     REQUIRE(rleMask->appendRect(0, 10, 20, 30, 5, 5) == Result::Success);
201
202     // Rect images
203     basicPicture2 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
204     REQUIRE(basicPicture2);
205     rectMask2 = std::unique_ptr<Shape>(static_cast<Shape*>(rectMask->duplicate()));
206     REQUIRE(rectMask2);
207
208     basicPicture3 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
209     REQUIRE(basicPicture3);
210     rectMask3 = std::unique_ptr<Shape>(static_cast<Shape*>(rectMask->duplicate()));
211     REQUIRE(rectMask3);
212
213     basicPicture4 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
214     REQUIRE(basicPicture4);
215
216     // Rle images
217     basicPicture5 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
218     REQUIRE(basicPicture5);
219
220     basicPicture6 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
221     REQUIRE(basicPicture6);
222     rleMask6 = std::unique_ptr<Shape>(static_cast<Shape*>(rleMask->duplicate()));
223     REQUIRE(rleMask6); 
224
225     // Rect
226     REQUIRE(basicPicture->composite(move(rectMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
227     REQUIRE(canvas->push(move(basicPicture)) == Result::Success);
228
229     REQUIRE(basicPicture2->composite(move(rectMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
230     REQUIRE(canvas->push(move(basicPicture2)) == Result::Success);
231
232     REQUIRE(basicPicture3->composite(move(rectMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
233     REQUIRE(canvas->push(move(basicPicture3)) == Result::Success);
234
235     REQUIRE(basicPicture4->opacity(100) == Result::Success);
236     REQUIRE(canvas->push(move(basicPicture4)) == Result::Success);
237
238     // Rle 
239     REQUIRE(basicPicture5->composite(move(rleMask), tvg::CompositeMethod::ClipPath) == Result::Success);
240     REQUIRE(canvas->push(move(basicPicture5)) == Result::Success);
241
242     REQUIRE(basicPicture6->composite(move(rleMask6), tvg::CompositeMethod::ClipPath) == Result::Success);
243     REQUIRE(basicPicture6->opacity(100) == Result::Success);
244     REQUIRE(canvas->push(move(basicPicture6)) == Result::Success);
245
246
247     //Draw
248     REQUIRE(canvas->draw() == Result::Success);
249     REQUIRE(canvas->sync() == Result::Success);
250
251     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
252 }
253
254
255 TEST_CASE("Rect Draw", "[tvgSwEngine]")
256 {
257     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
258
259     auto canvas = SwCanvas::gen();
260     REQUIRE(canvas);
261
262     uint32_t buffer[100*100];
263     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
264
265     //Basic shapes and masking
266     auto basicShape = tvg::Shape::gen();
267     REQUIRE(basicShape);
268     auto basicMask = tvg::Shape::gen();
269     REQUIRE(basicMask);
270     REQUIRE(basicShape->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
271     REQUIRE(basicMask->appendRect(10, 10, 30, 30, 0, 0) == Result::Success);
272     REQUIRE(basicShape->fill(255, 255, 255, 255) == Result::Success);
273
274     auto basicShape2 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
275     REQUIRE(basicShape2);
276     auto basicMask2 = std::unique_ptr<Shape>(static_cast<Shape*>(basicMask->duplicate()));
277     REQUIRE(basicMask2);
278
279     auto basicShape3 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
280     REQUIRE(basicShape3);
281     auto basicMask3 = std::unique_ptr<Shape>(static_cast<Shape*>(basicMask->duplicate()));
282     REQUIRE(basicMask3);
283
284     auto basicShape4 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
285     REQUIRE(basicShape4);
286
287     REQUIRE(basicShape->composite(move(basicMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
288     REQUIRE(canvas->push(move(basicShape)) == Result::Success);
289
290     REQUIRE(basicShape2->composite(move(basicMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
291     REQUIRE(canvas->push(move(basicShape2)) == Result::Success);
292
293     REQUIRE(basicShape3->composite(move(basicMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
294     REQUIRE(canvas->push(move(basicShape3)) == Result::Success);
295
296     REQUIRE(canvas->push(move(basicShape4)) == Result::Success);
297
298     //Draw
299     REQUIRE(canvas->draw() == Result::Success);
300     REQUIRE(canvas->sync() == Result::Success);
301
302     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
303 }
304
305
306 TEST_CASE("RLE Rect Draw", "[tvgSwEngine]")
307 {
308     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
309
310     auto canvas = SwCanvas::gen();
311     REQUIRE(canvas);
312
313     uint32_t buffer[100*100];
314     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
315
316     //Basic shapes and masking
317     auto basicShape = tvg::Shape::gen();
318     REQUIRE(basicShape);
319     auto basicMask = tvg::Shape::gen();
320     REQUIRE(basicMask);
321     REQUIRE(basicShape->appendRect(0, 0, 50, 50, 50, 50) == Result::Success);
322     REQUIRE(basicMask->appendRect(10, 10, 30, 30, 0, 0) == Result::Success);
323     REQUIRE(basicShape->fill(255, 255, 255, 100) == Result::Success);
324
325     auto basicShape2 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
326     REQUIRE(basicShape2);
327     auto basicMask2 = std::unique_ptr<Shape>(static_cast<Shape*>(basicMask->duplicate()));
328     REQUIRE(basicMask2);
329
330     auto basicShape3 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
331     REQUIRE(basicShape3);
332     auto basicMask3 = std::unique_ptr<Shape>(static_cast<Shape*>(basicMask->duplicate()));
333     REQUIRE(basicMask3);
334
335     auto basicShape4 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
336     REQUIRE(basicShape4);
337
338     REQUIRE(basicShape->composite(move(basicMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
339     REQUIRE(canvas->push(move(basicShape)) == Result::Success);
340
341     REQUIRE(basicShape2->composite(move(basicMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
342     REQUIRE(canvas->push(move(basicShape2)) == Result::Success);
343
344     REQUIRE(basicShape3->composite(move(basicMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
345     REQUIRE(canvas->push(move(basicShape3)) == Result::Success);
346
347     REQUIRE(canvas->push(move(basicShape4)) == Result::Success);
348
349     //Draw
350     REQUIRE(canvas->draw() == Result::Success);
351     REQUIRE(canvas->sync() == Result::Success);
352
353     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
354 }
355
356
357 TEST_CASE("Filling Draw", "[tvgSwEngine]")
358 {
359     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
360
361     auto canvas = SwCanvas::gen();
362     REQUIRE(canvas);
363
364     uint32_t buffer[100*100];
365     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
366
367     //Fill
368     auto linearFill = LinearGradient::gen();
369     REQUIRE(linearFill);
370
371     auto radialFill = RadialGradient::gen();
372     REQUIRE(radialFill);
373
374     Fill::ColorStop cs[4] = {
375         {0.0f, 0, 0, 0, 0},
376         {0.2f, 50, 25, 50, 25},
377         {0.5f, 100, 100, 100, 125},
378         {1.0f, 255, 255, 255, 255}
379     };
380     REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
381     REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
382     REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
383     REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
384
385     //Filled Shapes
386     auto shape3 = tvg::Shape::gen();
387     REQUIRE(shape3);
388     auto shape4 = tvg::Shape::gen();
389     REQUIRE(shape4);
390     REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
391     REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
392
393     REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
394     REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
395
396     REQUIRE(canvas->push(move(shape3)) == Result::Success);
397     REQUIRE(canvas->push(move(shape4)) == Result::Success);
398
399     //Draw
400     REQUIRE(canvas->draw() == Result::Success);
401     REQUIRE(canvas->sync() == Result::Success);
402
403     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
404 }
405
406
407 TEST_CASE("Filling Opaque Draw", "[tvgSwEngine]")
408 {
409     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
410
411     auto canvas = SwCanvas::gen();
412     REQUIRE(canvas);
413
414     uint32_t buffer[100*100];
415     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
416
417     //Fill
418     auto linearFill = LinearGradient::gen();
419     REQUIRE(linearFill);
420
421     auto radialFill = RadialGradient::gen();
422     REQUIRE(radialFill);
423
424     Fill::ColorStop cs[4] = {
425         {0.0f, 0, 0, 0, 255},
426         {0.2f, 50, 25, 50, 255},
427         {0.5f, 100, 100, 100, 255},
428         {1.0f, 255, 255, 255, 255}
429     };
430     REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
431     REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
432     REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
433     REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
434
435     //Filled Shapes
436     auto shape3 = tvg::Shape::gen();
437     REQUIRE(shape3);
438     auto shape4 = tvg::Shape::gen();
439     REQUIRE(shape4);
440     REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
441     REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
442
443     REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
444     REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
445
446     REQUIRE(canvas->push(move(shape3)) == Result::Success);
447     REQUIRE(canvas->push(move(shape4)) == Result::Success);
448
449     //Draw
450     REQUIRE(canvas->draw() == Result::Success);
451     REQUIRE(canvas->sync() == Result::Success);
452
453     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
454 }
455
456
457 TEST_CASE("Filling AlphaMask", "[tvgSwEngine]")
458 {
459     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
460
461     auto canvas = SwCanvas::gen();
462     REQUIRE(canvas);
463
464     uint32_t buffer[100*100];
465     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
466
467     //Fill
468     auto linearFill = LinearGradient::gen();
469     REQUIRE(linearFill);
470
471     auto radialFill = RadialGradient::gen();
472     REQUIRE(radialFill);
473
474     Fill::ColorStop cs[4] = {
475         {0.0f, 0, 0, 0, 0},
476         {0.2f, 50, 25, 50, 25},
477         {0.5f, 100, 100, 100, 125},
478         {1.0f, 255, 255, 255, 255}
479     };
480     REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
481     REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
482     REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
483     REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
484
485     //Mask
486     auto mask = tvg::Shape::gen();
487     REQUIRE(mask);
488     REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
489
490     //Filled Shapes
491     auto shape3 = tvg::Shape::gen();
492     REQUIRE(shape3);
493     auto shape4 = tvg::Shape::gen();
494     REQUIRE(shape4);
495     REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
496     REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
497
498     REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
499     REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
500
501     //Scene
502     auto scene = tvg::Scene::gen();
503     REQUIRE(scene);
504     REQUIRE(scene->push(move(shape3)) == Result::Success);
505     REQUIRE(scene->push(move(shape4)) == Result::Success);
506     REQUIRE(scene->composite(move(mask), tvg::CompositeMethod::AlphaMask) == Result::Success);
507     REQUIRE(canvas->push(move(scene)) == Result::Success);
508
509     //Draw
510     REQUIRE(canvas->draw() == Result::Success);
511     REQUIRE(canvas->sync() == Result::Success);
512
513     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
514 }
515
516
517 TEST_CASE("Filling InvAlphaMask", "[tvgSwEngine]")
518 {
519     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
520
521     auto canvas = SwCanvas::gen();
522     REQUIRE(canvas);
523
524     uint32_t buffer[100*100];
525     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
526
527     //Fill
528     auto linearFill = LinearGradient::gen();
529     REQUIRE(linearFill);
530
531     auto radialFill = RadialGradient::gen();
532     REQUIRE(radialFill);
533
534     Fill::ColorStop cs[4] = {
535         {0.0f, 0, 0, 0, 0},
536         {0.2f, 50, 25, 50, 25},
537         {0.5f, 100, 100, 100, 125},
538         {1.0f, 255, 255, 255, 255}
539     };
540     REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
541     REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
542     REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
543     REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
544
545     //Mask
546     auto mask = tvg::Shape::gen();
547     REQUIRE(mask);
548     REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
549
550     //Filled Shapes
551     auto shape3 = tvg::Shape::gen();
552     REQUIRE(shape3);
553     auto shape4 = tvg::Shape::gen();
554     REQUIRE(shape4);
555     REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
556     REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
557
558     REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
559     REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
560
561     //Scene
562     auto scene = tvg::Scene::gen();
563     REQUIRE(scene);
564     REQUIRE(scene->push(move(shape3)) == Result::Success);
565     REQUIRE(scene->push(move(shape4)) == Result::Success);
566     REQUIRE(scene->composite(move(mask), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
567     REQUIRE(canvas->push(move(scene)) == Result::Success);
568
569     //Draw
570     REQUIRE(canvas->draw() == Result::Success);
571     REQUIRE(canvas->sync() == Result::Success);
572
573     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
574 }
575
576
577 TEST_CASE("Filling ClipPath", "[tvgSwEngine]")
578 {
579     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
580
581     auto canvas = SwCanvas::gen();
582     REQUIRE(canvas);
583
584     uint32_t buffer[100*100];
585     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
586
587     //Fill
588     auto linearFill = LinearGradient::gen();
589     REQUIRE(linearFill);
590
591     auto radialFill = RadialGradient::gen();
592     REQUIRE(radialFill);
593
594     Fill::ColorStop cs[4] = {
595         {0.0f, 0, 0, 0, 0},
596         {0.2f, 50, 25, 50, 25},
597         {0.5f, 100, 100, 100, 125},
598         {1.0f, 255, 255, 255, 255}
599     };
600     REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
601     REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
602     REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
603     REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
604
605     //Mask
606     auto mask = tvg::Shape::gen();
607     REQUIRE(mask);
608     REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
609
610     //Filled Shapes
611     auto shape3 = tvg::Shape::gen();
612     REQUIRE(shape3);
613     auto shape4 = tvg::Shape::gen();
614     REQUIRE(shape4);
615     REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
616     REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
617
618     REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
619     REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
620
621     //Scene
622     auto scene = tvg::Scene::gen();
623     REQUIRE(scene);
624     REQUIRE(scene->push(move(shape3)) == Result::Success);
625     REQUIRE(scene->push(move(shape4)) == Result::Success);
626     REQUIRE(scene->composite(move(mask), tvg::CompositeMethod::ClipPath) == Result::Success);
627     REQUIRE(canvas->push(move(scene)) == Result::Success);
628
629     //Draw
630     REQUIRE(canvas->draw() == Result::Success);
631     REQUIRE(canvas->sync() == Result::Success);
632
633     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
634 }
635
636
637 TEST_CASE("RLE Filling Draw", "[tvgSwEngine]")
638 {
639     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
640
641     auto canvas = SwCanvas::gen();
642     REQUIRE(canvas);
643
644     uint32_t buffer[100*100];
645     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
646
647     //Fill
648     auto linearFill = LinearGradient::gen();
649     REQUIRE(linearFill);
650
651     auto radialFill = RadialGradient::gen();
652     REQUIRE(radialFill);
653
654     Fill::ColorStop cs[4] = {
655         {0.0f, 0, 0, 0, 0},
656         {0.2f, 50, 25, 50, 25},
657         {0.5f, 100, 100, 100, 125},
658         {1.0f, 255, 255, 255, 255}
659     };
660     REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
661     REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
662     REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
663     REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
664
665     //Filled Shapes
666     auto shape3 = tvg::Shape::gen();
667     REQUIRE(shape3);
668     auto shape4 = tvg::Shape::gen();
669     REQUIRE(shape4);
670     REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
671     REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
672
673     REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
674     REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
675
676     REQUIRE(canvas->push(move(shape3)) == Result::Success);
677     REQUIRE(canvas->push(move(shape4)) == Result::Success);
678
679     //Draw
680     REQUIRE(canvas->draw() == Result::Success);
681     REQUIRE(canvas->sync() == Result::Success);
682
683     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
684 }
685
686
687 TEST_CASE("RLE Filling Opaque Draw", "[tvgSwEngine]")
688 {
689     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
690
691     auto canvas = SwCanvas::gen();
692     REQUIRE(canvas);
693
694     uint32_t buffer[100*100];
695     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
696
697     //Fill
698     auto linearFill = LinearGradient::gen();
699     REQUIRE(linearFill);
700
701     auto radialFill = RadialGradient::gen();
702     REQUIRE(radialFill);
703
704     Fill::ColorStop cs[4] = {
705         {0.0f, 0, 0, 0, 255},
706         {0.2f, 50, 25, 50, 255},
707         {0.5f, 100, 100, 100, 255},
708         {1.0f, 255, 255, 255, 255}
709     };
710     REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
711     REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
712     REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
713     REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
714
715     //Filled Shapes
716     auto shape3 = tvg::Shape::gen();
717     REQUIRE(shape3);
718     auto shape4 = tvg::Shape::gen();
719     REQUIRE(shape4);
720     REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
721     REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
722
723     REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
724     REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
725
726     REQUIRE(canvas->push(move(shape3)) == Result::Success);
727     REQUIRE(canvas->push(move(shape4)) == Result::Success);
728
729     //Draw
730     REQUIRE(canvas->draw() == Result::Success);
731     REQUIRE(canvas->sync() == Result::Success);
732
733     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
734 }
735
736
737 TEST_CASE("RLE Filling AlphaMask", "[tvgSwEngine]")
738 {
739     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
740
741     auto canvas = SwCanvas::gen();
742     REQUIRE(canvas);
743
744     uint32_t buffer[100*100];
745     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
746
747     //Fill
748     auto linearFill = LinearGradient::gen();
749     REQUIRE(linearFill);
750
751     auto radialFill = RadialGradient::gen();
752     REQUIRE(radialFill);
753
754     Fill::ColorStop cs[4] = {
755         {0.0f, 0, 0, 0, 0},
756         {0.2f, 50, 25, 50, 25},
757         {0.5f, 100, 100, 100, 125},
758         {1.0f, 255, 255, 255, 255}
759     };
760     REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
761     REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
762     REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
763     REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
764
765     //Mask
766     auto mask = tvg::Shape::gen();
767     REQUIRE(mask);
768     REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
769
770     //Filled Shapes
771     auto shape3 = tvg::Shape::gen();
772     REQUIRE(shape3);
773     auto shape4 = tvg::Shape::gen();
774     REQUIRE(shape4);
775     REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
776     REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
777
778     REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
779     REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
780
781     //Scene
782     auto scene = tvg::Scene::gen();
783     REQUIRE(scene);
784     REQUIRE(scene->push(move(shape3)) == Result::Success);
785     REQUIRE(scene->push(move(shape4)) == Result::Success);
786     REQUIRE(scene->composite(move(mask), tvg::CompositeMethod::AlphaMask) == Result::Success);
787     REQUIRE(canvas->push(move(scene)) == Result::Success);
788
789     //Draw
790     REQUIRE(canvas->draw() == Result::Success);
791     REQUIRE(canvas->sync() == Result::Success);
792
793     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
794 }
795
796
797 TEST_CASE("RLE Filling InvAlphaMask", "[tvgSwEngine]")
798 {
799     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
800
801     auto canvas = SwCanvas::gen();
802     REQUIRE(canvas);
803
804     uint32_t buffer[100*100];
805     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
806
807     //Fill
808     auto linearFill = LinearGradient::gen();
809     REQUIRE(linearFill);
810
811     auto radialFill = RadialGradient::gen();
812     REQUIRE(radialFill);
813
814     Fill::ColorStop cs[4] = {
815         {0.0f, 0, 0, 0, 0},
816         {0.2f, 50, 25, 50, 25},
817         {0.5f, 100, 100, 100, 125},
818         {1.0f, 255, 255, 255, 255}
819     };
820     REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
821     REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
822     REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
823     REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
824
825     //Mask
826     auto mask = tvg::Shape::gen();
827     REQUIRE(mask);
828     REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
829
830     //Filled Shapes
831     auto shape3 = tvg::Shape::gen();
832     REQUIRE(shape3);
833     auto shape4 = tvg::Shape::gen();
834     REQUIRE(shape4);
835     REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
836     REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
837
838     REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
839     REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
840
841     //Scene
842     auto scene = tvg::Scene::gen();
843     REQUIRE(scene);
844     REQUIRE(scene->push(move(shape3)) == Result::Success);
845     REQUIRE(scene->push(move(shape4)) == Result::Success);
846     REQUIRE(scene->composite(move(mask), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
847     REQUIRE(canvas->push(move(scene)) == Result::Success);
848
849     //Draw
850     REQUIRE(canvas->draw() == Result::Success);
851     REQUIRE(canvas->sync() == Result::Success);
852
853     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
854 }
855
856
857 TEST_CASE("RLE Filling ClipPath", "[tvgSwEngine]")
858 {
859     REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
860
861     auto canvas = SwCanvas::gen();
862     REQUIRE(canvas);
863
864     uint32_t buffer[100*100];
865     REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
866
867     //Fill
868     auto linearFill = LinearGradient::gen();
869     REQUIRE(linearFill);
870
871     auto radialFill = RadialGradient::gen();
872     REQUIRE(radialFill);
873
874     Fill::ColorStop cs[4] = {
875         {0.0f, 0, 0, 0, 0},
876         {0.2f, 50, 25, 50, 25},
877         {0.5f, 100, 100, 100, 125},
878         {1.0f, 255, 255, 255, 255}
879     };
880     REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
881     REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
882     REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
883     REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
884
885     //Mask
886     auto mask = tvg::Shape::gen();
887     REQUIRE(mask);
888     REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
889
890     //Filled Shapes
891     auto shape3 = tvg::Shape::gen();
892     REQUIRE(shape3);
893     auto shape4 = tvg::Shape::gen();
894     REQUIRE(shape4);
895     REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
896     REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
897
898     REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
899     REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
900
901     //Scene
902     auto scene = tvg::Scene::gen();
903     REQUIRE(scene);
904     REQUIRE(scene->push(move(shape3)) == Result::Success);
905     REQUIRE(scene->push(move(shape4)) == Result::Success);
906     REQUIRE(scene->composite(move(mask), tvg::CompositeMethod::ClipPath) == Result::Success);
907     REQUIRE(canvas->push(move(scene)) == Result::Success);
908
909     //Draw
910     REQUIRE(canvas->draw() == Result::Success);
911     REQUIRE(canvas->sync() == Result::Success);
912
913     REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
914 }