1b5974e6b52271d7211a206630af95f379248275
[platform/core/uifw/dali-adaptor.git] / dali / internal / vector-image / common / vector-image-renderer-impl.cpp
1 /*
2  * Copyright (c) 2020 Samsung Electronics Co., Ltd.
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
18 // CLASS HEADER
19 #include <dali/internal/vector-image/common/vector-image-renderer-impl.h>
20
21 // EXTERNAL INCLUDES
22 #include <dali/integration-api/debug.h>
23 #include <dali/public-api/object/type-registry.h>
24
25 // INTERNAL INCLUDES
26 #include <third-party/nanosvg/nanosvg.h>
27 #include <third-party/nanosvg/nanosvgrast.h>
28
29 namespace Dali
30 {
31
32 namespace Internal
33 {
34
35 namespace Adaptor
36 {
37
38 namespace // unnamed namespace
39 {
40 const char* const UNITS("px");
41
42 // Type Registration
43 Dali::BaseHandle Create()
44 {
45   return Dali::BaseHandle();
46 }
47
48 Dali::TypeRegistration type( typeid( Dali::VectorImageRenderer ), typeid( Dali::BaseHandle ), Create );
49
50 } // unnamed namespace
51
52 VectorImageRendererPtr VectorImageRenderer::New()
53 {
54   VectorImageRendererPtr renderer = new VectorImageRenderer();
55   if(renderer)
56   {
57     renderer->Initialize();
58   }
59   return renderer;
60 }
61
62 VectorImageRenderer::VectorImageRenderer()
63 : mPlugin(std::string()),
64   mParsedImage(nullptr),
65   mRasterizer(nullptr)
66 {
67 }
68
69 VectorImageRenderer::~VectorImageRenderer()
70 {
71   if(mParsedImage)
72   {
73     nsvgDelete(mParsedImage);
74   }
75
76   if(mRasterizer)
77   {
78     nsvgDeleteRasterizer(mRasterizer);
79   }
80 }
81
82 void VectorImageRenderer::Initialize()
83 {
84   if(!mPlugin.IsValid())
85   {
86     mRasterizer = nsvgCreateRasterizer();
87   }
88 }
89
90 bool VectorImageRenderer::Load(const Vector<uint8_t>& data, float dpi)
91 {
92   if(mPlugin.IsValid())
93   {
94     return mPlugin.Load(data);
95   }
96   else
97   {
98     mParsedImage = nsvgParse(reinterpret_cast<char*>(data.Begin()), UNITS, dpi);
99     if(!mParsedImage)
100     {
101       DALI_LOG_ERROR("VectorImageRenderer::Load: nsvgParse failed\n");
102       return false;
103     }
104     return true;
105   }
106 }
107
108 bool VectorImageRenderer::Rasterize(Dali::Devel::PixelBuffer& buffer, float scale)
109 {
110   if(mPlugin.IsValid())
111   {
112     return mPlugin.Rasterize(buffer, scale);
113   }
114   else
115   {
116     if(mParsedImage != nullptr)
117     {
118       int stride = buffer.GetWidth() * Pixel::GetBytesPerPixel(buffer.GetPixelFormat());
119       nsvgRasterize(mRasterizer, mParsedImage, 0.0f, 0.0f, scale, buffer.GetBuffer(), buffer.GetWidth(), buffer.GetHeight(), stride);
120       return true;
121     }
122     return false;
123   }
124 }
125
126 void VectorImageRenderer::GetDefaultSize( uint32_t& width, uint32_t& height ) const
127 {
128   if(mPlugin.IsValid())
129   {
130     mPlugin.GetDefaultSize(width, height);
131   }
132   else
133   {
134     if(mParsedImage)
135     {
136       width  = mParsedImage->width;
137       height = mParsedImage->height;
138     }
139   }
140 }
141
142 } // namespace Adaptor
143
144 } // namespace Internal
145
146 } // namespace Dali