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