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/flutter_scene_builder.h"
16
17 #include "include/core/SkRect.h"
18 #include "include/core/SkScalar.h"
19
20 namespace OHOS::Ace::Flutter {
21 namespace {
22
ToFloat64List(const Matrix4 & matrix4)23 tonic::Float64List ToFloat64List(const Matrix4& matrix4)
24 {
25 tonic::Float64List floatData(matrix4.Count());
26 for (int32_t i = 0; i < matrix4.Count(); i++) {
27 floatData[i] = matrix4[i];
28 }
29 return floatData;
30 }
31
32 } // namespace
33
FlutterSceneBuilder()34 FlutterSceneBuilder::FlutterSceneBuilder()
35 {
36 sceneBuilder_ = flutter::SceneBuilder::create();
37 }
38
AddPicture(double dx,double dy,fml::RefPtr<flutter::Picture> picture,int hints)39 void FlutterSceneBuilder::AddPicture(double dx, double dy, fml::RefPtr<flutter::Picture> picture, int hints)
40 {
41 if (!picture) {
42 LOGE("FlutterSceneBuilder:can't add picture");
43 return;
44 }
45 sceneBuilder_->addPicture(dx, dy, picture.get(), hints);
46 }
47
AddTexture(double dx,double dy,double width,double height,int64_t textureId,bool freeze,uint8_t opacity)48 void FlutterSceneBuilder::AddTexture(
49 double dx, double dy, double width, double height, int64_t textureId, bool freeze, uint8_t opacity)
50 {
51 sceneBuilder_->addTexture(dx, dy, width, height, textureId, freeze, opacity);
52 }
53
PushTransform(const Matrix4 & matrix4)54 void FlutterSceneBuilder::PushTransform(const Matrix4& matrix4)
55 {
56 tonic::Float64List&& list = ToFloat64List(matrix4);
57 sceneBuilder_->pushTransform(list);
58 }
59
PushClipRRect(const flutter::RRect & rrect,int32_t clipBehavior)60 void FlutterSceneBuilder::PushClipRRect(const flutter::RRect& rrect, int32_t clipBehavior)
61 {
62 sceneBuilder_->pushClipRRect(rrect, clipBehavior);
63 }
64
PushClipPath(const flutter::CanvasPath * path,int32_t clipBehavior)65 void FlutterSceneBuilder::PushClipPath(const flutter::CanvasPath* path, int32_t clipBehavior)
66 {
67 sceneBuilder_->pushClipPath(path, clipBehavior);
68 }
69
PushOpacity(int32_t alpha,double dx,double dy)70 void FlutterSceneBuilder::PushOpacity(int32_t alpha, double dx, double dy)
71 {
72 sceneBuilder_->pushOpacity(alpha, dx, dy);
73 }
74
PushBackdropFilter(fml::RefPtr<flutter::ImageFilter> imageFilter)75 void FlutterSceneBuilder::PushBackdropFilter(fml::RefPtr<flutter::ImageFilter> imageFilter)
76 {
77 if (!imageFilter) {
78 LOGE("FlutterSceneBuilder:can't create image filter");
79 return;
80 }
81 sceneBuilder_->pushBackdropFilter(imageFilter.get());
82 }
83
PushShaderMask(fml::RefPtr<flutter::Shader> shader,double maskRectLeft,double maskRectRight,double maskRectTop,double maskRectBottom,int32_t blendMode)84 void FlutterSceneBuilder::PushShaderMask(fml::RefPtr<flutter::Shader> shader, double maskRectLeft, double maskRectRight,
85 double maskRectTop, double maskRectBottom, int32_t blendMode)
86 {
87 if (!shader) {
88 LOGE("FlutterSceneBuilder:can't push shader mask");
89 return;
90 }
91 sceneBuilder_->pushShaderMask(shader.get(), maskRectLeft, maskRectRight, maskRectTop, maskRectBottom, blendMode);
92 }
93
PushGradientColorMask(const SkPaint & maskPaint)94 void FlutterSceneBuilder::PushGradientColorMask(const SkPaint& maskPaint)
95 {
96 sceneBuilder_->PushGradientColorMask(maskPaint);
97 }
98
PushSvgMask(const sk_sp<SkSVGDOM> & svgDom,double x,double y,double scaleX,double scaleY)99 void FlutterSceneBuilder::PushSvgMask(const sk_sp<SkSVGDOM>& svgDom, double x, double y, double scaleX, double scaleY)
100 {
101 sceneBuilder_->PushSvgMask(svgDom, x, y, scaleX, scaleY);
102 }
103
PushPathMask(const SkPaint & maskPaint,const SkPath & path)104 void FlutterSceneBuilder::PushPathMask(const SkPaint& maskPaint, const SkPath& path)
105 {
106 sceneBuilder_->PushPathMask(maskPaint, path);
107 }
108
PushFilter(const SkPaint & filterPaint)109 void FlutterSceneBuilder::PushFilter(const SkPaint& filterPaint)
110 {
111 sceneBuilder_->PushFilter(filterPaint);
112 }
113
PushHole(double dx,double dy,double width,double height,int32_t holeId)114 void FlutterSceneBuilder::PushHole(double dx, double dy, double width, double height, int32_t holeId)
115 {
116 sceneBuilder_->PushHole(SkRect::MakeXYWH(static_cast<SkScalar>(dx), static_cast<SkScalar>(dy),
117 static_cast<SkScalar>(width), static_cast<SkScalar>(height)),
118 holeId);
119 }
120
Pop()121 void FlutterSceneBuilder::Pop()
122 {
123 sceneBuilder_->pop();
124 }
125
Build()126 fml::RefPtr<flutter::Scene> FlutterSceneBuilder::Build()
127 {
128 return sceneBuilder_->build();
129 }
130
131 } // namespace OHOS::Ace::Flutter