• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-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_FRAMEWORKS_CORE_IMAGE_IMAGE_PROVIDER_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_IMAGE_IMAGE_PROVIDER_H
18 
19 #include <string>
20 
21 #include "flutter/fml/memory/ref_counted.h"
22 #include "include/codec/SkCodec.h"
23 #ifdef USE_ROSEN_DRAWING
24 #include "draw/color.h"
25 #endif
26 
27 #include "base/memory/ace_type.h"
28 #include "base/resource/internal_resource.h"
29 #include "core/components/common/layout/constants.h"
30 #include "core/components_ng/render/canvas_image.h"
31 #ifdef USE_ROSEN_DRAWING
32 #include "core/components_ng/render/drawing_forward.h"
33 #endif
34 #include "core/image/image_loader.h"
35 #include "core/image/image_source_info.h"
36 #include "core/pipeline/pipeline_base.h"
37 
38 class SkSVGDOM;
39 namespace OHOS::Ace {
40 
41 class ImageObject;
42 
43 class SvgDom;
44 using ImageObjSuccessCallback = std::function<void(ImageSourceInfo, const RefPtr<ImageObject>)>;
45 using UploadSuccessCallback = std::function<void(ImageSourceInfo, const RefPtr<NG::CanvasImage>&)>;
46 using SvgDomSuccessCallback = std::function<void(ImageSourceInfo, const RefPtr<SvgDom>&)>;
47 using FailedCallback = std::function<void(ImageSourceInfo, const std::string&)>;
48 using CancelableTask = CancelableCallback<void()>;
49 using OnPostBackgroundTask = std::function<void(CancelableTask)>;
50 
51 struct LoadCallback {
LoadCallbackLoadCallback52     LoadCallback(
53         const ImageObjSuccessCallback& success, const UploadSuccessCallback& upload, const FailedCallback& failed)
54         : successCallback(success), uploadCallback(upload), failedCallback(failed)
55     {}
56     ~LoadCallback() = default;
57 
58     ImageObjSuccessCallback successCallback;
59     UploadSuccessCallback uploadCallback;
60     FailedCallback failedCallback;
61 };
62 
63 class FlutterRenderImage;
64 class ImageProvider {
65 public:
66     static void TryLoadImageInfo(const RefPtr<PipelineBase>& context, const std::string& src,
67         std::function<void(bool, int32_t, int32_t)>&& loadCallback);
68 
69     static void GetSVGImageDOMAsyncFromSrc(const std::string& src, std::function<void(const sk_sp<SkSVGDOM>&)> callback,
70         std::function<void()> failedCallback, const WeakPtr<PipelineBase> context, uint64_t svgThemeColor = 0,
71         OnPostBackgroundTask onBackgroundTaskPostCallback = nullptr);
72 
73 #ifndef USE_ROSEN_DRAWING
74     static void GetSVGImageDOMAsyncFromData(const sk_sp<SkData>& skData,
75         std::function<void(const sk_sp<SkSVGDOM>&)> callback, std::function<void()> failedCallback,
76         const WeakPtr<PipelineBase> context, uint64_t svgThemeColor = 0,
77         OnPostBackgroundTask onBackgroundTaskPostCallback = nullptr);
78 #else
79     static void GetSVGImageDOMAsyncFromData(const std::shared_ptr<RSData>& data,
80         std::function<void(const sk_sp<SkSVGDOM>&)> callback, std::function<void()> failedCallback,
81         const WeakPtr<PipelineBase> context, uint64_t svgThemeColor = 0,
82         OnPostBackgroundTask onBackgroundTaskPostCallback = nullptr);
83 #endif
84 
85 #ifndef USE_ROSEN_DRAWING
86     // upload image data to gpu context for painting asynchronously.
87     static void UploadImageToGPUForRender(const WeakPtr<PipelineBase> context, const sk_sp<SkImage>& image,
88         const sk_sp<SkData>& data, const std::function<void(sk_sp<SkImage>, sk_sp<SkData>)>&& callback,
89         const std::string src);
90 #else
91     // upload image data to gpu context for painting asynchronously.
92     static void UploadImageToGPUForRender(const WeakPtr<PipelineBase> context,
93         const std::shared_ptr<RSImage>& image,
94         const std::shared_ptr<RSData>& data,
95         const std::function<void(std::shared_ptr<RSImage>,
96         std::shared_ptr<RSData>)>&& callback,
97         const std::string src);
98 #endif
99 
100     // get out source image data asynchronously.
101     static void FetchImageObject(const ImageSourceInfo& imageInfo, const ImageObjSuccessCallback& successCallback,
102         const UploadSuccessCallback& uploadSuccessCallback, const FailedCallback& failedCallback,
103         const WeakPtr<PipelineBase>& context, bool syncMode, bool useSkiaSvg, bool needAutoResize,
104         const OnPostBackgroundTask& onBackgroundTaskPostCallback = nullptr);
105 
106 #ifndef USE_ROSEN_DRAWING
107     static sk_sp<SkImage> ResizeSkImage(
108         const sk_sp<SkImage>& rawImage, const std::string& src, Size imageSize, bool forceResize = false);
109 
110     static sk_sp<SkImage> ApplySizeToSkImage(
111         const sk_sp<SkImage>& rawImage, int32_t dstWidth, int32_t dstHeight, const std::string& srcKey = std::string());
112 
113     static bool IsWideGamut(const sk_sp<SkColorSpace>& colorSpace);
114 #else
115     static std::shared_ptr<RSImage> ResizeDrawingImage(
116         const std::shared_ptr<RSImage>& rawImage, const std::string& src, Size imageSize, bool forceResize = false);
117 
118     static std::shared_ptr<RSImage> ApplySizeToDrawingImage(
119         const std::shared_ptr<RSImage>& rawRSImage, int32_t dstWidth, int32_t dstHeight,
120         const std::string& srcKey = std::string());
121 
122     static bool IsWideGamut(const std::shared_ptr<RSColorSpace>& rsColorSpace);
123 #endif
124 
125     static bool NeedExchangeWidthAndHeight(SkEncodedOrigin origin);
126 
127     // This is a synchronization interface for getting out source image.
128 #ifndef USE_ROSEN_DRAWING
129     static sk_sp<SkImage> GetSkImage(
130         const std::string& src, const WeakPtr<PipelineBase> context, Size targetSize = Size());
131 #else
132     static std::shared_ptr<RSImage> GetDrawingImage(
133         const std::string& src, const WeakPtr<PipelineBase> context, Size targetSize = Size());
134 #endif
135 
136     static RefPtr<ImageObject> GeneratorAceImageObject(
137         const ImageSourceInfo& imageInfo, const RefPtr<PipelineBase> context, bool useSkiaSvg);
138 
139 #ifndef USE_ROSEN_DRAWING
140     static sk_sp<SkData> LoadImageRawData(const ImageSourceInfo& imageInfo, const RefPtr<PipelineBase> context);
141 
142     static sk_sp<SkData> LoadImageRawDataFromFileCache(
143         const RefPtr<PipelineBase> context, const std::string key, const std::string suffix = "");
144 #else
145     static std::shared_ptr<RSData> LoadImageRawData(
146         const ImageSourceInfo& imageInfo, const RefPtr<PipelineBase> context);
147 
148     static std::shared_ptr<RSData> LoadImageRawDataFromFileCache(
149         const RefPtr<PipelineBase> context, const std::string key, const std::string suffix = "");
150 #endif
151 
152     static RefPtr<ImageObject> QueryImageObjectFromCache(
153         const ImageSourceInfo& imageInfo, const RefPtr<PipelineBase>& pipelineContext);
154 #ifndef USE_ROSEN_DRAWING
155     static SkColorType PixelFormatToSkColorType(const RefPtr<PixelMap>& pixmap);
156     static SkAlphaType AlphaTypeToSkAlphaType(const RefPtr<PixelMap>& pixmap);
157     static SkImageInfo MakeSkImageInfoFromPixelMap(const RefPtr<PixelMap>& pixmap);
158     static sk_sp<SkColorSpace> ColorSpaceToSkColorSpace(const RefPtr<PixelMap>& pixmap);
159 #else
160     static Rosen::Drawing::ColorType PixelFormatToDrawingColorType(const RefPtr<PixelMap>& pixmap);
161     static Rosen::Drawing::AlphaType AlphaTypeToDrawingAlphaType(const RefPtr<PixelMap>& pixmap);
162     static RSBitmapFormat MakeRSBitmapFormatFromPixelMap(const RefPtr<PixelMap>& pixmap);
163     static std::shared_ptr<RSColorSpace> ColorSpaceToDrawingColorSpace(const RefPtr<PixelMap>& pixmap);
164 #endif
165 
166     static bool TrySetLoadingImage(const ImageSourceInfo& imageInfo, const ImageObjSuccessCallback& successCallback,
167         const UploadSuccessCallback& uploadCallback, const FailedCallback& failedCallback);
168 
169     static void ProccessLoadingResult(const RefPtr<TaskExecutor>& taskExecutor, const ImageSourceInfo& imageInfo,
170         bool canStartUploadImageObj, const RefPtr<ImageObject>& imageObj, const RefPtr<PipelineBase>& context,
171         const std::string& errorMsg = "");
172 
173     static bool TryUploadingImage(
174         const std::string& key, const UploadSuccessCallback& successCallback, const FailedCallback& failedCallback);
175 
176     static void ProccessUploadResult(const RefPtr<TaskExecutor>& taskExecutor, const ImageSourceInfo& imageInfo,
177         const Size& imageSize, const RefPtr<NG::CanvasImage>& canvasImage, const std::string& errorMsg = "");
178 
179 private:
180     static std::mutex loadingImageMutex_;
181     static std::unordered_map<std::string, std::vector<LoadCallback>> loadingImage_;
182 
183     static std::mutex uploadMutex_;
184     static std::unordered_map<std::string, std::vector<LoadCallback>> uploadingImage_;
185 };
186 
187 } // namespace OHOS::Ace
188 
189 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_IMAGE_IMAGE_PROVIDER_H
190