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 7/// A frame which contains a canvas to be drawn into. 8class SurfaceFrame { 9 final void Function(SkCanvas) submitFn; 10 final SkCanvas canvas; 11 SurfaceFrame(this.submitFn, this.canvas); 12 13 /// Submit this frame to be drawn. 14 void submit() { 15 submitFn(canvas); 16 } 17} 18 19/// A surface which can be drawn into by the compositor. 20/// 21/// The underlying representation is a [BitmapCanvas], which can be reused by 22/// successive frames if they are the same size. Otherwise, a new canvas is 23/// created. 24class Surface { 25 final _CanvasCache canvasCache = _CanvasCache(); 26 27 /// This function is called with the canvas once drawing on it has been 28 /// completed for a frame. 29 final void Function(SkCanvas) submitFunction; 30 31 Surface(this.submitFunction); 32 33 /// Acquire a frame of the given [size] containing a drawable canvas. 34 SurfaceFrame acquireFrame(ui.Size size) { 35 final SkCanvas canvas = canvasCache.acquireCanvas(size); 36 return SurfaceFrame(submitFunction, canvas); 37 } 38 39 Matrix4 get rootTransformation => null; 40} 41 42class _CanvasCache { 43 SkCanvas _canvas; 44 45 SkCanvas acquireCanvas(ui.Size size) { 46 assert(size != null); 47 if (size == _canvas?.size) { 48 return _canvas; 49 } 50 final html.CanvasElement htmlCanvas = 51 html.CanvasElement(width: size.width.ceil(), height: size.height.ceil()) 52 ..id = 'flt-sk-canvas'; 53 domRenderer.renderScene(htmlCanvas); 54 final js.JsObject surface = 55 canvasKit.callMethod('MakeCanvasSurface', <String>['flt-sk-canvas']); 56 final js.JsObject skCanvas = surface.callMethod('getCanvas'); 57 _canvas = SkCanvas(skCanvas, htmlCanvas, surface, size); 58 return _canvas; 59 } 60} 61