2 * Copyright (c) 2021 Samsung Electronics Co., Ltd. All rights reserved.
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:
11 * The above copyright notice and this permission notice shall be included in all
12 * copies or substantial portions of the Software.
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
29 TEST_CASE("Basic draw", "[tvgSwEngine]")
31 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
33 auto canvas = SwCanvas::gen();
36 uint32_t buffer[100*100];
37 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
40 auto shape1 = tvg::Shape::gen();
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);
49 auto shape2 = tvg::Shape::gen();
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);
59 REQUIRE(canvas->draw() == Result::Success);
60 REQUIRE(canvas->sync() == Result::Success);
62 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
66 TEST_CASE("Image Draw", "[tvgSwEngine]")
68 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
70 auto canvas = SwCanvas::gen();
73 uint32_t buffer[100*100];
74 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
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();
83 REQUIRE(rectMask->appendRect(10, 10, 30, 30, 0, 0) == Result::Success);
84 auto rleMask = tvg::Shape::gen();
86 REQUIRE(rleMask->appendRect(0, 10, 20, 30, 5, 5) == Result::Success);
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()));
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()));
99 auto basicPicture4 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
100 REQUIRE(basicPicture4);
103 auto basicPicture5 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
104 REQUIRE(basicPicture5);
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()));
112 REQUIRE(basicPicture->composite(move(rectMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
113 REQUIRE(canvas->push(move(basicPicture)) == Result::Success);
115 REQUIRE(basicPicture2->composite(move(rectMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
116 REQUIRE(canvas->push(move(basicPicture2)) == Result::Success);
118 REQUIRE(basicPicture3->composite(move(rectMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
119 REQUIRE(canvas->push(move(basicPicture3)) == Result::Success);
121 REQUIRE(basicPicture4->opacity(100) == Result::Success);
122 REQUIRE(canvas->push(move(basicPicture4)) == Result::Success);
125 REQUIRE(basicPicture5->composite(move(rleMask), tvg::CompositeMethod::ClipPath) == Result::Success);
126 REQUIRE(canvas->push(move(basicPicture5)) == Result::Success);
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);
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();
140 REQUIRE(rectMask->appendRect(10, 10, 30, 30, 0, 0) == Result::Success);
141 rleMask = tvg::Shape::gen();
143 REQUIRE(rleMask->appendRect(0, 10, 20, 30, 5, 5) == Result::Success);
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()));
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()));
156 basicPicture4 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
157 REQUIRE(basicPicture4);
160 basicPicture5 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
161 REQUIRE(basicPicture5);
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()));
169 REQUIRE(basicPicture->composite(move(rectMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
170 REQUIRE(canvas->push(move(basicPicture)) == Result::Success);
172 REQUIRE(basicPicture2->composite(move(rectMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
173 REQUIRE(canvas->push(move(basicPicture2)) == Result::Success);
175 REQUIRE(basicPicture3->composite(move(rectMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
176 REQUIRE(canvas->push(move(basicPicture3)) == Result::Success);
178 REQUIRE(basicPicture4->opacity(100) == Result::Success);
179 REQUIRE(canvas->push(move(basicPicture4)) == Result::Success);
182 REQUIRE(basicPicture5->composite(move(rleMask), tvg::CompositeMethod::ClipPath) == Result::Success);
183 REQUIRE(canvas->push(move(basicPicture5)) == Result::Success);
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);
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();
197 REQUIRE(rectMask->appendRect(10, 10, 30, 30, 0, 0) == Result::Success);
198 rleMask = tvg::Shape::gen();
200 REQUIRE(rleMask->appendRect(0, 10, 20, 30, 5, 5) == Result::Success);
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()));
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()));
213 basicPicture4 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
214 REQUIRE(basicPicture4);
217 basicPicture5 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
218 REQUIRE(basicPicture5);
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()));
226 REQUIRE(basicPicture->composite(move(rectMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
227 REQUIRE(canvas->push(move(basicPicture)) == Result::Success);
229 REQUIRE(basicPicture2->composite(move(rectMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
230 REQUIRE(canvas->push(move(basicPicture2)) == Result::Success);
232 REQUIRE(basicPicture3->composite(move(rectMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
233 REQUIRE(canvas->push(move(basicPicture3)) == Result::Success);
235 REQUIRE(basicPicture4->opacity(100) == Result::Success);
236 REQUIRE(canvas->push(move(basicPicture4)) == Result::Success);
239 REQUIRE(basicPicture5->composite(move(rleMask), tvg::CompositeMethod::ClipPath) == Result::Success);
240 REQUIRE(canvas->push(move(basicPicture5)) == Result::Success);
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);
248 REQUIRE(canvas->draw() == Result::Success);
249 REQUIRE(canvas->sync() == Result::Success);
251 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
255 TEST_CASE("Rect Draw", "[tvgSwEngine]")
257 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
259 auto canvas = SwCanvas::gen();
262 uint32_t buffer[100*100];
263 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
265 //Basic shapes and masking
266 auto basicShape = tvg::Shape::gen();
268 auto basicMask = tvg::Shape::gen();
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);
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()));
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()));
284 auto basicShape4 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
285 REQUIRE(basicShape4);
287 REQUIRE(basicShape->composite(move(basicMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
288 REQUIRE(canvas->push(move(basicShape)) == Result::Success);
290 REQUIRE(basicShape2->composite(move(basicMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
291 REQUIRE(canvas->push(move(basicShape2)) == Result::Success);
293 REQUIRE(basicShape3->composite(move(basicMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
294 REQUIRE(canvas->push(move(basicShape3)) == Result::Success);
296 REQUIRE(canvas->push(move(basicShape4)) == Result::Success);
299 REQUIRE(canvas->draw() == Result::Success);
300 REQUIRE(canvas->sync() == Result::Success);
302 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
306 TEST_CASE("RLE Rect Draw", "[tvgSwEngine]")
308 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
310 auto canvas = SwCanvas::gen();
313 uint32_t buffer[100*100];
314 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
316 //Basic shapes and masking
317 auto basicShape = tvg::Shape::gen();
319 auto basicMask = tvg::Shape::gen();
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);
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()));
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()));
335 auto basicShape4 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
336 REQUIRE(basicShape4);
338 REQUIRE(basicShape->composite(move(basicMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
339 REQUIRE(canvas->push(move(basicShape)) == Result::Success);
341 REQUIRE(basicShape2->composite(move(basicMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
342 REQUIRE(canvas->push(move(basicShape2)) == Result::Success);
344 REQUIRE(basicShape3->composite(move(basicMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
345 REQUIRE(canvas->push(move(basicShape3)) == Result::Success);
347 REQUIRE(canvas->push(move(basicShape4)) == Result::Success);
350 REQUIRE(canvas->draw() == Result::Success);
351 REQUIRE(canvas->sync() == Result::Success);
353 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
357 TEST_CASE("Filling Draw", "[tvgSwEngine]")
359 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
361 auto canvas = SwCanvas::gen();
364 uint32_t buffer[100*100];
365 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
368 auto linearFill = LinearGradient::gen();
371 auto radialFill = RadialGradient::gen();
374 Fill::ColorStop cs[4] = {
376 {0.2f, 50, 25, 50, 25},
377 {0.5f, 100, 100, 100, 125},
378 {1.0f, 255, 255, 255, 255}
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);
386 auto shape3 = tvg::Shape::gen();
388 auto shape4 = tvg::Shape::gen();
390 REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
391 REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
393 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
394 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
396 REQUIRE(canvas->push(move(shape3)) == Result::Success);
397 REQUIRE(canvas->push(move(shape4)) == Result::Success);
400 REQUIRE(canvas->draw() == Result::Success);
401 REQUIRE(canvas->sync() == Result::Success);
403 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
407 TEST_CASE("Filling Opaque Draw", "[tvgSwEngine]")
409 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
411 auto canvas = SwCanvas::gen();
414 uint32_t buffer[100*100];
415 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
418 auto linearFill = LinearGradient::gen();
421 auto radialFill = RadialGradient::gen();
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}
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);
436 auto shape3 = tvg::Shape::gen();
438 auto shape4 = tvg::Shape::gen();
440 REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
441 REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
443 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
444 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
446 REQUIRE(canvas->push(move(shape3)) == Result::Success);
447 REQUIRE(canvas->push(move(shape4)) == Result::Success);
450 REQUIRE(canvas->draw() == Result::Success);
451 REQUIRE(canvas->sync() == Result::Success);
453 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
457 TEST_CASE("Filling AlphaMask", "[tvgSwEngine]")
459 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
461 auto canvas = SwCanvas::gen();
464 uint32_t buffer[100*100];
465 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
468 auto linearFill = LinearGradient::gen();
471 auto radialFill = RadialGradient::gen();
474 Fill::ColorStop cs[4] = {
476 {0.2f, 50, 25, 50, 25},
477 {0.5f, 100, 100, 100, 125},
478 {1.0f, 255, 255, 255, 255}
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);
486 auto mask = tvg::Shape::gen();
488 REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
491 auto shape3 = tvg::Shape::gen();
493 auto shape4 = tvg::Shape::gen();
495 REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
496 REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
498 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
499 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
502 auto scene = tvg::Scene::gen();
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);
510 REQUIRE(canvas->draw() == Result::Success);
511 REQUIRE(canvas->sync() == Result::Success);
513 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
517 TEST_CASE("Filling InvAlphaMask", "[tvgSwEngine]")
519 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
521 auto canvas = SwCanvas::gen();
524 uint32_t buffer[100*100];
525 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
528 auto linearFill = LinearGradient::gen();
531 auto radialFill = RadialGradient::gen();
534 Fill::ColorStop cs[4] = {
536 {0.2f, 50, 25, 50, 25},
537 {0.5f, 100, 100, 100, 125},
538 {1.0f, 255, 255, 255, 255}
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);
546 auto mask = tvg::Shape::gen();
548 REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
551 auto shape3 = tvg::Shape::gen();
553 auto shape4 = tvg::Shape::gen();
555 REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
556 REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
558 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
559 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
562 auto scene = tvg::Scene::gen();
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);
570 REQUIRE(canvas->draw() == Result::Success);
571 REQUIRE(canvas->sync() == Result::Success);
573 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
577 TEST_CASE("Filling ClipPath", "[tvgSwEngine]")
579 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
581 auto canvas = SwCanvas::gen();
584 uint32_t buffer[100*100];
585 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
588 auto linearFill = LinearGradient::gen();
591 auto radialFill = RadialGradient::gen();
594 Fill::ColorStop cs[4] = {
596 {0.2f, 50, 25, 50, 25},
597 {0.5f, 100, 100, 100, 125},
598 {1.0f, 255, 255, 255, 255}
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);
606 auto mask = tvg::Shape::gen();
608 REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
611 auto shape3 = tvg::Shape::gen();
613 auto shape4 = tvg::Shape::gen();
615 REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
616 REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
618 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
619 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
622 auto scene = tvg::Scene::gen();
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);
630 REQUIRE(canvas->draw() == Result::Success);
631 REQUIRE(canvas->sync() == Result::Success);
633 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
637 TEST_CASE("RLE Filling Draw", "[tvgSwEngine]")
639 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
641 auto canvas = SwCanvas::gen();
644 uint32_t buffer[100*100];
645 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
648 auto linearFill = LinearGradient::gen();
651 auto radialFill = RadialGradient::gen();
654 Fill::ColorStop cs[4] = {
656 {0.2f, 50, 25, 50, 25},
657 {0.5f, 100, 100, 100, 125},
658 {1.0f, 255, 255, 255, 255}
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);
666 auto shape3 = tvg::Shape::gen();
668 auto shape4 = tvg::Shape::gen();
670 REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
671 REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
673 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
674 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
676 REQUIRE(canvas->push(move(shape3)) == Result::Success);
677 REQUIRE(canvas->push(move(shape4)) == Result::Success);
680 REQUIRE(canvas->draw() == Result::Success);
681 REQUIRE(canvas->sync() == Result::Success);
683 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
687 TEST_CASE("RLE Filling Opaque Draw", "[tvgSwEngine]")
689 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
691 auto canvas = SwCanvas::gen();
694 uint32_t buffer[100*100];
695 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
698 auto linearFill = LinearGradient::gen();
701 auto radialFill = RadialGradient::gen();
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}
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);
716 auto shape3 = tvg::Shape::gen();
718 auto shape4 = tvg::Shape::gen();
720 REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
721 REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
723 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
724 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
726 REQUIRE(canvas->push(move(shape3)) == Result::Success);
727 REQUIRE(canvas->push(move(shape4)) == Result::Success);
730 REQUIRE(canvas->draw() == Result::Success);
731 REQUIRE(canvas->sync() == Result::Success);
733 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
737 TEST_CASE("RLE Filling AlphaMask", "[tvgSwEngine]")
739 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
741 auto canvas = SwCanvas::gen();
744 uint32_t buffer[100*100];
745 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
748 auto linearFill = LinearGradient::gen();
751 auto radialFill = RadialGradient::gen();
754 Fill::ColorStop cs[4] = {
756 {0.2f, 50, 25, 50, 25},
757 {0.5f, 100, 100, 100, 125},
758 {1.0f, 255, 255, 255, 255}
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);
766 auto mask = tvg::Shape::gen();
768 REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
771 auto shape3 = tvg::Shape::gen();
773 auto shape4 = tvg::Shape::gen();
775 REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
776 REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
778 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
779 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
782 auto scene = tvg::Scene::gen();
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);
790 REQUIRE(canvas->draw() == Result::Success);
791 REQUIRE(canvas->sync() == Result::Success);
793 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
797 TEST_CASE("RLE Filling InvAlphaMask", "[tvgSwEngine]")
799 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
801 auto canvas = SwCanvas::gen();
804 uint32_t buffer[100*100];
805 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
808 auto linearFill = LinearGradient::gen();
811 auto radialFill = RadialGradient::gen();
814 Fill::ColorStop cs[4] = {
816 {0.2f, 50, 25, 50, 25},
817 {0.5f, 100, 100, 100, 125},
818 {1.0f, 255, 255, 255, 255}
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);
826 auto mask = tvg::Shape::gen();
828 REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
831 auto shape3 = tvg::Shape::gen();
833 auto shape4 = tvg::Shape::gen();
835 REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
836 REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
838 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
839 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
842 auto scene = tvg::Scene::gen();
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);
850 REQUIRE(canvas->draw() == Result::Success);
851 REQUIRE(canvas->sync() == Result::Success);
853 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
857 TEST_CASE("RLE Filling ClipPath", "[tvgSwEngine]")
859 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
861 auto canvas = SwCanvas::gen();
864 uint32_t buffer[100*100];
865 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
868 auto linearFill = LinearGradient::gen();
871 auto radialFill = RadialGradient::gen();
874 Fill::ColorStop cs[4] = {
876 {0.2f, 50, 25, 50, 25},
877 {0.5f, 100, 100, 100, 125},
878 {1.0f, 255, 255, 255, 255}
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);
886 auto mask = tvg::Shape::gen();
888 REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
891 auto shape3 = tvg::Shape::gen();
893 auto shape4 = tvg::Shape::gen();
895 REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
896 REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
898 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
899 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
902 auto scene = tvg::Scene::gen();
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);
910 REQUIRE(canvas->draw() == Result::Success);
911 REQUIRE(canvas->sync() == Result::Success);
913 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);