blob: b8b420bb829a66177561b2d517c495b1fd3da59a [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:meta/meta.dart';
import 'package:ui/ui.dart' as ui;
import '../frame_reference.dart';
import 'canvas.dart';
import 'embedded_views.dart';
import 'layer_tree.dart';
import 'surface.dart';
import 'surface_factory.dart';
/// A class that can rasterize [LayerTree]s into a given [Surface].
class Rasterizer {
final CompositorContext context = CompositorContext();
final List<ui.VoidCallback> _postFrameCallbacks = <ui.VoidCallback>[];
void setSkiaResourceCacheMaxBytes(int bytes) =>
SurfaceFactory.instance.baseSurface.setSkiaResourceCacheMaxBytes(bytes);
/// Creates a new frame from this rasterizer's surface, draws the given
/// [LayerTree] into it, and then submits the frame.
void draw(LayerTree layerTree) {
try {
if (layerTree.frameSize.isEmpty) {
// Available drawing area is empty. Skip drawing.
return;
}
final SurfaceFrame frame =
SurfaceFactory.instance.baseSurface.acquireFrame(layerTree.frameSize);
HtmlViewEmbedder.instance.frameSize = layerTree.frameSize;
final CkCanvas canvas = frame.skiaCanvas;
final Frame compositorFrame =
context.acquireFrame(canvas, HtmlViewEmbedder.instance);
compositorFrame.raster(layerTree, ignoreRasterCache: true);
SurfaceFactory.instance.baseSurface.addToScene();
frame.submit();
HtmlViewEmbedder.instance.submitFrame();
} finally {
_runPostFrameCallbacks();
}
}
void addPostFrameCallback(ui.VoidCallback callback) {
_postFrameCallbacks.add(callback);
}
void _runPostFrameCallbacks() {
for (int i = 0; i < _postFrameCallbacks.length; i++) {
final ui.VoidCallback callback = _postFrameCallbacks[i];
callback();
}
for (int i = 0; i < frameReferences.length; i++) {
frameReferences[i].value = null;
}
frameReferences.clear();
}
/// Forces the post-frame callbacks to run. Useful in tests.
@visibleForTesting
void debugRunPostFrameCallbacks() {
_runPostFrameCallbacks();
}
}