1 /*
2  * Copyright (c) 2022-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_APNG_APNG_IMAGE_OBJECT_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_IMAGE_APNG_APNG_IMAGE_OBJECT_H
18 
19 #include "core/image/image_object.h"
20 #include "apng_image_player.h"
21 
22 namespace OHOS::Ace {
23 class ApngImageObject : public ImageObject {
24     DECLARE_ACE_TYPE(ApngImageObject, ImageObject);
25 public:
26     using CancelableTask = CancelableCallback<void()>;
27 
28 #ifndef USE_ROSEN_DRAWING
ApngImageObject(ImageSourceInfo source,const Size & imageSize,int32_t frameCount,const sk_sp<SkData> & data,const RefPtr<PNGImageDecoder> & decoder)29     ApngImageObject(
30         ImageSourceInfo source,
31         const Size& imageSize,
32         int32_t frameCount,
33         const sk_sp<SkData>& data,
34         const RefPtr<PNGImageDecoder>& decoder)
35         : ImageObject(source, imageSize, frameCount), skData_(data)
36     {
37         skData_ = data;
38         apngDecoder_ = decoder;
39     }
40 #else
ApngImageObject(ImageSourceInfo source,const Size & imageSize,int32_t frameCount,const std::shared_ptr<RSData> & data,const RefPtr<PNGImageDecoder> & decoder)41     ApngImageObject(
42         ImageSourceInfo source,
43         const Size& imageSize,
44         int32_t frameCount,
45         const std::shared_ptr<RSData>& data,
46         const RefPtr<PNGImageDecoder>& decoder)
47         : ImageObject(source, imageSize, frameCount), drawingData_(data)
48     {
49         drawingData_ = data;
50         apngDecoder_ = decoder;
51     }
52 #endif
53 
54     void UploadToGpuForRender(
55         const WeakPtr<PipelineBase>& context,
56         const UploadSuccessCallback& successCallback,
57         const FailedCallback& failedCallback,
58         const Size& imageSize,
59         bool forceResize,
60         bool syncMode = false) override;
61 
62     bool IsApng();
63 
Pause()64     void Pause() override
65     {
66         if (animatedPlayer_) {
67             LOGI("animated image Paused");
68             animatedPlayer_->Pause();
69         }
70     }
71 
Resume()72     void Resume() override
73     {
74         if (animatedPlayer_) {
75             LOGI("animated image Resume");
76             animatedPlayer_->Resume();
77         }
78     }
79 
ClearData()80     void ClearData() override
81     {
82         skData_ = nullptr;
83     }
84 
Clone()85     RefPtr<ImageObject> Clone() override
86     {
87         return MakeRefPtr<ApngImageObject>(imageSource_, imageSize_, frameCount_, skData_, apngDecoder_);
88     }
89 
90 private:
91 #ifndef USE_ROSEN_DRAWING
92     sk_sp<SkData> skData_;
93 #else
94     std::shared_ptr<RSData> drawingData_;
95 #endif
96     RefPtr<APngImagePlayer> animatedPlayer_;
97     RefPtr<PNGImageDecoder> apngDecoder_;
98 };
99 
100 } // namespace OHOS::Ace
101 
102 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_IMAGE_APNG_APNG_IMAGE_OBJECT_H
103