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 REQUIRE(canvas->draw() == Result::Success);
72 REQUIRE(canvas->sync() == Result::Success);
74 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
78 TEST_CASE("Image Draw", "[tvgSwEngine]")
80 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
82 auto canvas = SwCanvas::gen();
85 uint32_t buffer[100*100];
86 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
89 //Not transformed images
90 auto basicPicture = Picture::gen();
91 REQUIRE(basicPicture);
92 REQUIRE(basicPicture->load(TEST_DIR"/test.png") == Result::Success);
93 auto rectMask = tvg::Shape::gen();
95 REQUIRE(rectMask->appendRect(10, 10, 30, 30, 0, 0) == Result::Success);
96 auto rleMask = tvg::Shape::gen();
98 REQUIRE(rleMask->appendRect(0, 10, 20, 30, 5, 5) == Result::Success);
101 auto basicPicture2 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
102 REQUIRE(basicPicture2);
103 auto rectMask2 = std::unique_ptr<Shape>(static_cast<Shape*>(rectMask->duplicate()));
106 auto basicPicture3 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
107 REQUIRE(basicPicture3);
108 auto rectMask3 = std::unique_ptr<Shape>(static_cast<Shape*>(rectMask->duplicate()));
111 auto basicPicture4 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
112 REQUIRE(basicPicture4);
115 auto basicPicture5 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
116 REQUIRE(basicPicture5);
118 auto basicPicture6 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
119 REQUIRE(basicPicture6);
120 auto rleMask6 = std::unique_ptr<Shape>(static_cast<Shape*>(rleMask->duplicate()));
124 REQUIRE(basicPicture->composite(move(rectMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
125 REQUIRE(canvas->push(move(basicPicture)) == Result::Success);
127 REQUIRE(basicPicture2->composite(move(rectMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
128 REQUIRE(canvas->push(move(basicPicture2)) == Result::Success);
130 REQUIRE(basicPicture3->composite(move(rectMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
131 REQUIRE(canvas->push(move(basicPicture3)) == Result::Success);
133 REQUIRE(basicPicture4->opacity(100) == Result::Success);
134 REQUIRE(canvas->push(move(basicPicture4)) == Result::Success);
137 REQUIRE(basicPicture5->composite(move(rleMask), tvg::CompositeMethod::ClipPath) == Result::Success);
138 REQUIRE(canvas->push(move(basicPicture5)) == Result::Success);
140 REQUIRE(basicPicture6->composite(move(rleMask6), tvg::CompositeMethod::ClipPath) == Result::Success);
141 REQUIRE(basicPicture6->opacity(100) == Result::Success);
142 REQUIRE(canvas->push(move(basicPicture6)) == Result::Success);
145 // Transformed images
146 basicPicture = Picture::gen();
147 REQUIRE(basicPicture);
148 REQUIRE(basicPicture->load(TEST_DIR"/test.png") == Result::Success);
149 REQUIRE(basicPicture->rotate(45) == Result::Success);
150 rectMask = tvg::Shape::gen();
152 REQUIRE(rectMask->appendRect(10, 10, 30, 30, 0, 0) == Result::Success);
153 rleMask = tvg::Shape::gen();
155 REQUIRE(rleMask->appendRect(0, 10, 20, 30, 5, 5) == Result::Success);
158 basicPicture2 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
159 REQUIRE(basicPicture2);
160 rectMask2 = std::unique_ptr<Shape>(static_cast<Shape*>(rectMask->duplicate()));
163 basicPicture3 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
164 REQUIRE(basicPicture3);
165 rectMask3 = std::unique_ptr<Shape>(static_cast<Shape*>(rectMask->duplicate()));
168 basicPicture4 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
169 REQUIRE(basicPicture4);
172 basicPicture5 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
173 REQUIRE(basicPicture5);
175 basicPicture6 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
176 REQUIRE(basicPicture6);
177 rleMask6 = std::unique_ptr<Shape>(static_cast<Shape*>(rleMask->duplicate()));
181 REQUIRE(basicPicture->composite(move(rectMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
182 REQUIRE(canvas->push(move(basicPicture)) == Result::Success);
184 REQUIRE(basicPicture2->composite(move(rectMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
185 REQUIRE(canvas->push(move(basicPicture2)) == Result::Success);
187 REQUIRE(basicPicture3->composite(move(rectMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
188 REQUIRE(canvas->push(move(basicPicture3)) == Result::Success);
190 REQUIRE(basicPicture4->opacity(100) == Result::Success);
191 REQUIRE(canvas->push(move(basicPicture4)) == Result::Success);
194 REQUIRE(basicPicture5->composite(move(rleMask), tvg::CompositeMethod::ClipPath) == Result::Success);
195 REQUIRE(canvas->push(move(basicPicture5)) == Result::Success);
197 REQUIRE(basicPicture6->composite(move(rleMask6), tvg::CompositeMethod::ClipPath) == Result::Success);
198 REQUIRE(basicPicture6->opacity(100) == Result::Success);
199 REQUIRE(canvas->push(move(basicPicture6)) == Result::Success);
203 basicPicture = Picture::gen();
204 REQUIRE(basicPicture);
205 REQUIRE(basicPicture->load(TEST_DIR"/test.png") == Result::Success);
206 REQUIRE(basicPicture->scale(2) == Result::Success);
207 rectMask = tvg::Shape::gen();
209 REQUIRE(rectMask->appendRect(10, 10, 30, 30, 0, 0) == Result::Success);
210 rleMask = tvg::Shape::gen();
212 REQUIRE(rleMask->appendRect(0, 10, 20, 30, 5, 5) == Result::Success);
215 basicPicture2 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
216 REQUIRE(basicPicture2);
217 rectMask2 = std::unique_ptr<Shape>(static_cast<Shape*>(rectMask->duplicate()));
220 basicPicture3 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
221 REQUIRE(basicPicture3);
222 rectMask3 = std::unique_ptr<Shape>(static_cast<Shape*>(rectMask->duplicate()));
225 basicPicture4 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
226 REQUIRE(basicPicture4);
229 basicPicture5 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
230 REQUIRE(basicPicture5);
232 basicPicture6 = std::unique_ptr<Picture>(static_cast<Picture*>(basicPicture->duplicate()));
233 REQUIRE(basicPicture6);
234 rleMask6 = std::unique_ptr<Shape>(static_cast<Shape*>(rleMask->duplicate()));
238 REQUIRE(basicPicture->composite(move(rectMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
239 REQUIRE(canvas->push(move(basicPicture)) == Result::Success);
241 REQUIRE(basicPicture2->composite(move(rectMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
242 REQUIRE(canvas->push(move(basicPicture2)) == Result::Success);
244 REQUIRE(basicPicture3->composite(move(rectMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
245 REQUIRE(canvas->push(move(basicPicture3)) == Result::Success);
247 REQUIRE(basicPicture4->opacity(100) == Result::Success);
248 REQUIRE(canvas->push(move(basicPicture4)) == Result::Success);
251 REQUIRE(basicPicture5->composite(move(rleMask), tvg::CompositeMethod::ClipPath) == Result::Success);
252 REQUIRE(canvas->push(move(basicPicture5)) == Result::Success);
254 REQUIRE(basicPicture6->composite(move(rleMask6), tvg::CompositeMethod::ClipPath) == Result::Success);
255 REQUIRE(basicPicture6->opacity(100) == Result::Success);
256 REQUIRE(canvas->push(move(basicPicture6)) == Result::Success);
260 REQUIRE(canvas->draw() == Result::Success);
261 REQUIRE(canvas->sync() == Result::Success);
263 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
267 TEST_CASE("Rect Draw", "[tvgSwEngine]")
269 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
271 auto canvas = SwCanvas::gen();
274 uint32_t buffer[100*100];
275 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
277 //Basic shapes and masking
278 auto basicShape = tvg::Shape::gen();
280 auto basicMask = tvg::Shape::gen();
282 REQUIRE(basicShape->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
283 REQUIRE(basicMask->appendRect(10, 10, 30, 30, 0, 0) == Result::Success);
284 REQUIRE(basicShape->fill(255, 255, 255, 155) == Result::Success);
286 auto basicShape2 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
287 REQUIRE(basicShape2);
288 auto basicMask2 = std::unique_ptr<Shape>(static_cast<Shape*>(basicMask->duplicate()));
291 auto basicShape3 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
292 REQUIRE(basicShape3);
293 auto basicMask3 = std::unique_ptr<Shape>(static_cast<Shape*>(basicMask->duplicate()));
296 auto basicShape4 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
297 REQUIRE(basicShape4);
299 REQUIRE(basicShape->composite(move(basicMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
300 REQUIRE(canvas->push(move(basicShape)) == Result::Success);
302 REQUIRE(basicShape2->composite(move(basicMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
303 REQUIRE(canvas->push(move(basicShape2)) == Result::Success);
305 REQUIRE(basicShape3->composite(move(basicMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
306 REQUIRE(canvas->push(move(basicShape3)) == Result::Success);
308 REQUIRE(canvas->push(move(basicShape4)) == Result::Success);
311 REQUIRE(canvas->draw() == Result::Success);
312 REQUIRE(canvas->sync() == Result::Success);
314 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
318 TEST_CASE("RLE Draw", "[tvgSwEngine]")
320 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
322 auto canvas = SwCanvas::gen();
325 uint32_t buffer[100*100];
326 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
328 //Basic shapes and masking
329 auto basicShape = tvg::Shape::gen();
331 auto basicMask = tvg::Shape::gen();
333 REQUIRE(basicShape->appendRect(0, 0, 50, 50, 50, 50) == Result::Success);
334 REQUIRE(basicMask->appendRect(10, 10, 30, 30, 0, 0) == Result::Success);
335 REQUIRE(basicShape->fill(255, 255, 255, 100) == Result::Success);
337 auto basicShape2 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
338 REQUIRE(basicShape2);
339 auto basicMask2 = std::unique_ptr<Shape>(static_cast<Shape*>(basicMask->duplicate()));
342 auto basicShape3 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
343 REQUIRE(basicShape3);
344 auto basicMask3 = std::unique_ptr<Shape>(static_cast<Shape*>(basicMask->duplicate()));
347 auto basicShape4 = std::unique_ptr<Shape>(static_cast<Shape*>(basicShape->duplicate()));
348 REQUIRE(basicShape4);
350 REQUIRE(basicShape->composite(move(basicMask), tvg::CompositeMethod::AlphaMask) == Result::Success);
351 REQUIRE(canvas->push(move(basicShape)) == Result::Success);
353 REQUIRE(basicShape2->composite(move(basicMask2), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
354 REQUIRE(canvas->push(move(basicShape2)) == Result::Success);
356 REQUIRE(basicShape3->composite(move(basicMask3), tvg::CompositeMethod::ClipPath) == Result::Success);
357 REQUIRE(canvas->push(move(basicShape3)) == Result::Success);
359 REQUIRE(canvas->push(move(basicShape4)) == Result::Success);
362 REQUIRE(canvas->draw() == Result::Success);
363 REQUIRE(canvas->sync() == Result::Success);
365 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
369 TEST_CASE("Filling Draw", "[tvgSwEngine]")
371 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
373 auto canvas = SwCanvas::gen();
376 uint32_t buffer[100*100];
377 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
380 auto linearFill = LinearGradient::gen();
383 auto radialFill = RadialGradient::gen();
386 Fill::ColorStop cs[4] = {
388 {0.2f, 50, 25, 50, 25},
389 {0.5f, 100, 100, 100, 125},
390 {1.0f, 255, 255, 255, 255}
392 REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
393 REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
394 REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
395 REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
398 auto shape3 = tvg::Shape::gen();
400 auto shape4 = tvg::Shape::gen();
402 REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
403 REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
405 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
406 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
408 REQUIRE(canvas->push(move(shape3)) == Result::Success);
409 REQUIRE(canvas->push(move(shape4)) == Result::Success);
412 REQUIRE(canvas->draw() == Result::Success);
413 REQUIRE(canvas->sync() == Result::Success);
415 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
419 TEST_CASE("Filling Opaque Draw", "[tvgSwEngine]")
421 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
423 auto canvas = SwCanvas::gen();
426 uint32_t buffer[100*100];
427 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
430 auto linearFill = LinearGradient::gen();
433 auto radialFill = RadialGradient::gen();
436 Fill::ColorStop cs[4] = {
437 {0.0f, 0, 0, 0, 255},
438 {0.2f, 50, 25, 50, 255},
439 {0.5f, 100, 100, 100, 255},
440 {1.0f, 255, 255, 255, 255}
442 REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
443 REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
444 REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
445 REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
448 auto shape3 = tvg::Shape::gen();
450 auto shape4 = tvg::Shape::gen();
452 REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
453 REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
455 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
456 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
458 REQUIRE(canvas->push(move(shape3)) == Result::Success);
459 REQUIRE(canvas->push(move(shape4)) == Result::Success);
462 REQUIRE(canvas->draw() == Result::Success);
463 REQUIRE(canvas->sync() == Result::Success);
465 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
469 TEST_CASE("Filling AlphaMask", "[tvgSwEngine]")
471 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
473 auto canvas = SwCanvas::gen();
476 uint32_t buffer[100*100];
477 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
480 auto linearFill = LinearGradient::gen();
483 auto radialFill = RadialGradient::gen();
486 Fill::ColorStop cs[4] = {
488 {0.2f, 50, 25, 50, 25},
489 {0.5f, 100, 100, 100, 125},
490 {1.0f, 255, 255, 255, 255}
492 REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
493 REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
494 REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
495 REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
498 auto mask = tvg::Shape::gen();
500 REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
503 auto shape3 = tvg::Shape::gen();
505 auto shape4 = tvg::Shape::gen();
507 REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
508 REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
510 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
511 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
514 auto scene = tvg::Scene::gen();
516 REQUIRE(scene->push(move(shape3)) == Result::Success);
517 REQUIRE(scene->push(move(shape4)) == Result::Success);
518 REQUIRE(scene->composite(move(mask), tvg::CompositeMethod::AlphaMask) == Result::Success);
519 REQUIRE(canvas->push(move(scene)) == Result::Success);
522 REQUIRE(canvas->draw() == Result::Success);
523 REQUIRE(canvas->sync() == Result::Success);
525 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
529 TEST_CASE("Filling InvAlphaMask", "[tvgSwEngine]")
531 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
533 auto canvas = SwCanvas::gen();
536 uint32_t buffer[100*100];
537 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
540 auto linearFill = LinearGradient::gen();
543 auto radialFill = RadialGradient::gen();
546 Fill::ColorStop cs[4] = {
548 {0.2f, 50, 25, 50, 25},
549 {0.5f, 100, 100, 100, 125},
550 {1.0f, 255, 255, 255, 255}
552 REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
553 REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
554 REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
555 REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
558 auto mask = tvg::Shape::gen();
560 REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
563 auto shape3 = tvg::Shape::gen();
565 auto shape4 = tvg::Shape::gen();
567 REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
568 REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
570 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
571 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
574 auto scene = tvg::Scene::gen();
576 REQUIRE(scene->push(move(shape3)) == Result::Success);
577 REQUIRE(scene->push(move(shape4)) == Result::Success);
578 REQUIRE(scene->composite(move(mask), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
579 REQUIRE(canvas->push(move(scene)) == Result::Success);
582 REQUIRE(canvas->draw() == Result::Success);
583 REQUIRE(canvas->sync() == Result::Success);
585 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
589 TEST_CASE("Filling ClipPath", "[tvgSwEngine]")
591 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
593 auto canvas = SwCanvas::gen();
596 uint32_t buffer[100*100];
597 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
600 auto linearFill = LinearGradient::gen();
603 auto radialFill = RadialGradient::gen();
606 Fill::ColorStop cs[4] = {
608 {0.2f, 50, 25, 50, 25},
609 {0.5f, 100, 100, 100, 125},
610 {1.0f, 255, 255, 255, 255}
612 REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
613 REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
614 REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
615 REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
618 auto mask = tvg::Shape::gen();
620 REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
623 auto shape3 = tvg::Shape::gen();
625 auto shape4 = tvg::Shape::gen();
627 REQUIRE(shape3->appendRect(0, 0, 50, 50, 0, 0) == Result::Success);
628 REQUIRE(shape4->appendRect(50, 0, 50, 50, 0, 0) == Result::Success);
630 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
631 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
634 auto scene = tvg::Scene::gen();
636 REQUIRE(scene->push(move(shape3)) == Result::Success);
637 REQUIRE(scene->push(move(shape4)) == Result::Success);
638 REQUIRE(scene->composite(move(mask), tvg::CompositeMethod::ClipPath) == Result::Success);
639 REQUIRE(canvas->push(move(scene)) == Result::Success);
642 REQUIRE(canvas->draw() == Result::Success);
643 REQUIRE(canvas->sync() == Result::Success);
645 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
649 TEST_CASE("RLE Filling Draw", "[tvgSwEngine]")
651 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
653 auto canvas = SwCanvas::gen();
656 uint32_t buffer[100*100];
657 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
660 auto linearFill = LinearGradient::gen();
663 auto radialFill = RadialGradient::gen();
666 Fill::ColorStop cs[4] = {
668 {0.2f, 50, 25, 50, 25},
669 {0.5f, 100, 100, 100, 125},
670 {1.0f, 255, 255, 255, 255}
672 REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
673 REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
674 REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
675 REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
678 auto shape3 = tvg::Shape::gen();
680 auto shape4 = tvg::Shape::gen();
682 REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
683 REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
685 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
686 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
688 REQUIRE(canvas->push(move(shape3)) == Result::Success);
689 REQUIRE(canvas->push(move(shape4)) == Result::Success);
692 REQUIRE(canvas->draw() == Result::Success);
693 REQUIRE(canvas->sync() == Result::Success);
695 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
699 TEST_CASE("RLE Filling Opaque Draw", "[tvgSwEngine]")
701 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
703 auto canvas = SwCanvas::gen();
706 uint32_t buffer[100*100];
707 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
710 auto linearFill = LinearGradient::gen();
713 auto radialFill = RadialGradient::gen();
716 Fill::ColorStop cs[4] = {
717 {0.0f, 0, 0, 0, 255},
718 {0.2f, 50, 25, 50, 255},
719 {0.5f, 100, 100, 100, 255},
720 {1.0f, 255, 255, 255, 255}
722 REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
723 REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
724 REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
725 REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
728 auto shape3 = tvg::Shape::gen();
730 auto shape4 = tvg::Shape::gen();
732 REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
733 REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
735 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
736 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
738 REQUIRE(canvas->push(move(shape3)) == Result::Success);
739 REQUIRE(canvas->push(move(shape4)) == Result::Success);
742 REQUIRE(canvas->draw() == Result::Success);
743 REQUIRE(canvas->sync() == Result::Success);
745 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
749 TEST_CASE("RLE Filling AlphaMask", "[tvgSwEngine]")
751 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
753 auto canvas = SwCanvas::gen();
756 uint32_t buffer[100*100];
757 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
760 auto linearFill = LinearGradient::gen();
763 auto radialFill = RadialGradient::gen();
766 Fill::ColorStop cs[4] = {
768 {0.2f, 50, 25, 50, 25},
769 {0.5f, 100, 100, 100, 125},
770 {1.0f, 255, 255, 255, 255}
772 REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
773 REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
774 REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
775 REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
778 auto mask = tvg::Shape::gen();
780 REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
783 auto shape3 = tvg::Shape::gen();
785 auto shape4 = tvg::Shape::gen();
787 REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
788 REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
790 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
791 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
794 auto scene = tvg::Scene::gen();
796 REQUIRE(scene->push(move(shape3)) == Result::Success);
797 REQUIRE(scene->push(move(shape4)) == Result::Success);
798 REQUIRE(scene->composite(move(mask), tvg::CompositeMethod::AlphaMask) == Result::Success);
799 REQUIRE(canvas->push(move(scene)) == Result::Success);
802 REQUIRE(canvas->draw() == Result::Success);
803 REQUIRE(canvas->sync() == Result::Success);
805 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
809 TEST_CASE("RLE Filling InvAlphaMask", "[tvgSwEngine]")
811 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
813 auto canvas = SwCanvas::gen();
816 uint32_t buffer[100*100];
817 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
820 auto linearFill = LinearGradient::gen();
823 auto radialFill = RadialGradient::gen();
826 Fill::ColorStop cs[4] = {
828 {0.2f, 50, 25, 50, 25},
829 {0.5f, 100, 100, 100, 125},
830 {1.0f, 255, 255, 255, 255}
832 REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
833 REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
834 REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
835 REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
838 auto mask = tvg::Shape::gen();
840 REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
843 auto shape3 = tvg::Shape::gen();
845 auto shape4 = tvg::Shape::gen();
847 REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
848 REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
850 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
851 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
854 auto scene = tvg::Scene::gen();
856 REQUIRE(scene->push(move(shape3)) == Result::Success);
857 REQUIRE(scene->push(move(shape4)) == Result::Success);
858 REQUIRE(scene->composite(move(mask), tvg::CompositeMethod::InvAlphaMask) == Result::Success);
859 REQUIRE(canvas->push(move(scene)) == Result::Success);
862 REQUIRE(canvas->draw() == Result::Success);
863 REQUIRE(canvas->sync() == Result::Success);
865 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);
869 TEST_CASE("RLE Filling ClipPath", "[tvgSwEngine]")
871 REQUIRE(Initializer::init(CanvasEngine::Sw, 0) == Result::Success);
873 auto canvas = SwCanvas::gen();
876 uint32_t buffer[100*100];
877 REQUIRE(canvas->target(buffer, 100, 100, 100, SwCanvas::Colorspace::ABGR8888) == Result::Success);
880 auto linearFill = LinearGradient::gen();
883 auto radialFill = RadialGradient::gen();
886 Fill::ColorStop cs[4] = {
888 {0.2f, 50, 25, 50, 25},
889 {0.5f, 100, 100, 100, 125},
890 {1.0f, 255, 255, 255, 255}
892 REQUIRE(linearFill->colorStops(cs, 4) == Result::Success);
893 REQUIRE(radialFill->colorStops(cs, 4) == Result::Success);
894 REQUIRE(linearFill->linear(0.0f, 0.0f, 100.0f, 120.0f) == Result::Success);
895 REQUIRE(radialFill->radial(50.0f, 50.0f, 50.0f) == Result::Success);
898 auto mask = tvg::Shape::gen();
900 REQUIRE(mask->appendCircle(50, 50, 50, 50) == Result::Success);
903 auto shape3 = tvg::Shape::gen();
905 auto shape4 = tvg::Shape::gen();
907 REQUIRE(shape3->appendRect(0, 0, 50, 50, 10, 10) == Result::Success);
908 REQUIRE(shape4->appendRect(50, 0, 50, 50, 10, 10) == Result::Success);
910 REQUIRE(shape3->fill(move(linearFill)) == Result::Success);
911 REQUIRE(shape4->fill(move(radialFill)) == Result::Success);
914 auto scene = tvg::Scene::gen();
916 REQUIRE(scene->push(move(shape3)) == Result::Success);
917 REQUIRE(scene->push(move(shape4)) == Result::Success);
918 REQUIRE(scene->composite(move(mask), tvg::CompositeMethod::ClipPath) == Result::Success);
919 REQUIRE(canvas->push(move(scene)) == Result::Success);
922 REQUIRE(canvas->draw() == Result::Success);
923 REQUIRE(canvas->sync() == Result::Success);
925 REQUIRE(Initializer::term(CanvasEngine::Sw) == Result::Success);