2 * Copyright (c) 2021 - 2022 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 auto shape3 = tvg::Shape::gen();
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);
71 auto shape4 = tvg::Shape::gen();
73 float dashPattern[2] = {2.5f, 5.0f};
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);
86 REQUIRE(canvas->draw() == Result::Success);
87 REQUIRE(canvas->sync() == Result::Success);
89 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
93 TEST_CASE("Image Draw", "[tvgSwEngine]")
95 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
97 auto canvas = SwCanvas::gen();
100 uint32_t buffer[100*100];
101 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
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();
110 REQUIRE(rectMask->appendRect(10, 10, 30, 30, 0, 0) == Result::Success);
111 auto rleMask = tvg::Shape::gen();
113 REQUIRE(rleMask->appendRect(0, 10, 20, 30, 5, 5) == Result::Success);
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()));
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()));
126 auto basicPicture4 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
127 REQUIRE(basicPicture4);
130 auto basicPicture5 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
131 REQUIRE(basicPicture5);
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()));
139 REQUIRE(basicPicture->composite(move(rectMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
140 REQUIRE(canvas->push(move(basicPicture)) == Result::Success);
142 REQUIRE(basicPicture2->composite(move(rectMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
143 REQUIRE(canvas->push(move(basicPicture2)) == Result::Success);
145 REQUIRE(basicPicture3->composite(move(rectMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
146 REQUIRE(canvas->push(move(basicPicture3)) == Result::Success);
148 REQUIRE(basicPicture4->opacity(100) == Result::Success);
149 REQUIRE(canvas->push(move(basicPicture4)) == Result::Success);
152 REQUIRE(basicPicture5->composite(move(rleMask), tvg::CompositeMethod::ClipPath) == Result::Success);
153 REQUIRE(canvas->push(move(basicPicture5)) == Result::Success);
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);
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();
167 REQUIRE(rectMask->appendRect(10, 10, 30, 30, 0, 0) == Result::Success);
168 rleMask = tvg::Shape::gen();
170 REQUIRE(rleMask->appendRect(0, 10, 20, 30, 5, 5) == Result::Success);
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()));
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()));
183 basicPicture4 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
184 REQUIRE(basicPicture4);
187 basicPicture5 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
188 REQUIRE(basicPicture5);
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()));
196 REQUIRE(basicPicture->composite(move(rectMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
197 REQUIRE(canvas->push(move(basicPicture)) == Result::Success);
199 REQUIRE(basicPicture2->composite(move(rectMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
200 REQUIRE(canvas->push(move(basicPicture2)) == Result::Success);
202 REQUIRE(basicPicture3->composite(move(rectMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
203 REQUIRE(canvas->push(move(basicPicture3)) == Result::Success);
205 REQUIRE(basicPicture4->opacity(100) == Result::Success);
206 REQUIRE(canvas->push(move(basicPicture4)) == Result::Success);
209 REQUIRE(basicPicture5->composite(move(rleMask), tvg::CompositeMethod::ClipPath) == Result::Success);
210 REQUIRE(canvas->push(move(basicPicture5)) == Result::Success);
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);
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();
224 REQUIRE(rectMask->appendRect(10, 10, 30, 30, 0, 0) == Result::Success);
225 rleMask = tvg::Shape::gen();
227 REQUIRE(rleMask->appendRect(0, 10, 20, 30, 5, 5) == Result::Success);
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()));
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()));
240 basicPicture4 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
241 REQUIRE(basicPicture4);
244 basicPicture5 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
245 REQUIRE(basicPicture5);
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()));
253 REQUIRE(basicPicture->composite(move(rectMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
254 REQUIRE(canvas->push(move(basicPicture)) == Result::Success);
256 REQUIRE(basicPicture2->composite(move(rectMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
257 REQUIRE(canvas->push(move(basicPicture2)) == Result::Success);
259 REQUIRE(basicPicture3->composite(move(rectMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
260 REQUIRE(canvas->push(move(basicPicture3)) == Result::Success);
262 REQUIRE(basicPicture4->opacity(100) == Result::Success);
263 REQUIRE(canvas->push(move(basicPicture4)) == Result::Success);
266 REQUIRE(basicPicture5->composite(move(rleMask), tvg::CompositeMethod::ClipPath) == Result::Success);
267 REQUIRE(canvas->push(move(basicPicture5)) == Result::Success);
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);
275 basicPicture = Picture::gen();
276 REQUIRE(basicPicture);
277 REQUIRE(basicPicture->load(TEST_DIR"/test.png") == Result::Success);
278 REQUIRE(basicPicture->scale(0.2f) == Result::Success);
279 rectMask = tvg::Shape::gen();
281 REQUIRE(rectMask->appendRect(10, 10, 30, 30, 0, 0) == Result::Success);
282 rleMask = tvg::Shape::gen();
284 REQUIRE(rleMask->appendRect(0, 10, 20, 30, 5, 5) == Result::Success);
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()));
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()));
297 basicPicture4 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
298 REQUIRE(basicPicture4);
301 basicPicture5 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
302 REQUIRE(basicPicture5);
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()));
310 REQUIRE(basicPicture->composite(move(rectMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
311 REQUIRE(canvas->push(move(basicPicture)) == Result::Success);
313 REQUIRE(basicPicture2->composite(move(rectMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
314 REQUIRE(canvas->push(move(basicPicture2)) == Result::Success);
316 REQUIRE(basicPicture3->composite(move(rectMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
317 REQUIRE(canvas->push(move(basicPicture3)) == Result::Success);
319 REQUIRE(basicPicture4->opacity(100) == Result::Success);
320 REQUIRE(canvas->push(move(basicPicture4)) == Result::Success);
323 REQUIRE(basicPicture5->composite(move(rleMask), tvg::CompositeMethod::ClipPath) == Result::Success);
324 REQUIRE(canvas->push(move(basicPicture5)) == Result::Success);
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);
331 REQUIRE(canvas->draw() == Result::Success);
332 REQUIRE(canvas->sync() == Result::Success);
334 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
338 TEST_CASE("Rect Draw", "[tvgSwEngine]")
340 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
342 auto canvas = SwCanvas::gen();
345 uint32_t buffer[100*100];
346 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
348 //Basic shapes and masking
349 auto basicShape = tvg::Shape::gen();
351 auto basicMask = tvg::Shape::gen();
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);
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()));
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()));
367 auto basicShape4 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
368 REQUIRE(basicShape4);
370 REQUIRE(basicShape->composite(move(basicMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
371 REQUIRE(canvas->push(move(basicShape)) == Result::Success);
373 REQUIRE(basicShape2->composite(move(basicMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
374 REQUIRE(canvas->push(move(basicShape2)) == Result::Success);
376 REQUIRE(basicShape3->composite(move(basicMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
377 REQUIRE(canvas->push(move(basicShape3)) == Result::Success);
379 REQUIRE(canvas->push(move(basicShape4)) == Result::Success);
382 REQUIRE(canvas->draw() == Result::Success);
383 REQUIRE(canvas->sync() == Result::Success);
385 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
389 TEST_CASE("RLE Draw", "[tvgSwEngine]")
391 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
393 auto canvas = SwCanvas::gen();
396 uint32_t buffer[100*100];
397 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
399 //Basic shapes and masking
400 auto basicShape = tvg::Shape::gen();
402 auto basicMask = tvg::Shape::gen();
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);
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()));
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()));
418 auto basicShape4 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
419 REQUIRE(basicShape4);
421 REQUIRE(basicShape->composite(move(basicMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
422 REQUIRE(canvas->push(move(basicShape)) == Result::Success);
424 REQUIRE(basicShape2->composite(move(basicMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
425 REQUIRE(canvas->push(move(basicShape2)) == Result::Success);
427 REQUIRE(basicShape3->composite(move(basicMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
428 REQUIRE(canvas->push(move(basicShape3)) == Result::Success);
430 REQUIRE(canvas->push(move(basicShape4)) == Result::Success);
433 REQUIRE(canvas->draw() == Result::Success);
434 REQUIRE(canvas->sync() == Result::Success);
436 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
440 TEST_CASE("Filling Draw", "[tvgSwEngine]")
442 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
444 auto canvas = SwCanvas::gen();
447 uint32_t buffer[100*100];
448 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
451 auto linearFill = LinearGradient::gen();
454 auto radialFill = RadialGradient::gen();
457 Fill::ColorStop cs[4] = {
459 {0.2f, 50, 25, 50, 25},
460 {0.5f, 100, 100, 100, 125},
461 {1.0f, 255, 255, 255, 255}
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);
469 auto shape3 = tvg::Shape::gen();
471 auto shape4 = tvg::Shape::gen();
473 REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
474 REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
476 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
477 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
479 REQUIRE(canvas->push(move(shape3)) == Result::Success);
480 REQUIRE(canvas->push(move(shape4)) == Result::Success);
483 REQUIRE(canvas->draw() == Result::Success);
484 REQUIRE(canvas->sync() == Result::Success);
486 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
490 TEST_CASE("Filling Opaque Draw", "[tvgSwEngine]")
492 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
494 auto canvas = SwCanvas::gen();
497 uint32_t buffer[100*100];
498 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
501 auto linearFill = LinearGradient::gen();
504 auto radialFill = RadialGradient::gen();
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}
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);
519 auto shape3 = tvg::Shape::gen();
521 auto shape4 = tvg::Shape::gen();
523 REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
524 REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
526 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
527 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
529 REQUIRE(canvas->push(move(shape3)) == Result::Success);
530 REQUIRE(canvas->push(move(shape4)) == Result::Success);
533 REQUIRE(canvas->draw() == Result::Success);
534 REQUIRE(canvas->sync() == Result::Success);
536 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
540 TEST_CASE("Filling AlphaMask", "[tvgSwEngine]")
542 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
544 auto canvas = SwCanvas::gen();
547 uint32_t buffer[100*100];
548 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
551 auto linearFill = LinearGradient::gen();
554 auto radialFill = RadialGradient::gen();
557 Fill::ColorStop cs[4] = {
559 {0.2f, 50, 25, 50, 25},
560 {0.5f, 100, 100, 100, 125},
561 {1.0f, 255, 255, 255, 255}
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);
569 auto mask = tvg::Shape::gen();
571 REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
574 auto shape3 = tvg::Shape::gen();
576 auto shape4 = tvg::Shape::gen();
578 REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
579 REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
581 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
582 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
585 auto scene = tvg::Scene::gen();
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);
593 REQUIRE(canvas->draw() == Result::Success);
594 REQUIRE(canvas->sync() == Result::Success);
596 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
600 TEST_CASE("Filling InvAlphaMask", "[tvgSwEngine]")
602 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
604 auto canvas = SwCanvas::gen();
607 uint32_t buffer[100*100];
608 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
611 auto linearFill = LinearGradient::gen();
614 auto radialFill = RadialGradient::gen();
617 Fill::ColorStop cs[4] = {
619 {0.2f, 50, 25, 50, 25},
620 {0.5f, 100, 100, 100, 125},
621 {1.0f, 255, 255, 255, 255}
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);
629 auto mask = tvg::Shape::gen();
631 REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
634 auto shape3 = tvg::Shape::gen();
636 auto shape4 = tvg::Shape::gen();
638 REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
639 REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
641 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
642 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
645 auto scene = tvg::Scene::gen();
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);
653 REQUIRE(canvas->draw() == Result::Success);
654 REQUIRE(canvas->sync() == Result::Success);
656 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
660 TEST_CASE("Filling ClipPath", "[tvgSwEngine]")
662 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
664 auto canvas = SwCanvas::gen();
667 uint32_t buffer[100*100];
668 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
671 auto linearFill = LinearGradient::gen();
674 auto radialFill = RadialGradient::gen();
677 Fill::ColorStop cs[4] = {
679 {0.2f, 50, 25, 50, 25},
680 {0.5f, 100, 100, 100, 125},
681 {1.0f, 255, 255, 255, 255}
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);
689 auto mask = tvg::Shape::gen();
691 REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
694 auto shape3 = tvg::Shape::gen();
696 auto shape4 = tvg::Shape::gen();
698 REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
699 REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
701 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
702 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
705 auto scene = tvg::Scene::gen();
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);
713 REQUIRE(canvas->draw() == Result::Success);
714 REQUIRE(canvas->sync() == Result::Success);
716 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
720 TEST_CASE("RLE Filling Draw", "[tvgSwEngine]")
722 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
724 auto canvas = SwCanvas::gen();
727 uint32_t buffer[100*100];
728 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
731 auto linearFill = LinearGradient::gen();
734 auto radialFill = RadialGradient::gen();
737 Fill::ColorStop cs[4] = {
739 {0.2f, 50, 25, 50, 25},
740 {0.5f, 100, 100, 100, 125},
741 {1.0f, 255, 255, 255, 255}
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);
749 auto shape3 = tvg::Shape::gen();
751 auto shape4 = tvg::Shape::gen();
753 REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
754 REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
756 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
757 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
759 REQUIRE(canvas->push(move(shape3)) == Result::Success);
760 REQUIRE(canvas->push(move(shape4)) == Result::Success);
763 REQUIRE(canvas->draw() == Result::Success);
764 REQUIRE(canvas->sync() == Result::Success);
766 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
770 TEST_CASE("RLE Filling Opaque Draw", "[tvgSwEngine]")
772 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
774 auto canvas = SwCanvas::gen();
777 uint32_t buffer[100*100];
778 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
781 auto linearFill = LinearGradient::gen();
784 auto radialFill = RadialGradient::gen();
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}
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);
799 auto shape3 = tvg::Shape::gen();
801 auto shape4 = tvg::Shape::gen();
803 REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
804 REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
806 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
807 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
809 REQUIRE(canvas->push(move(shape3)) == Result::Success);
810 REQUIRE(canvas->push(move(shape4)) == Result::Success);
813 REQUIRE(canvas->draw() == Result::Success);
814 REQUIRE(canvas->sync() == Result::Success);
816 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
820 TEST_CASE("RLE Filling AlphaMask", "[tvgSwEngine]")
822 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
824 auto canvas = SwCanvas::gen();
827 uint32_t buffer[100*100];
828 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
831 auto linearFill = LinearGradient::gen();
834 auto radialFill = RadialGradient::gen();
837 Fill::ColorStop cs[4] = {
839 {0.2f, 50, 25, 50, 25},
840 {0.5f, 100, 100, 100, 125},
841 {1.0f, 255, 255, 255, 255}
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);
849 auto mask = tvg::Shape::gen();
851 REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
854 auto shape3 = tvg::Shape::gen();
856 auto shape4 = tvg::Shape::gen();
858 REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
859 REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
861 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
862 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
865 auto scene = tvg::Scene::gen();
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);
873 REQUIRE(canvas->draw() == Result::Success);
874 REQUIRE(canvas->sync() == Result::Success);
876 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
880 TEST_CASE("RLE Filling InvAlphaMask", "[tvgSwEngine]")
882 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
884 auto canvas = SwCanvas::gen();
887 uint32_t buffer[100*100];
888 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
891 auto linearFill = LinearGradient::gen();
894 auto radialFill = RadialGradient::gen();
897 Fill::ColorStop cs[4] = {
899 {0.2f, 50, 25, 50, 25},
900 {0.5f, 100, 100, 100, 125},
901 {1.0f, 255, 255, 255, 255}
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);
909 auto mask = tvg::Shape::gen();
911 REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
914 auto shape3 = tvg::Shape::gen();
916 auto shape4 = tvg::Shape::gen();
918 REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
919 REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
921 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
922 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
925 auto scene = tvg::Scene::gen();
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);
933 REQUIRE(canvas->draw() == Result::Success);
934 REQUIRE(canvas->sync() == Result::Success);
936 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
940 TEST_CASE("RLE Filling ClipPath", "[tvgSwEngine]")
942 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
944 auto canvas = SwCanvas::gen();
947 uint32_t buffer[100*100];
948 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
951 auto linearFill = LinearGradient::gen();
954 auto radialFill = RadialGradient::gen();
957 Fill::ColorStop cs[4] = {
959 {0.2f, 50, 25, 50, 25},
960 {0.5f, 100, 100, 100, 125},
961 {1.0f, 255, 255, 255, 255}
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);
969 auto mask = tvg::Shape::gen();
971 REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
974 auto shape3 = tvg::Shape::gen();
976 auto shape4 = tvg::Shape::gen();
978 REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
979 REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
981 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
982 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
985 auto scene = tvg::Scene::gen();
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);
993 REQUIRE(canvas->draw() == Result::Success);
994 REQUIRE(canvas->sync() == Result::Success);
996 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);