debug.dart 8.15 KB
Newer Older
1 2 3 4
// 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.

5
import 'package:flutter/painting.dart';
Devon Carew's avatar
Devon Carew committed
6
import 'package:flutter/rendering.dart';
7

8
export 'package:flutter/foundation.dart' show debugPrint;
9

10 11 12 13 14 15 16
// Any changes to this file should be reflected in the debugAssertAllRenderVarsUnset()
// function below.

const Color _kDebugPaintSizeColor = const Color(0xFF00FFFF);
const Color _kDebugPaintSpacingColor = const Color(0x90909090);
const Color _kDebugPaintPaddingColor = const Color(0x900090FF);
const Color _kDebugPaintPaddingInnerEdgeColor = const Color(0xFF0090FF);
Ian Hickson's avatar
Ian Hickson committed
17 18
const Color _kDebugPaintBoxArrowColor = const Color(0xFFFFFF00);
const Color _kDebugPaintSliverArrowColor = const Color(0xFF33CC33);
19 20 21 22 23 24 25
const Color _kDebugPaintAlphabeticBaselineColor = const Color(0xFF00FF00);
const Color _kDebugPaintIdeographicBaselineColor = const Color(0xFFFFD000);
const Color _kDebugPaintLayerBordersColor = const Color(0xFFFF9800);
const int _kDebugPaintPointersColorValue = 0x00BBBB;
const HSVColor _kDebugCurrentRepaintColor = const HSVColor.fromAHSV(0.4, 60.0, 1.0, 1.0);
const double _kDebugRepaintRainbowHueIncrement = 2.0;

26
/// Causes each RenderBox to paint a box around its bounds, and some extra
Ian Hickson's avatar
Ian Hickson committed
27
/// boxes, such as [RenderPadding], to draw construction lines.
28
bool debugPaintSizeEnabled = false;
Adam Barth's avatar
Adam Barth committed
29 30

/// The color to use when painting RenderObject bounds.
31
Color debugPaintSizeColor = _kDebugPaintSizeColor;
32

33
/// The color to use when painting some boxes that just add space (e.g. an empty
Ian Hickson's avatar
Ian Hickson committed
34
/// RenderConstrainedBox or [RenderPadding]).
35 36 37
///
/// Used by, among other methods, [debugPaintPadding], which is called by
/// [RenderPadding.debugPaintSize] when [debugPaintSizeEnabled] is true.
38
Color debugPaintSpacingColor = _kDebugPaintSpacingColor;
39

Ian Hickson's avatar
Ian Hickson committed
40
/// The color to use when painting [RenderPadding] edges.
41 42 43
///
/// Used by, among other methods, [debugPaintPadding], which is called by
/// [RenderPadding.debugPaintSize] when [debugPaintSizeEnabled] is true.
44
Color debugPaintPaddingColor = _kDebugPaintPaddingColor;
45

Ian Hickson's avatar
Ian Hickson committed
46
/// The color to use when painting [RenderPadding] edges. This color is painted on
47 48 49 50
/// top of [debugPaintPaddingColor].
///
/// Used by, among other methods, [debugPaintPadding], which is called by
/// [RenderPadding.debugPaintSize] when [debugPaintSizeEnabled] is true.
51
Color debugPaintPaddingInnerEdgeColor = _kDebugPaintPaddingInnerEdgeColor;
52

Ian Hickson's avatar
Ian Hickson committed
53 54 55 56 57
/// The color to use when painting the arrows used to show [RenderPositionedBox] alignment.
Color debugPaintBoxArrowColor = _kDebugPaintBoxArrowColor;

/// The color to use when painting the arrows used to show [RenderSliver] alignment.
Color debugPaintSliverArrowColor = _kDebugPaintSliverArrowColor;
58

Adam Barth's avatar
Adam Barth committed
59
/// Causes each RenderBox to paint a line at each of its baselines.
60
bool debugPaintBaselinesEnabled = false;
Adam Barth's avatar
Adam Barth committed
61 62

/// The color to use when painting alphabetic baselines.
63
Color debugPaintAlphabeticBaselineColor = _kDebugPaintAlphabeticBaselineColor;
Adam Barth's avatar
Adam Barth committed
64 65

/// The color ot use when painting ideographic baselines.
66
Color debugPaintIdeographicBaselineColor = _kDebugPaintIdeographicBaselineColor;
67

Adam Barth's avatar
Adam Barth committed
68
/// Causes each Layer to paint a box around its bounds.
69
bool debugPaintLayerBordersEnabled = false;
Adam Barth's avatar
Adam Barth committed
70 71

/// The color to use when painting Layer borders.
72
Color debugPaintLayerBordersColor = _kDebugPaintLayerBordersColor;
73

74 75 76 77 78 79
/// Causes objects like [RenderPointerListener] to flash while they are being
/// tapped. This can be useful to see how large the hit box is, e.g. when
/// debugging buttons that are harder to hit than expected.
///
/// For details on how to support this in your [RenderBox] subclass, see
/// [RenderBox.debugHandleEvent].
80
bool debugPaintPointersEnabled = false;
81 82

/// The color to use when reporting pointers for [debugPaintPointersEnabled].
83
int debugPaintPointersColorValue = _kDebugPaintPointersColorValue;
84

85
/// Overlay a rotating set of colors when repainting layers in checked mode.
86
bool debugRepaintRainbowEnabled = false;
87

88 89 90
/// Overlay a rotating set of colors when repainting text in checked mode.
bool debugRepaintTextRainbowEnabled = false;

91
/// The current color to overlay when repainting a layer.
92
HSVColor debugCurrentRepaintColor = _kDebugCurrentRepaintColor;
93 94

/// The amount to increment the hue of the current repaint color.
95
double debugRepaintRainbowHueIncrement = _kDebugRepaintRainbowHueIncrement;
96

97 98 99 100
/// Log the call stacks that mark render objects as needing paint.
bool debugPrintMarkNeedsPaintStacks = false;

/// Log the call stacks that mark render objects as needing layout.
101 102 103 104 105
///
/// For sanity, this only logs the stack traces of cases where an object is
/// added to the list of nodes needing layout. This avoids printing multiple
/// redundant stack traces as a single [RenderObject.markNeedsLayout] call walks
/// up the tree.
106 107
bool debugPrintMarkNeedsLayoutStacks = false;

108 109 110
/// Check the intrinsic sizes of each [RenderBox] during layout.
bool debugCheckIntrinsicSizes = false;

111 112 113 114 115 116 117
/// Adds [Timeline] events for every RenderObject painted.
///
/// For details on how to use [Timeline] events in the Dart Observatory to
/// optimize your app, see https://fuchsia.googlesource.com/sysui/+/master/docs/performance.md
bool debugProfilePaintsEnabled = false;


118
/// Returns a list of strings representing the given transform in a format useful for [RenderObject.debugFillDescription].
119
List<String> debugDescribeTransform(Matrix4 transform) {
120
  final List<String> matrix = transform.toString().split('\n').map((String s) => '  $s').toList();
121 122 123
  matrix.removeLast();
  return matrix;
}
124

125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
void _debugDrawDoubleRect(Canvas canvas, Rect outerRect, Rect innerRect, Color color) {
  final Path path = new Path()
    ..fillType = PathFillType.evenOdd
    ..addRect(outerRect)
    ..addRect(innerRect);
  final Paint paint = new Paint()
    ..color = color;
  canvas.drawPath(path, paint);
}

/// Paint padding using the [debugPaintPaddingColor],
/// [debugPaintPaddingInnerEdgeColor], and [debugPaintSpacingColor] colors.
///
/// Called by [RenderPadding.debugPaintSize] when [debugPaintSizeEnabled] is
/// true.
void debugPaintPadding(Canvas canvas, Rect outerRect, Rect innerRect, { double outlineWidth: 2.0 }) {
  assert(() {
    if (innerRect != null && !innerRect.isEmpty) {
      _debugDrawDoubleRect(canvas, outerRect, innerRect, debugPaintPaddingColor);
      _debugDrawDoubleRect(canvas, innerRect.inflate(outlineWidth).intersect(outerRect), innerRect, debugPaintPaddingInnerEdgeColor);
    } else {
      final Paint paint = new Paint()
        ..color = debugPaintSpacingColor;
      canvas.drawRect(outerRect, paint);
    }
    return true;
  });
}

154 155 156 157 158 159 160 161 162 163 164 165 166 167
/// Returns true if none of the rendering library debug variables have been changed.
///
/// This function is used by the test framework to ensure that debug variables
/// haven't been inadvertently changed.
///
/// See [https://docs.flutter.io/flutter/rendering/rendering-library.html] for
/// a complete list.
bool debugAssertAllRenderVarsUnset(String reason) {
  assert(() {
    if (debugPaintSizeEnabled ||
        debugPaintBaselinesEnabled ||
        debugPaintLayerBordersEnabled ||
        debugPaintPointersEnabled ||
        debugRepaintRainbowEnabled ||
168
        debugRepaintTextRainbowEnabled ||
169 170 171 172 173 174 175 176
        debugPrintMarkNeedsPaintStacks ||
        debugPrintMarkNeedsLayoutStacks ||
        debugCheckIntrinsicSizes ||
        debugProfilePaintsEnabled ||
        debugPaintSizeColor != _kDebugPaintSizeColor ||
        debugPaintSpacingColor != _kDebugPaintSpacingColor ||
        debugPaintPaddingColor != _kDebugPaintPaddingColor ||
        debugPaintPaddingInnerEdgeColor != _kDebugPaintPaddingInnerEdgeColor ||
Ian Hickson's avatar
Ian Hickson committed
177 178
        debugPaintBoxArrowColor != _kDebugPaintBoxArrowColor ||
        debugPaintSliverArrowColor != _kDebugPaintSliverArrowColor ||
179 180 181 182 183 184 185 186 187 188 189 190
        debugPaintAlphabeticBaselineColor != _kDebugPaintAlphabeticBaselineColor ||
        debugPaintIdeographicBaselineColor != _kDebugPaintIdeographicBaselineColor ||
        debugPaintLayerBordersColor != _kDebugPaintLayerBordersColor ||
        debugPaintPointersColorValue != _kDebugPaintPointersColorValue ||
        debugCurrentRepaintColor != _kDebugCurrentRepaintColor ||
        debugRepaintRainbowHueIncrement != _kDebugRepaintRainbowHueIncrement) {
      throw new FlutterError(reason);
    }
    return true;
  });
  return true;
}