e8f54b251ecb08271b9622d89f8e9be03b073bc4
[platform/core/uifw/lottie-player.git] / src / vector / vpainter.cpp
1 /* 
2  * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved.
3  * 
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  * 
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  * 
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18
19 #include "vpainter.h"
20 #include "vdrawhelper.h"
21
22 V_BEGIN_NAMESPACE
23
24 class VPainterImpl {
25 public:
26     void drawRle(const VPoint &pos, const VRle &rle);
27     void drawRle(const VRle &rle, const VRle &clip);
28
29 public:
30     VRasterBuffer mBuffer;
31     VSpanData     mSpanData;
32 };
33
34 void VPainterImpl::drawRle(const VPoint &pos, const VRle &rle)
35 {
36     if (rle.empty()) return;
37     // mSpanData.updateSpanFunc();
38
39     if (!mSpanData.mUnclippedBlendFunc) return;
40
41     mSpanData.setPos(pos);
42
43     // do draw after applying clip.
44     rle.intersect(mSpanData.clipRect(), mSpanData.mUnclippedBlendFunc,
45                   &mSpanData);
46 }
47
48 void VPainterImpl::drawRle(const VRle &rle, const VRle &clip)
49 {
50     if (rle.empty() || clip.empty()) return;
51
52     if (!mSpanData.mUnclippedBlendFunc) return;
53
54     rle.intersect(clip, mSpanData.mUnclippedBlendFunc,
55                   &mSpanData);
56 }
57
58
59 VPainter::~VPainter()
60 {
61     delete mImpl;
62 }
63
64 VPainter::VPainter()
65 {
66     mImpl = new VPainterImpl;
67 }
68
69 VPainter::VPainter(VBitmap *buffer)
70 {
71     mImpl = new VPainterImpl;
72     begin(buffer);
73 }
74 bool VPainter::begin(VBitmap *buffer)
75 {
76     mImpl->mBuffer.prepare(buffer);
77     mImpl->mSpanData.init(&mImpl->mBuffer);
78     // TODO find a better api to clear the surface
79     mImpl->mBuffer.clear();
80     return true;
81 }
82 void VPainter::end() {}
83
84 void VPainter::setBrush(const VBrush &brush)
85 {
86     mImpl->mSpanData.setup(brush);
87 }
88
89 void VPainter::drawRle(const VPoint &pos, const VRle &rle)
90 {
91     mImpl->drawRle(pos, rle);
92 }
93
94 void VPainter::drawRle(const VRle &rle, const VRle &clip)
95 {
96     mImpl->drawRle(rle, clip);
97 }
98
99
100 VRect VPainter::clipBoundingRect() const
101 {
102     return mImpl->mSpanData.mSystemClip;
103 }
104
105 V_END_NAMESPACE