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 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 REQUIRE(canvas->draw() == Result::Success);
276 REQUIRE(canvas->sync() == Result::Success);
278 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
282 TEST_CASE("Rect Draw", "[tvgSwEngine]")
284 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
286 auto canvas = SwCanvas::gen();
289 uint32_t buffer[100*100];
290 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
292 //Basic shapes and masking
293 auto basicShape = tvg::Shape::gen();
295 auto basicMask = tvg::Shape::gen();
297 REQUIRE(basicShape->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
298 REQUIRE(basicMask->appendRect(10, 10, 30, 30, 0, 0) == Result::Success);
299 REQUIRE(basicShape->fill(255, 255, 255, 155) == Result::Success);
301 auto basicShape2 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
302 REQUIRE(basicShape2);
303 auto basicMask2 = std::unique_ptr<Shape>(static_cast<Shape*>(basicMask->duplicate()));
306 auto basicShape3 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
307 REQUIRE(basicShape3);
308 auto basicMask3 = std::unique_ptr<Shape>(static_cast<Shape*>(basicMask->duplicate()));
311 auto basicShape4 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
312 REQUIRE(basicShape4);
314 REQUIRE(basicShape->composite(move(basicMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
315 REQUIRE(canvas->push(move(basicShape)) == Result::Success);
317 REQUIRE(basicShape2->composite(move(basicMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
318 REQUIRE(canvas->push(move(basicShape2)) == Result::Success);
320 REQUIRE(basicShape3->composite(move(basicMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
321 REQUIRE(canvas->push(move(basicShape3)) == Result::Success);
323 REQUIRE(canvas->push(move(basicShape4)) == Result::Success);
326 REQUIRE(canvas->draw() == Result::Success);
327 REQUIRE(canvas->sync() == Result::Success);
329 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
333 TEST_CASE("RLE Draw", "[tvgSwEngine]")
335 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
337 auto canvas = SwCanvas::gen();
340 uint32_t buffer[100*100];
341 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
343 //Basic shapes and masking
344 auto basicShape = tvg::Shape::gen();
346 auto basicMask = tvg::Shape::gen();
348 REQUIRE(basicShape->appendRect(0, 0, 50, 50, 50, 50) == Result::Success);
349 REQUIRE(basicMask->appendRect(10, 10, 30, 30, 0, 0) == Result::Success);
350 REQUIRE(basicShape->fill(255, 255, 255, 100) == Result::Success);
352 auto basicShape2 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
353 REQUIRE(basicShape2);
354 auto basicMask2 = std::unique_ptr<Shape>(static_cast<Shape*>(basicMask->duplicate()));
357 auto basicShape3 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
358 REQUIRE(basicShape3);
359 auto basicMask3 = std::unique_ptr<Shape>(static_cast<Shape*>(basicMask->duplicate()));
362 auto basicShape4 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
363 REQUIRE(basicShape4);
365 REQUIRE(basicShape->composite(move(basicMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
366 REQUIRE(canvas->push(move(basicShape)) == Result::Success);
368 REQUIRE(basicShape2->composite(move(basicMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
369 REQUIRE(canvas->push(move(basicShape2)) == Result::Success);
371 REQUIRE(basicShape3->composite(move(basicMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
372 REQUIRE(canvas->push(move(basicShape3)) == Result::Success);
374 REQUIRE(canvas->push(move(basicShape4)) == Result::Success);
377 REQUIRE(canvas->draw() == Result::Success);
378 REQUIRE(canvas->sync() == Result::Success);
380 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
384 TEST_CASE("Filling Draw", "[tvgSwEngine]")
386 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
388 auto canvas = SwCanvas::gen();
391 uint32_t buffer[100*100];
392 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
395 auto linearFill = LinearGradient::gen();
398 auto radialFill = RadialGradient::gen();
401 Fill::ColorStop cs[4] = {
403 {0.2f, 50, 25, 50, 25},
404 {0.5f, 100, 100, 100, 125},
405 {1.0f, 255, 255, 255, 255}
407 REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
408 REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
409 REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
410 REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
413 auto shape3 = tvg::Shape::gen();
415 auto shape4 = tvg::Shape::gen();
417 REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
418 REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
420 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
421 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
423 REQUIRE(canvas->push(move(shape3)) == Result::Success);
424 REQUIRE(canvas->push(move(shape4)) == Result::Success);
427 REQUIRE(canvas->draw() == Result::Success);
428 REQUIRE(canvas->sync() == Result::Success);
430 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
434 TEST_CASE("Filling Opaque Draw", "[tvgSwEngine]")
436 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
438 auto canvas = SwCanvas::gen();
441 uint32_t buffer[100*100];
442 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
445 auto linearFill = LinearGradient::gen();
448 auto radialFill = RadialGradient::gen();
451 Fill::ColorStop cs[4] = {
452 {0.0f, 0, 0, 0, 255},
453 {0.2f, 50, 25, 50, 255},
454 {0.5f, 100, 100, 100, 255},
455 {1.0f, 255, 255, 255, 255}
457 REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
458 REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
459 REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
460 REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
463 auto shape3 = tvg::Shape::gen();
465 auto shape4 = tvg::Shape::gen();
467 REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
468 REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
470 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
471 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
473 REQUIRE(canvas->push(move(shape3)) == Result::Success);
474 REQUIRE(canvas->push(move(shape4)) == Result::Success);
477 REQUIRE(canvas->draw() == Result::Success);
478 REQUIRE(canvas->sync() == Result::Success);
480 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
484 TEST_CASE("Filling AlphaMask", "[tvgSwEngine]")
486 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
488 auto canvas = SwCanvas::gen();
491 uint32_t buffer[100*100];
492 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
495 auto linearFill = LinearGradient::gen();
498 auto radialFill = RadialGradient::gen();
501 Fill::ColorStop cs[4] = {
503 {0.2f, 50, 25, 50, 25},
504 {0.5f, 100, 100, 100, 125},
505 {1.0f, 255, 255, 255, 255}
507 REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
508 REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
509 REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
510 REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
513 auto mask = tvg::Shape::gen();
515 REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
518 auto shape3 = tvg::Shape::gen();
520 auto shape4 = tvg::Shape::gen();
522 REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
523 REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
525 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
526 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
529 auto scene = tvg::Scene::gen();
531 REQUIRE(scene->push(move(shape3)) == Result::Success);
532 REQUIRE(scene->push(move(shape4)) == Result::Success);
533 REQUIRE(scene->composite(move(mask), tvg::CompositeMethod::AlphaMask) == Result::Success);
534 REQUIRE(canvas->push(move(scene)) == Result::Success);
537 REQUIRE(canvas->draw() == Result::Success);
538 REQUIRE(canvas->sync() == Result::Success);
540 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
544 TEST_CASE("Filling InvAlphaMask", "[tvgSwEngine]")
546 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
548 auto canvas = SwCanvas::gen();
551 uint32_t buffer[100*100];
552 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
555 auto linearFill = LinearGradient::gen();
558 auto radialFill = RadialGradient::gen();
561 Fill::ColorStop cs[4] = {
563 {0.2f, 50, 25, 50, 25},
564 {0.5f, 100, 100, 100, 125},
565 {1.0f, 255, 255, 255, 255}
567 REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
568 REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
569 REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
570 REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
573 auto mask = tvg::Shape::gen();
575 REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
578 auto shape3 = tvg::Shape::gen();
580 auto shape4 = tvg::Shape::gen();
582 REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
583 REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
585 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
586 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
589 auto scene = tvg::Scene::gen();
591 REQUIRE(scene->push(move(shape3)) == Result::Success);
592 REQUIRE(scene->push(move(shape4)) == Result::Success);
593 REQUIRE(scene->composite(move(mask), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
594 REQUIRE(canvas->push(move(scene)) == Result::Success);
597 REQUIRE(canvas->draw() == Result::Success);
598 REQUIRE(canvas->sync() == Result::Success);
600 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
604 TEST_CASE("Filling ClipPath", "[tvgSwEngine]")
606 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
608 auto canvas = SwCanvas::gen();
611 uint32_t buffer[100*100];
612 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
615 auto linearFill = LinearGradient::gen();
618 auto radialFill = RadialGradient::gen();
621 Fill::ColorStop cs[4] = {
623 {0.2f, 50, 25, 50, 25},
624 {0.5f, 100, 100, 100, 125},
625 {1.0f, 255, 255, 255, 255}
627 REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
628 REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
629 REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
630 REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
633 auto mask = tvg::Shape::gen();
635 REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
638 auto shape3 = tvg::Shape::gen();
640 auto shape4 = tvg::Shape::gen();
642 REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
643 REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
645 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
646 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
649 auto scene = tvg::Scene::gen();
651 REQUIRE(scene->push(move(shape3)) == Result::Success);
652 REQUIRE(scene->push(move(shape4)) == Result::Success);
653 REQUIRE(scene->composite(move(mask), tvg::CompositeMethod::ClipPath) == Result::Success);
654 REQUIRE(canvas->push(move(scene)) == Result::Success);
657 REQUIRE(canvas->draw() == Result::Success);
658 REQUIRE(canvas->sync() == Result::Success);
660 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
664 TEST_CASE("RLE Filling Draw", "[tvgSwEngine]")
666 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
668 auto canvas = SwCanvas::gen();
671 uint32_t buffer[100*100];
672 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
675 auto linearFill = LinearGradient::gen();
678 auto radialFill = RadialGradient::gen();
681 Fill::ColorStop cs[4] = {
683 {0.2f, 50, 25, 50, 25},
684 {0.5f, 100, 100, 100, 125},
685 {1.0f, 255, 255, 255, 255}
687 REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
688 REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
689 REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
690 REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
693 auto shape3 = tvg::Shape::gen();
695 auto shape4 = tvg::Shape::gen();
697 REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
698 REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
700 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
701 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
703 REQUIRE(canvas->push(move(shape3)) == Result::Success);
704 REQUIRE(canvas->push(move(shape4)) == Result::Success);
707 REQUIRE(canvas->draw() == Result::Success);
708 REQUIRE(canvas->sync() == Result::Success);
710 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
714 TEST_CASE("RLE Filling Opaque Draw", "[tvgSwEngine]")
716 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
718 auto canvas = SwCanvas::gen();
721 uint32_t buffer[100*100];
722 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
725 auto linearFill = LinearGradient::gen();
728 auto radialFill = RadialGradient::gen();
731 Fill::ColorStop cs[4] = {
732 {0.0f, 0, 0, 0, 255},
733 {0.2f, 50, 25, 50, 255},
734 {0.5f, 100, 100, 100, 255},
735 {1.0f, 255, 255, 255, 255}
737 REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
738 REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
739 REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
740 REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
743 auto shape3 = tvg::Shape::gen();
745 auto shape4 = tvg::Shape::gen();
747 REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
748 REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
750 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
751 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
753 REQUIRE(canvas->push(move(shape3)) == Result::Success);
754 REQUIRE(canvas->push(move(shape4)) == Result::Success);
757 REQUIRE(canvas->draw() == Result::Success);
758 REQUIRE(canvas->sync() == Result::Success);
760 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
764 TEST_CASE("RLE Filling AlphaMask", "[tvgSwEngine]")
766 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
768 auto canvas = SwCanvas::gen();
771 uint32_t buffer[100*100];
772 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
775 auto linearFill = LinearGradient::gen();
778 auto radialFill = RadialGradient::gen();
781 Fill::ColorStop cs[4] = {
783 {0.2f, 50, 25, 50, 25},
784 {0.5f, 100, 100, 100, 125},
785 {1.0f, 255, 255, 255, 255}
787 REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
788 REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
789 REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
790 REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
793 auto mask = tvg::Shape::gen();
795 REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
798 auto shape3 = tvg::Shape::gen();
800 auto shape4 = tvg::Shape::gen();
802 REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
803 REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
805 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
806 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
809 auto scene = tvg::Scene::gen();
811 REQUIRE(scene->push(move(shape3)) == Result::Success);
812 REQUIRE(scene->push(move(shape4)) == Result::Success);
813 REQUIRE(scene->composite(move(mask), tvg::CompositeMethod::AlphaMask) == Result::Success);
814 REQUIRE(canvas->push(move(scene)) == Result::Success);
817 REQUIRE(canvas->draw() == Result::Success);
818 REQUIRE(canvas->sync() == Result::Success);
820 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
824 TEST_CASE("RLE Filling InvAlphaMask", "[tvgSwEngine]")
826 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
828 auto canvas = SwCanvas::gen();
831 uint32_t buffer[100*100];
832 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
835 auto linearFill = LinearGradient::gen();
838 auto radialFill = RadialGradient::gen();
841 Fill::ColorStop cs[4] = {
843 {0.2f, 50, 25, 50, 25},
844 {0.5f, 100, 100, 100, 125},
845 {1.0f, 255, 255, 255, 255}
847 REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
848 REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
849 REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
850 REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
853 auto mask = tvg::Shape::gen();
855 REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
858 auto shape3 = tvg::Shape::gen();
860 auto shape4 = tvg::Shape::gen();
862 REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
863 REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
865 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
866 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
869 auto scene = tvg::Scene::gen();
871 REQUIRE(scene->push(move(shape3)) == Result::Success);
872 REQUIRE(scene->push(move(shape4)) == Result::Success);
873 REQUIRE(scene->composite(move(mask), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
874 REQUIRE(canvas->push(move(scene)) == Result::Success);
877 REQUIRE(canvas->draw() == Result::Success);
878 REQUIRE(canvas->sync() == Result::Success);
880 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
884 TEST_CASE("RLE Filling ClipPath", "[tvgSwEngine]")
886 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
888 auto canvas = SwCanvas::gen();
891 uint32_t buffer[100*100];
892 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
895 auto linearFill = LinearGradient::gen();
898 auto radialFill = RadialGradient::gen();
901 Fill::ColorStop cs[4] = {
903 {0.2f, 50, 25, 50, 25},
904 {0.5f, 100, 100, 100, 125},
905 {1.0f, 255, 255, 255, 255}
907 REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
908 REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
909 REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
910 REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
913 auto mask = tvg::Shape::gen();
915 REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
918 auto shape3 = tvg::Shape::gen();
920 auto shape4 = tvg::Shape::gen();
922 REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
923 REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
925 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
926 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
929 auto scene = tvg::Scene::gen();
931 REQUIRE(scene->push(move(shape3)) == Result::Success);
932 REQUIRE(scene->push(move(shape4)) == Result::Success);
933 REQUIRE(scene->composite(move(mask), tvg::CompositeMethod::ClipPath) == Result::Success);
934 REQUIRE(canvas->push(move(scene)) == Result::Success);
937 REQUIRE(canvas->draw() == Result::Success);
938 REQUIRE(canvas->sync() == Result::Success);
940 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);