rendering_tester.dart 2.39 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1 2 3 4 5
// Copyright 2015 The Chromium 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:flutter/gestures.dart';
6
import 'package:flutter/rendering.dart';
Ian Hickson's avatar
Ian Hickson committed
7 8
import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart';
9 10 11 12

const Size _kTestViewSize = const Size(800.0, 600.0);

class TestRenderView extends RenderView {
Hixie's avatar
Hixie committed
13
  TestRenderView() {
14
    configuration = new ViewConfiguration(size: _kTestViewSize);
Ian Hickson's avatar
Ian Hickson committed
15
  }
16 17

  @override
Ian Hickson's avatar
Ian Hickson committed
18
  void scheduleInitialFrame() {
19
    scheduleInitialLayout();
20
    scheduleInitialPaint(new TransformLayer(transform: new Matrix4.identity()));
21
  }
22 23 24 25
}

enum EnginePhase {
  layout,
26
  compositingBits,
27 28 29 30
  paint,
  composite
}

31
class TestRenderingFlutterBinding extends BindingBase with Scheduler, Services, Renderer, Gesturer {
32
  @override
Ian Hickson's avatar
Ian Hickson committed
33 34 35 36 37 38 39 40 41
  void initRenderView() {
    if (renderView == null) {
      renderView = new TestRenderView();
      renderView.scheduleInitialFrame();
    }
  }

  EnginePhase phase = EnginePhase.composite;

42
  @override
Ian Hickson's avatar
Ian Hickson committed
43 44 45 46
  void beginFrame() {
    RenderObject.flushLayout();
    if (phase == EnginePhase.layout)
      return;
47 48 49
    RenderObject.flushCompositingBits();
    if (phase == EnginePhase.compositingBits)
      return;
Ian Hickson's avatar
Ian Hickson committed
50 51 52 53 54 55 56 57 58
    RenderObject.flushPaint();
    if (phase == EnginePhase.paint)
      return;
    renderer.renderView.compositeFrame();
  }
}

TestRenderingFlutterBinding _renderer;
TestRenderingFlutterBinding get renderer => _renderer;
59

Hixie's avatar
Hixie committed
60 61 62
void layout(RenderBox box, { BoxConstraints constraints, EnginePhase phase: EnginePhase.layout }) {
  assert(box != null); // if you want to just repump the last box, call pumpFrame().

Ian Hickson's avatar
Ian Hickson committed
63
  _renderer ??= new TestRenderingFlutterBinding();
64

65
  renderer.renderView.child = null;
66 67 68 69 70 71 72 73
  if (constraints != null) {
    box = new RenderPositionedBox(
      child: new RenderConstrainedBox(
        additionalConstraints: constraints,
        child: box
      )
    );
  }
Ian Hickson's avatar
Ian Hickson committed
74
  renderer.renderView.child = box;
Hixie's avatar
Hixie committed
75 76 77 78 79

  pumpFrame(phase: phase);
}

void pumpFrame({ EnginePhase phase: EnginePhase.layout }) {
Ian Hickson's avatar
Ian Hickson committed
80 81 82
  assert(renderer != null);
  renderer.phase = phase;
  renderer.beginFrame();
83
}
84 85 86 87 88 89

class TestCallbackPainter extends CustomPainter {
  const TestCallbackPainter({ this.onPaint });

  final VoidCallback onPaint;

90
  @override
91 92 93 94
  void paint(Canvas canvas, Size size) {
    onPaint();
  }

95
  @override
96 97
  bool shouldRepaint(TestCallbackPainter oldPainter) => true;
}