• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef FOUNDATION_ACE_INTERFACE_INNERKITS_JS_LAYERED_ICON_H
17 #define FOUNDATION_ACE_INTERFACE_INNERKITS_JS_LAYERED_ICON_H
18 
19 #define ACE_FORCE_EXPORT __attribute__((visibility("default")))
20 
21 #ifndef ACE_EXPORT
22 #ifndef HIDDEN_SYMBOL
23 #define ACE_EXPORT ACE_FORCE_EXPORT
24 #else
25 #define ACE_EXPORT
26 #endif
27 #endif
28 
29 #include <optional>
30 #include <string>
31 
32 #include "foundation/arkui/ace_engine/interfaces/inner_api/form_render/include/form_renderer_hilog.h"
33 #include "image_converter.h"
34 #include "include/core/SkBlendMode.h"
35 #include "include/core/SkCanvas.h"
36 #include "include/core/SkPaint.h"
37 #include "resource_manager.h"
38 
39 #include "base/memory/ace_type.h"
40 
41 namespace OHOS::Ace::Napi {
42 using OptionalPixelMap = std::optional<std::shared_ptr<Media::PixelMap>>;
43 class ACE_EXPORT DrawableDescriptor {
44 public:
45     enum class DrawableType {
46         BASE,
47         LAYERED,
48     };
49     DrawableDescriptor() = default;
DrawableDescriptor(std::shared_ptr<Media::PixelMap> pixelMap)50     explicit DrawableDescriptor(std::shared_ptr<Media::PixelMap> pixelMap) : pixelMap_(std::move(pixelMap)) {};
DrawableDescriptor(std::unique_ptr<uint8_t[]> mediaData,size_t len)51     DrawableDescriptor(std::unique_ptr<uint8_t[]> mediaData, size_t len)
52         : mediaData_(std::move(mediaData)), len_(len) {};
53     virtual ~DrawableDescriptor() = default;
54     virtual std::shared_ptr<Media::PixelMap> GetPixelMap();
55 
56 private:
57     bool GetPixelMapFromBuffer();
58 
59     std::unique_ptr<uint8_t[]> mediaData_;
60     size_t len_ = 0;
61     OptionalPixelMap pixelMap_;
62 };
63 
64 class ACE_EXPORT LayeredDrawableDescriptor : public DrawableDescriptor {
65 public:
LayeredDrawableDescriptor(std::unique_ptr<uint8_t[]> jsonBuf,size_t len,std::shared_ptr<Global::Resource::ResourceManager> resourceMgr)66     LayeredDrawableDescriptor(
67         std::unique_ptr<uint8_t[]> jsonBuf, size_t len, std::shared_ptr<Global::Resource::ResourceManager> resourceMgr)
68         : jsonBuf_(std::move(jsonBuf)), len_(len), resourceMgr_(std::move(resourceMgr)) {};
69     ~LayeredDrawableDescriptor() override = default;
70     std::unique_ptr<DrawableDescriptor> GetForeground();
71     std::unique_ptr<DrawableDescriptor> GetBackground();
72     std::unique_ptr<DrawableDescriptor> GetMask();
73     std::shared_ptr<Media::PixelMap> GetPixelMap() override;
74     static std::string GetStaticMaskClipPath();
75 
76 private:
77     friend class ImageConverter;
78     std::unique_ptr<Media::ImageSource> CreateImageSource(const char* item, uint32_t& errorCode);
79     bool GetPixelMapFromJsonBuf(bool isBackground);
80     bool GetDefaultMask();
81     bool GetMaskByName(const std::string& name);
82     bool CreatePixelMap();
83     void DrawOntoCanvas(
84         const std::shared_ptr<SkBitmap>& bitMap, float width, float height, SkCanvas& canvas, const SkPaint& paint);
85 
86     std::unique_ptr<uint8_t[]> jsonBuf_;
87     size_t len_ = 0;
88     const std::shared_ptr<Global::Resource::ResourceManager> resourceMgr_;
89     OptionalPixelMap foreground_;
90     OptionalPixelMap background_;
91     OptionalPixelMap mask_;
92     OptionalPixelMap layeredPixelMap_;
93 };
94 
95 class DrawableDescriptorFactory {
96 public:
97     using DrawableType = DrawableDescriptor::DrawableType;
98     using ResourceManager = Global::Resource::ResourceManager;
99     using RState = Global::Resource::RState;
Create(int32_t id,const std::shared_ptr<ResourceManager> & resourceMgr,RState & state,DrawableType & drawableType,uint32_t density)100     static std::unique_ptr<DrawableDescriptor> Create(int32_t id, const std::shared_ptr<ResourceManager>& resourceMgr,
101         RState& state, DrawableType& drawableType, uint32_t density)
102     {
103         std::string type;
104         size_t len;
105         std::unique_ptr<uint8_t[]> jsonBuf;
106         state = resourceMgr->GetDrawableInfoById(id, type, len, jsonBuf, density);
107         if (state != Global::Resource::SUCCESS) {
108             HILOG_ERROR("Failed to get drawable info from resmgr");
109             return nullptr;
110         }
111         if (type == "json") {
112             HILOG_DEBUG("Create LayeredDrawableDescriptor object");
113             drawableType = DrawableDescriptor::DrawableType::LAYERED;
114             state = Global::Resource::SUCCESS;
115             return std::make_unique<LayeredDrawableDescriptor>(std::move(jsonBuf), len, resourceMgr);
116         }
117         if (type == "png" || type == "jpg" || type == "bmp" || type == "svg" || type == "gif" || type == "webp") {
118             HILOG_DEBUG("Create DrawableDescriptor object");
119             drawableType = DrawableDescriptor::DrawableType::BASE;
120             state = Global::Resource::SUCCESS;
121             return std::make_unique<DrawableDescriptor>(std::move(jsonBuf), len);
122         }
123         HILOG_ERROR("unknow resource type: %{public}s", type.c_str());
124         state = Global::Resource::INVALID_FORMAT;
125         return nullptr;
126     }
127 
Create(const char * name,const std::shared_ptr<ResourceManager> & resourceMgr,RState & state,DrawableType & drawableType,uint32_t density)128     static std::unique_ptr<DrawableDescriptor> Create(const char* name,
129         const std::shared_ptr<ResourceManager>& resourceMgr, RState& state, DrawableType& drawableType,
130         uint32_t density)
131     {
132         std::string type;
133         size_t len;
134         std::unique_ptr<uint8_t[]> jsonBuf;
135         state = resourceMgr->GetDrawableInfoByName(name, type, len, jsonBuf, density);
136         if (state != Global::Resource::SUCCESS) {
137             HILOG_ERROR("Failed to get drawable info from resmgr");
138             return nullptr;
139         }
140         if (type == "json") {
141             HILOG_DEBUG("Create LayeredDrawableDescriptor object");
142             drawableType = DrawableDescriptor::DrawableType::LAYERED;
143             state = Global::Resource::SUCCESS;
144             return std::make_unique<LayeredDrawableDescriptor>(std::move(jsonBuf), len, resourceMgr);
145         }
146         if (type == "png" || type == "jpg" || type == "bmp" || type == "svg" || type == "gif" || type == "webp") {
147             HILOG_DEBUG("Create DrawableDescriptor object");
148             drawableType = DrawableDescriptor::DrawableType::BASE;
149             state = Global::Resource::SUCCESS;
150             return std::make_unique<DrawableDescriptor>(std::move(jsonBuf), len);
151         }
152         HILOG_ERROR("unknow resource type: %{public}s", type.c_str());
153         state = Global::Resource::INVALID_FORMAT;
154         return nullptr;
155     }
156 };
157 } // namespace OHOS::Ace::Napi
158 #endif // #define FOUNDATION_ACE_INTERFACE_INNERKITS_JS_LAYERED_ICON_H
159