1 #ifndef DALI_TOOLKIT_INTERNAL_SVG_VISUAL_H
2 #define DALI_TOOLKIT_INTERNAL_SVG_VISUAL_H
5 * Copyright (c) 2022 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 #include <dali/public-api/common/intrusive-ptr.h>
23 #include <dali/public-api/object/weak-handle.h>
26 #include <dali-toolkit/internal/visuals/visual-base-impl.h>
27 #include <dali-toolkit/internal/visuals/visual-url.h>
35 class ImageVisualShaderFactory;
37 typedef IntrusivePtr<SvgVisual> SvgVisualPtr;
40 * The visual which renders a svg image
42 * The following property is essential
44 * | %Property Name | Type |
45 * |--------------------------|------------------|
49 class SvgVisual : public Visual::Base
53 * @brief Create the SVG Visual using the image URL.
55 * The visual will parse the SVG image once it is set.
56 * And rasterize it into BufferImage synchronously when the associated actor is put on stage, and destroy the BufferImage when it is off stage
58 * @param[in] factoryCache A pointer pointing to the VisualFactoryCache object
59 * @param[in] shaderFactory The ImageVisualShaderFactory object
60 * @param[in] imageUrl The URL to svg resource to use
61 * @param[in] properties A Property::Map containing settings for this visual
62 * @return A smart-pointer to the newly allocated visual.
64 static SvgVisualPtr New(VisualFactoryCache& factoryCache, ImageVisualShaderFactory& shaderFactory, const VisualUrl& imageUrl, const Property::Map& properties);
67 * @brief Create the SVG Visual using the image URL.
69 * The visual will parse the SVG image once it is set.
70 * And rasterize it into BufferImage synchronously when the associated actor is put on stage, and destroy the BufferImage when it is off stage
72 * @param[in] factoryCache A pointer pointing to the VisualFactoryCache object
73 * @param[in] shaderFactory The ImageVisualShaderFactory object
74 * @param[in] imageUrl The URL to svg resource to use
75 * @param[in] size The width and height of the rasterized buffer. The visual size will be used if these are 0.
76 * @return A smart-pointer to the newly allocated visual.
78 static SvgVisualPtr New(VisualFactoryCache& factoryCache, ImageVisualShaderFactory& shaderFactory, const VisualUrl& imageUrl, ImageDimensions size = ImageDimensions());
80 public: // from Visual
82 * @copydoc Visual::Base::GetNaturalSize
84 void GetNaturalSize(Vector2& naturalSize) override;
87 * @copydoc Visual::Base::CreatePropertyMap
89 void DoCreatePropertyMap(Property::Map& map) const override;
92 * @copydoc Visual::Base::CreateInstancePropertyMap
94 void DoCreateInstancePropertyMap(Property::Map& map) const override;
97 * @copydoc Visual::Base::EnablePreMultipliedAlpha
99 void EnablePreMultipliedAlpha(bool preMultiplied) override;
103 * @brief Constructor.
105 * @param[in] factoryCache A pointer pointing to the VisualFactoryCache object
106 * @param[in] shaderFactory The ImageVisualShaderFactory object
107 * @param[in] imageUrl The URL to svg resource to use
108 * @param[in] size The width and height of the rasterized buffer. The visual size will be used if these are 0.
110 SvgVisual(VisualFactoryCache& factoryCache, ImageVisualShaderFactory& shaderFactory, const VisualUrl& imageUrl, ImageDimensions size);
113 * @brief A reference counted object may only be deleted by calling Unreference().
115 virtual ~SvgVisual();
118 * @copydoc Visual::Base::OnInitialize
120 void OnInitialize() override;
123 * @copydoc Visual::Base::DoSetProperties
125 void DoSetProperties(const Property::Map& propertyMap) override;
128 * @copydoc Visual::Base::DoSetOnScene
130 void DoSetOnScene(Actor& actor) override;
133 * @copydoc Visual::Base::DoSetOffScene
135 void DoSetOffScene(Actor& actor) override;
138 * @copydoc Visual::Base::OnSetTransform
140 void OnSetTransform() override;
143 * @copydoc Visual::Base::UpdateShader
145 void UpdateShader() override;
148 * @copydoc Visual::Base::GenerateShader
150 Shader GenerateShader() const override;
154 * @bried Apply the rasterized image to the visual.
156 * @param[in] rasterizedPixelData The pixel buffer with the rasterized pixels
157 * @param[in] success Whether the task succeeds.
159 void ApplyRasterizedImage(PixelData rasterizedPixelData, bool success);
163 * @bried Rasterize the svg with the given size, and add it to the visual.
165 * @param[in] size The target size of the SVG rasterization.
167 void AddRasterizationTask(const Vector2& size);
170 * Helper method to set individual values by index key.
171 * @param[in] index The index key of the value
172 * @param[in] value The value
174 void DoSetProperty(Property::Index index, const Property::Value& value);
177 SvgVisual(const SvgVisual& svgRenderer);
180 SvgVisual& operator=(const SvgVisual& svgRenderer);
183 ImageVisualShaderFactory& mImageVisualShaderFactory;
186 VectorImageRenderer mVectorRenderer;
187 uint32_t mDefaultWidth;
188 uint32_t mDefaultHeight;
189 WeakHandle<Actor> mPlacementActor;
190 Vector2 mRasterizedSize;
191 Dali::ImageDimensions mDesiredSize{};
193 bool mAttemptAtlasing; ///< If true will attempt atlasing, otherwise create unique texture
196 } // namespace Internal
198 } // namespace Toolkit
202 #endif /* DALI_TOOLKIT_INTERNAL_SVG_VISUAL_H */