24f2d3f5e8e30e23453e483e304d3b33db40bd5e
[platform/core/graphics/tizenvg.git] / inc / tizenvg.h
1 /*
2  * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  *  Licensed under the Apache License, Version 2.0 (the "License");
5  *  you may not use this file except in compliance with the License.
6  *  You may obtain a copy of the License at
7  *
8  *               http://www.apache.org/licenses/LICENSE-2.0
9  *
10  *  Unless required by applicable law or agreed to in writing, software
11  *  distributed under the License is distributed on an "AS IS" BASIS,
12  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  *  See the License for the specific language governing permissions and
14  *  limitations under the License.
15  *
16  */
17 #ifndef _TIZENVG_H_
18 #define _TIZENVG_H_
19
20 #include <memory>
21
22 #ifdef TIZENVG_BUILD
23     #define TIZENVG_EXPORT __attribute__ ((visibility ("default")))
24 #else
25     #define TIZENVG_EXPORT
26 #endif
27
28 #ifdef  LOG_TAG
29 #undef  LOG_TAG
30 #endif
31 #define LOG_TAG "TIZENVG"
32
33
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37
38 #define _TIZENVG_DECLARE_PRIVATE(A) \
39 private: \
40     struct Impl; \
41     std::unique_ptr<Impl> pImpl; \
42     A(const A&) = delete; \
43     const A& operator=(const A&) = delete; \
44     A()
45
46 #define _TIZENVG_DISABLE_CTOR(A) \
47     A() = delete; \
48     ~A() = delete
49
50 namespace tvg
51 {
52
53 enum class TIZENVG_EXPORT PathCommand { Close, MoveTo, LineTo, CubicTo };
54
55 class RenderMethod;
56
57 struct Point
58 {
59     float x, y;
60 };
61
62
63 /**
64  * @class PaintNode
65  *
66  * @ingroup TizenVG
67  *
68  * @brief description...
69  *
70  */
71 class TIZENVG_EXPORT PaintNode
72 {
73 public:
74     virtual ~PaintNode() {}
75     virtual int update(RenderMethod* engine) = 0;
76 };
77
78
79 /**
80  * @class ShapeNode
81  *
82  * @ingroup TizenVG
83  *
84  * @brief description...
85  *
86  */
87 class TIZENVG_EXPORT ShapeNode final : public PaintNode
88 {
89 public:
90     ~ShapeNode();
91
92     int update(RenderMethod* engine) noexcept override;
93     int clear() noexcept;
94
95     int appendRect(float x, float y, float w, float h, float radius) noexcept;
96     int appendCircle(float cx, float cy, float radius) noexcept;
97
98     int fill(size_t r, size_t g, size_t b, size_t a) noexcept;
99
100     int pathCommands(const PathCommand** cmds) const noexcept;
101     int pathCoords(const Point** pts) const noexcept;
102     int fill(size_t* r, size_t* g, size_t* b, size_t* a) const noexcept;
103
104     static std::unique_ptr<ShapeNode> gen() noexcept;
105
106     //FIXME: Ugly... Better design?
107     void *engine() noexcept;
108
109     _TIZENVG_DECLARE_PRIVATE(ShapeNode);
110 };
111
112
113 /**
114  * @class SceneNode
115  *
116  * @ingroup TizenVG
117  *
118  * @brief description...
119  *
120  */
121 class TIZENVG_EXPORT SceneNode final : public PaintNode
122 {
123 public:
124     ~SceneNode();
125
126     int update(RenderMethod* engine) noexcept override;
127
128     int push(std::unique_ptr<ShapeNode> shape) noexcept;
129
130     static std::unique_ptr<SceneNode> gen() noexcept;
131
132     _TIZENVG_DECLARE_PRIVATE(SceneNode);
133 };
134
135
136 /**
137  * @class SwCanvas
138  *
139  * @ingroup TizenVG
140  *
141   @brief description...
142  *
143  */
144 class TIZENVG_EXPORT SwCanvas final
145 {
146 public:
147     ~SwCanvas();
148
149     int push(std::unique_ptr<PaintNode> paint) noexcept;
150     int clear() noexcept;
151
152     int update() noexcept;
153     int draw(bool async = true) noexcept;
154     int sync() noexcept;
155     RenderMethod* engine() noexcept;
156
157     int target(uint32_t* buffer, size_t stride, size_t height) noexcept;
158
159     static std::unique_ptr<SwCanvas> gen(uint32_t* buffer = nullptr, size_t stride = 0, size_t height = 0) noexcept;
160
161     _TIZENVG_DECLARE_PRIVATE(SwCanvas);
162 };
163
164
165 /**
166  * @class GlCanvas
167  *
168  * @ingroup TizenVG
169  *
170  * @brief description...
171  *
172  */
173 class TIZENVG_EXPORT GlCanvas final
174 {
175 public:
176     ~GlCanvas();
177
178     int push(std::unique_ptr<PaintNode> paint) noexcept;
179     int clear() noexcept;
180
181     //TODO: Gl Specific methods. Need gl backend configuration methods as well.
182     int update() noexcept;
183     int draw(bool async = true) noexcept;
184     int sync() noexcept { return 0; }
185     RenderMethod* engine() noexcept;
186
187     static std::unique_ptr<GlCanvas> gen() noexcept;
188
189     _TIZENVG_DECLARE_PRIVATE(GlCanvas);
190 };
191
192
193 /**
194  * @class Engine
195  *
196  * @ingroup TizenVG
197  *
198  * @brief description...
199  *
200  */
201 class TIZENVG_EXPORT Engine final
202 {
203 public:
204     /**
205      * @brief ...
206      *
207      * @param[in] arg ...
208      *
209      * @note ...
210      *
211      * @return ...
212      *
213      * @see ...
214      */
215     static int init() noexcept;
216     static int term() noexcept;
217
218     _TIZENVG_DISABLE_CTOR(Engine);
219 };
220
221 } //namespace
222
223 #ifdef __cplusplus
224 }
225 #endif
226
227 #endif //_TIZENVG_H_