1 /*
2 * Copyright (c) 2021 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 #include "core/pipeline/layers/ace_scene_builder.h"
16
17 #include "base/utils/utils.h"
18
19 namespace OHOS::Ace::Flutter {
20 namespace {
21
22 // Mappings from SkMatrix-index to input-index.
23 static const int32_t K_SK_MATRIX_INDEX_TO_MATRIX4_INDEX[] = {
24 0,
25 4,
26 12,
27 1,
28 5,
29 13,
30 3,
31 7,
32 15,
33 };
34
ToSkMatrix(const Matrix4 & matrix4)35 SkMatrix ToSkMatrix(const Matrix4& matrix4)
36 {
37 SkMatrix skMatrix;
38 for (std::size_t i = 0; i < ArraySize(K_SK_MATRIX_INDEX_TO_MATRIX4_INDEX); ++i) {
39 int32_t matrixIndex = K_SK_MATRIX_INDEX_TO_MATRIX4_INDEX[i];
40 if (matrixIndex < matrix4.Count())
41 skMatrix[i] = matrix4[matrixIndex];
42 else
43 skMatrix[i] = 0.0;
44 }
45 return skMatrix;
46 }
47
48 } // namespace
49
AceSceneBuilder()50 AceSceneBuilder::AceSceneBuilder()
51 {
52 layerTreeBuilder_ = flutter::OHOS::LayerTreeBuilder::Create();
53 }
54
AddPicture(double dx,double dy,fml::RefPtr<flutter::Picture> picture,int hints)55 void AceSceneBuilder::AddPicture(double dx, double dy, fml::RefPtr<flutter::Picture> picture, int hints)
56 {
57 if (!picture) {
58 LOGE("AceSceneBuilder:can't add picture");
59 return;
60 }
61 layerTreeBuilder_->AddPicture(dx, dy, picture.get()->picture());
62 }
63
AddTexture(double dx,double dy,double width,double height,int64_t textureId,bool freeze,uint8_t opacity)64 void AceSceneBuilder::AddTexture(
65 double dx, double dy, double width, double height, int64_t textureId, bool freeze, uint8_t opacity)
66 {
67 layerTreeBuilder_->AddTexture(dx, dy, width, height, textureId, freeze, opacity);
68 }
69
PushTransform(const Matrix4 & matrix4)70 void AceSceneBuilder::PushTransform(const Matrix4& matrix4)
71 {
72 auto skMatrix = ToSkMatrix(matrix4);
73 layerTreeBuilder_->PushTransform(skMatrix);
74 }
75
PushClipRRect(const flutter::RRect & rrect,int32_t clipBehavior)76 void AceSceneBuilder::PushClipRRect(const flutter::RRect& rrect, int32_t clipBehavior)
77 {
78 layerTreeBuilder_->PushClipRRect(rrect.sk_rrect, clipBehavior);
79 }
80
PushClipPath(const flutter::CanvasPath * path,int32_t clipBehavior)81 void AceSceneBuilder::PushClipPath(const flutter::CanvasPath* path, int32_t clipBehavior)
82 {
83 if (!path) {
84 LOGE("AceSceneBuilder:can't create clip path");
85 return;
86 }
87 layerTreeBuilder_->PushClipPath(path->path(), clipBehavior);
88 }
89
PushOpacity(int32_t alpha,double dx,double dy)90 void AceSceneBuilder::PushOpacity(int32_t alpha, double dx, double dy)
91 {
92 layerTreeBuilder_->PushOpacity(alpha, dx, dy);
93 }
94
PushBackdropFilter(fml::RefPtr<flutter::ImageFilter> imageFilter)95 void AceSceneBuilder::PushBackdropFilter(fml::RefPtr<flutter::ImageFilter> imageFilter)
96 {
97 if (!imageFilter) {
98 LOGE("AceSceneBuilder:can't create image filter");
99 return;
100 }
101 layerTreeBuilder_->PushBackdropFilter(imageFilter.get()->filter());
102 }
103
PushShaderMask(fml::RefPtr<flutter::Shader> shader,double maskRectLeft,double maskRectRight,double maskRectTop,double maskRectBottom,int32_t blendMode)104 void AceSceneBuilder::PushShaderMask(fml::RefPtr<flutter::Shader> shader, double maskRectLeft, double maskRectRight,
105 double maskRectTop, double maskRectBottom, int32_t blendMode)
106 {
107 if (!shader) {
108 LOGE("AceSceneBuilder:can't push shader mask");
109 return;
110 }
111 layerTreeBuilder_->PushShaderMask(
112 shader.get()->shader(), maskRectLeft, maskRectRight, maskRectTop, maskRectBottom, blendMode);
113 }
114
PushSvgMask(const sk_sp<SkSVGDOM> & svgDom,double x,double y,double scaleX,double scaleY)115 void AceSceneBuilder::PushSvgMask(const sk_sp<SkSVGDOM>& svgDom, double x, double y, double scaleX, double scaleY)
116 {
117 layerTreeBuilder_->PushSvgMask(svgDom, x, y, scaleX, scaleY);
118 }
119
PushGradientColorMask(const SkPaint & maskPaint)120 void AceSceneBuilder::PushGradientColorMask(const SkPaint& maskPaint)
121 {
122 layerTreeBuilder_->PushGradientColorMask(maskPaint);
123 }
124
PushPathMask(const SkPaint & maskPaint,const SkPath & maskPath)125 void AceSceneBuilder::PushPathMask(const SkPaint& maskPaint, const SkPath& maskPath)
126 {
127 layerTreeBuilder_->PushPathMask(maskPaint, maskPath);
128 }
129
PushFilter(const SkPaint & filterPaint)130 void AceSceneBuilder::PushFilter(const SkPaint& filterPaint)
131 {
132 layerTreeBuilder_->PushFilter(filterPaint);
133 }
134
Pop()135 void AceSceneBuilder::Pop()
136 {
137 layerTreeBuilder_->Pop();
138 }
139
GetLayerTree() const140 std::unique_ptr<flutter::OHOS::LayerTree> AceSceneBuilder::GetLayerTree() const
141 {
142 return layerTreeBuilder_->GetLayerTree();
143 }
144
145 } // namespace OHOS::Ace::Flutter