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