• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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