• 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/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