common: nothing was rendered after an empty masked node came across
[platform/core/graphics/tizenvg.git] / src / lib / tvgLinearGradient.cpp
1 /*
2  * Copyright (c) 2020-2021 Samsung Electronics Co., Ltd. All rights reserved.
3
4  * Permission is hereby granted, free of charge, to any person obtaining a copy
5  * of this software and associated documentation files (the "Software"), to deal
6  * in the Software without restriction, including without limitation the rights
7  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8  * copies of the Software, and to permit persons to whom the Software is
9  * furnished to do so, subject to the following conditions:
10
11  * The above copyright notice and this permission notice shall be included in all
12  * copies or substantial portions of the Software.
13
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20  * SOFTWARE.
21  */
22 #include <float.h>
23 #include <math.h>
24 #include "tvgFill.h"
25
26 /************************************************************************/
27 /* Internal Class Implementation                                        */
28 /************************************************************************/
29
30 struct LinearGradient::Impl
31 {
32     float x1 = 0;
33     float y1 = 0;
34     float x2 = 0;
35     float y2 = 0;
36
37     Fill* duplicate()
38     {
39         auto ret = LinearGradient::gen();
40         if (!ret) return nullptr;
41
42         ret->pImpl->x1 = x1;
43         ret->pImpl->y1 = y1;
44         ret->pImpl->x2 = x2;
45         ret->pImpl->y2 = y2;
46
47         return ret.release();
48     }
49 };
50
51 /************************************************************************/
52 /* External Class Implementation                                        */
53 /************************************************************************/
54
55 LinearGradient::LinearGradient():pImpl(new Impl())
56 {
57     _id = TVG_CLASS_ID_LINEAR;
58     Fill::pImpl->method(new FillDup<LinearGradient::Impl>(pImpl));
59 }
60
61
62 LinearGradient::~LinearGradient()
63 {
64     delete(pImpl);
65 }
66
67
68 Result LinearGradient::linear(float x1, float y1, float x2, float y2) noexcept
69 {
70     pImpl->x1 = x1;
71     pImpl->y1 = y1;
72     pImpl->x2 = x2;
73     pImpl->y2 = y2;
74
75     return Result::Success;
76 }
77
78
79 Result LinearGradient::linear(float* x1, float* y1, float* x2, float* y2) const noexcept
80 {
81     if (x1) *x1 = pImpl->x1;
82     if (x2) *x2 = pImpl->x2;
83     if (y1) *y1 = pImpl->y1;
84     if (y2) *y2 = pImpl->y2;
85
86     return Result::Success;
87 }
88
89
90 unique_ptr<LinearGradient> LinearGradient::gen() noexcept
91 {
92     return unique_ptr<LinearGradient>(new LinearGradient);
93 }
94
95
96 uint32_t LinearGradient::identifier() noexcept
97 {
98     return TVG_CLASS_ID_LINEAR;
99 }