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