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