1// Copyright 2013 The Flutter Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5part of engine; 6 7class LayerScene implements ui.Scene { 8 final LayerTree layerTree; 9 10 LayerScene(Layer rootLayer) : layerTree = LayerTree() { 11 layerTree.rootLayer = rootLayer; 12 } 13 14 @override 15 void dispose() {} 16 17 @override 18 Future<ui.Image> toImage(int width, int height) => null; 19 20 @override 21 html.Element get webOnlyRootElement => null; 22} 23 24class LayerSceneBuilder implements ui.SceneBuilder { 25 Layer rootLayer; 26 ContainerLayer currentLayer; 27 28 @override 29 void addChildScene( 30 {ui.Offset offset = ui.Offset.zero, 31 double width = 0.0, 32 double height = 0.0, 33 ui.SceneHost sceneHost, 34 bool hitTestable = true}) { 35 throw UnimplementedError(); 36 } 37 38 @override 39 void addPerformanceOverlay(int enabledOptions, ui.Rect bounds) { 40 // We don't plan to implement this on the web. 41 throw UnimplementedError(); 42 } 43 44 @override 45 void addPicture(ui.Offset offset, ui.Picture picture, 46 {bool isComplexHint = false, bool willChangeHint = false}) { 47 currentLayer 48 .add(PictureLayer(picture, offset, isComplexHint, willChangeHint)); 49 } 50 51 @override 52 void addRetained(ui.EngineLayer retainedLayer) { 53 if (currentLayer == null) { 54 return; 55 } 56 currentLayer.add(retainedLayer); 57 } 58 59 @override 60 void addTexture(int textureId, 61 {ui.Offset offset = ui.Offset.zero, 62 double width = 0.0, 63 double height = 0.0, 64 bool freeze = false}) { 65 // TODO(b/128315641): implement addTexture. 66 } 67 68 @override 69 void addPlatformView( 70 int viewId, { 71 ui.Offset offset = ui.Offset.zero, 72 double width = 0.0, 73 double height = 0.0, 74 Object webOnlyPaintedBy, 75 }) { 76 // TODO(b/128317425): implement addPlatformView. 77 } 78 79 @override 80 ui.Scene build() { 81 return LayerScene(rootLayer); 82 } 83 84 @override 85 void pop() { 86 if (currentLayer == null) { 87 return; 88 } 89 currentLayer = currentLayer.parent; 90 } 91 92 @override 93 ui.BackdropFilterEngineLayer pushBackdropFilter(ui.ImageFilter filter, 94 {ui.EngineLayer oldLayer}) { 95 throw UnimplementedError(); 96 } 97 98 @override 99 ui.ClipPathEngineLayer pushClipPath(ui.Path path, 100 {ui.Clip clipBehavior = ui.Clip.antiAlias, ui.EngineLayer oldLayer}) { 101 pushLayer(ClipPathLayer(path)); 102 return null; 103 } 104 105 @override 106 ui.ClipRRectEngineLayer pushClipRRect(ui.RRect rrect, 107 {ui.Clip clipBehavior, ui.EngineLayer oldLayer}) { 108 pushLayer(ClipRRectLayer(rrect)); 109 return null; 110 } 111 112 @override 113 ui.ClipRectEngineLayer pushClipRect(ui.Rect rect, 114 {ui.Clip clipBehavior = ui.Clip.antiAlias, ui.EngineLayer oldLayer}) { 115 pushLayer(ClipRectLayer(rect)); 116 return null; 117 } 118 119 @override 120 ui.ColorFilterEngineLayer pushColorFilter(ui.ColorFilter filter, 121 {ui.EngineLayer oldLayer}) { 122 throw UnimplementedError(); 123 } 124 125 @override 126 ui.OffsetEngineLayer pushOffset(double dx, double dy, 127 {ui.EngineLayer oldLayer}) { 128 final Matrix4 matrix = Matrix4.translationValues(dx, dy, 0.0); 129 final TransformLayer layer = TransformLayer(matrix); 130 pushLayer(layer); 131 return layer; 132 } 133 134 @override 135 ui.OpacityEngineLayer pushOpacity(int alpha, 136 {ui.EngineLayer oldLayer, ui.Offset offset = ui.Offset.zero}) { 137 // TODO(het): Implement opacity 138 pushOffset(0.0, 0.0); 139 return null; 140 } 141 142 @override 143 ui.PhysicalShapeEngineLayer pushPhysicalShape({ 144 ui.Path path, 145 double elevation, 146 ui.Color color, 147 ui.Color shadowColor, 148 ui.Clip clipBehavior = ui.Clip.none, 149 ui.EngineLayer oldLayer, 150 }) { 151 final PhysicalShapeLayer layer = 152 PhysicalShapeLayer(elevation, color, shadowColor, path, clipBehavior); 153 pushLayer(layer); 154 return layer; 155 } 156 157 @override 158 ui.ShaderMaskEngineLayer pushShaderMask( 159 ui.Shader shader, ui.Rect maskRect, ui.BlendMode blendMode, 160 {ui.EngineLayer oldLayer}) { 161 throw UnimplementedError(); 162 } 163 164 @override 165 ui.TransformEngineLayer pushTransform(Float64List matrix4, 166 {ui.EngineLayer oldLayer}) { 167 final Matrix4 matrix = Matrix4.fromList(matrix4); 168 pushLayer(TransformLayer(matrix)); 169 return null; 170 } 171 172 @override 173 void setCheckerboardOffscreenLayers(bool checkerboard) { 174 // TODO: implement setCheckerboardOffscreenLayers 175 } 176 177 @override 178 void setCheckerboardRasterCacheImages(bool checkerboard) { 179 // TODO: implement setCheckerboardRasterCacheImages 180 } 181 182 @override 183 void setRasterizerTracingThreshold(int frameInterval) { 184 // TODO: implement setRasterizerTracingThreshold 185 } 186 187 void pushLayer(ContainerLayer layer) { 188 if (rootLayer == null) { 189 rootLayer = currentLayer = layer; 190 return; 191 } 192 193 if (currentLayer == null) { 194 return; 195 } 196 197 currentLayer.add(layer); 198 currentLayer = layer; 199 } 200 201 @override 202 void setProperties(double width, double height, double insetTop, 203 double insetRight, double insetBottom, double insetLeft, bool focusable) { 204 throw UnimplementedError(); 205 } 206} 207