• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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 #include "core/components_ng/image_provider/adapter/skia_image_data.h"
17 
18 #include "third_party/skia/include/codec/SkCodec.h"
19 #include "third_party/skia/include/core/SkGraphics.h"
20 
21 #include "base/utils/system_properties.h"
22 #include "core/components_ng/image_provider/adapter/skia_svg_dom.h"
23 #include "core/components_ng/svg/svg_dom.h"
24 
25 namespace OHOS::Ace::NG {
26 
SkiaImageData(const void * data,size_t length)27 SkiaImageData::SkiaImageData(const void* data, size_t length)
28 {
29     // [SkData::MakeWithCopy] will not return nullptr
30     skData_ = SkData::MakeWithCopy(data, length);
31 }
32 
MakeFromDataWithCopy(const void * data,size_t length)33 RefPtr<ImageData> ImageData::MakeFromDataWithCopy(const void* data, size_t length)
34 {
35     return MakeRefPtr<SkiaImageData>(data, length);
36 }
37 
MakeFromDataWrapper(void * dataWrapper)38 RefPtr<ImageData> ImageData::MakeFromDataWrapper(void* dataWrapper)
39 {
40     sk_sp<SkData>* skDataPtr = reinterpret_cast<sk_sp<SkData>*>(dataWrapper);
41     CHECK_NULL_RETURN_NOLOG(skDataPtr, nullptr);
42     CHECK_NULL_RETURN_NOLOG(*skDataPtr, nullptr);
43     return MakeRefPtr<SkiaImageData>(*skDataPtr);
44 }
45 
GetSize() const46 size_t SkiaImageData::GetSize() const
47 {
48     CHECK_NULL_RETURN(skData_, 0);
49     return skData_->size();
50 }
51 
GetData() const52 const void* SkiaImageData::GetData() const
53 {
54     CHECK_NULL_RETURN(skData_, nullptr);
55     return skData_->data();
56 }
57 
GetSkData() const58 sk_sp<SkData> SkiaImageData::GetSkData() const
59 {
60     CHECK_NULL_RETURN(skData_, nullptr);
61     return skData_;
62 }
63 
MakeSvgDom(const std::optional<Color> & svgFillColor)64 RefPtr<SvgDomBase> SkiaImageData::MakeSvgDom(const std::optional<Color>& svgFillColor)
65 {
66     // TODO: svg support in ng build
67 #ifdef NG_BUILD
68     return nullptr;
69 #else
70     const auto svgStream = std::make_unique<SkMemoryStream>(skData_);
71     CHECK_NULL_RETURN(svgStream, nullptr);
72     if (SystemProperties::GetSvgMode() <= 0) {
73         return SkiaSvgDom::CreateSkiaSvgDom(*svgStream, svgFillColor);
74     }
75     auto svgDom_ = SvgDom::CreateSvgDom(*svgStream, svgFillColor);
76     if (!svgDom_) {
77         return nullptr;
78     }
79     svgDom_->SetFuncNormalizeToPx(
80         [pipeline = WeakClaim(RawPtr(PipelineContext::GetCurrentContext()))](const Dimension& value) -> double {
81             auto context = pipeline.Upgrade();
82             CHECK_NULL_RETURN(context, 0.0);
83             return context->NormalizeToPx(value);
84         });
85     return svgDom_;
86 #endif
87 }
88 
Parse() const89 std::pair<SizeF, int32_t> SkiaImageData::Parse() const
90 {
91     auto codec = SkCodec::MakeFromData(GetSkData());
92     CHECK_NULL_RETURN_NOLOG(codec, {});
93     SizeF imageSize;
94     switch (codec->getOrigin()) {
95         case SkEncodedOrigin::kLeftTop_SkEncodedOrigin:
96         case SkEncodedOrigin::kRightTop_SkEncodedOrigin:
97         case SkEncodedOrigin::kRightBottom_SkEncodedOrigin:
98         case SkEncodedOrigin::kLeftBottom_SkEncodedOrigin:
99             imageSize.SetSizeT(SizeF(codec->dimensions().fHeight, codec->dimensions().fWidth));
100             break;
101         default:
102             imageSize.SetSizeT(SizeF(codec->dimensions().fWidth, codec->dimensions().fHeight));
103     }
104     return { imageSize, codec->getFrameCount() };
105 }
106 
107 } // namespace OHOS::Ace::NG
108