sw_engine: concrete shape rendering sequence.
[platform/core/graphics/tizenvg.git] / src / lib / tvgCanvasBase.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 _TVG_CANVAS_BASE_CPP_
18 #define _TVG_CANVAS_BASE_CPP_
19
20 #include "tvgCommon.h"
21
22
23 struct CanvasBase
24 {
25     vector<PaintNode*> nodes;
26     RenderMethod*      renderer;
27
28     CanvasBase(RenderMethod *pRenderer):renderer(pRenderer)
29     {
30         renderer->ref();
31     }
32
33     ~CanvasBase()
34     {
35        clear();
36        renderer->unref();
37     }
38
39     int reserve(size_t n)
40     {
41         nodes.reserve(n);
42
43         return 0;
44     }
45
46     int clear()
47     {
48         assert(renderer);
49
50         auto ret = 0;
51
52         for (auto node : nodes) {
53             if (SceneNode *scene = dynamic_cast<SceneNode *>(node)) {
54                 cout << "TODO: " <<  scene << endl;
55             } else if (ShapeNode *shape = dynamic_cast<ShapeNode *>(node)) {
56                 ret |= renderer->dispose(*shape, shape->engine());
57             }
58             delete(node);
59         }
60         nodes.clear();
61
62         return ret;
63     }
64
65     int update()
66     {
67         assert(renderer);
68
69         auto ret = 0;
70
71         for(auto node: nodes) {
72             ret |= node->update(renderer);
73         }
74
75         return ret;
76     }
77
78     int push(unique_ptr<PaintNode> paint)
79     {
80         PaintNode *node = paint.release();
81         assert(node);
82         nodes.push_back(node);
83         return node->update(renderer);
84     }
85
86     int draw()
87     {
88         assert(renderer);
89
90         auto ret = 0;
91
92         for(auto node: nodes) {
93             if (SceneNode *scene = dynamic_cast<SceneNode *>(node)) {
94                 cout << "TODO: " <<  scene << endl;
95             } else if (ShapeNode *shape = dynamic_cast<ShapeNode *>(node)) {
96                 ret |= renderer->render(*shape, shape->engine());
97             }
98         }
99         return ret;
100     }
101
102 };
103
104 #endif /* _TVG_CANVAS_BASE_CPP_ */