Index: sky/sdk/lib/framework/rendering/paragraph.dart |
diff --git a/sky/sdk/lib/framework/rendering/paragraph.dart b/sky/sdk/lib/framework/rendering/paragraph.dart |
deleted file mode 100644 |
index 3643ebb2120e194cdb202cf24cb00f7a8ee527c8..0000000000000000000000000000000000000000 |
--- a/sky/sdk/lib/framework/rendering/paragraph.dart |
+++ /dev/null |
@@ -1,221 +0,0 @@ |
-// 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 'dart:sky' as sky; |
-import 'box.dart'; |
-import 'object.dart'; |
- |
-class RenderInline extends RenderObject { |
- RenderInline(this.data); |
- String data; |
-} |
- |
-enum FontWeight { |
- light, // 300 |
- regular, // 400 |
- medium, // 500 |
-} |
- |
-enum TextAlign { |
- left, |
- right, |
- center |
-} |
- |
-class TextStyle { |
- const TextStyle({ |
- this.color, |
- this.fontSize, |
- this.fontWeight, |
- this.textAlign |
- }); |
- |
- final Color color; |
- final double fontSize; // in pixels |
- final FontWeight fontWeight; |
- final TextAlign textAlign; |
- |
- TextStyle copyWith({ |
- Color color, |
- double fontSize, |
- FontWeight fontWeight, |
- TextAlign textAlign |
- }) { |
- return new TextStyle( |
- color: color != null ? color : this.color, |
- fontSize: fontSize != null ? fontSize : this.fontSize, |
- fontWeight: fontWeight != null ? fontWeight : this.fontWeight, |
- textAlign: textAlign != null ? textAlign : this.textAlign |
- ); |
- } |
- |
- bool operator ==(other) { |
- return other is TextStyle && |
- color == other.color && |
- fontSize == other.fontSize && |
- fontWeight == other.fontWeight && |
- textAlign == other.textAlign; |
- } |
- |
- int get hashCode { |
- // Use Quiver: https://github.com/domokit/mojo/issues/236 |
- int value = 373; |
- value = 37 * value + color.hashCode; |
- value = 37 * value + fontSize.hashCode; |
- value = 37 * value + fontWeight.hashCode; |
- value = 37 * value + textAlign.hashCode; |
- return value; |
- } |
- |
- String toString([String prefix = '']) { |
- List<String> result = []; |
- if (color != null) |
- result.add('${prefix}color: $color'); |
- if (fontSize != null) |
- result.add('${prefix}fontSize: $fontSize'); |
- if (fontWeight != null) |
- result.add('${prefix}fontWeight: fontWeight'); |
- if (textAlign != null) |
- result.add('${prefix}textAlign: textAlign'); |
- if (result.isEmpty) |
- return '${prefix}<no style specified>'; |
- return result.join('\n'); |
- } |
-} |
- |
-// Unfortunately, using full precision floating point here causes bad layouts |
-// because floating point math isn't associative. If we add and subtract |
-// padding, for example, we'll get different values when we estimate sizes and |
-// when we actually compute layout because the operations will end up associated |
-// differently. To work around this problem for now, we round fractional pixel |
-// values up to the nearest whole pixel value. The right long-term fix is to do |
-// layout using fixed precision arithmetic. |
-double _applyFloatingPointHack(double layoutValue) { |
- return layoutValue.ceilToDouble(); |
-} |
- |
-class RenderParagraph extends RenderBox { |
- |
- RenderParagraph({ |
- String text, |
- Color color, |
- TextStyle style |
- }) : _style = style { |
- _layoutRoot.rootElement = _document.createElement('p'); |
- this.text = text; |
- } |
- |
- final sky.Document _document = new sky.Document(); |
- final sky.LayoutRoot _layoutRoot = new sky.LayoutRoot(); |
- |
- String get text => (_layoutRoot.rootElement.firstChild as sky.Text).data; |
- void set text (String value) { |
- _layoutRoot.rootElement.setChild(_document.createText(value)); |
- markNeedsLayout(); |
- } |
- |
- TextStyle _style; |
- TextStyle get style => _style; |
- void set style (TextStyle value) { |
- if (_style != value) { |
- // TODO(hansmuller): decide if a new layout or paint is needed |
- markNeedsLayout(); |
- _style = value; |
- } |
- } |
- |
- BoxConstraints _constraintsForCurrentLayout; |
- |
- sky.Element _layout(BoxConstraints constraints) { |
- _layoutRoot.maxWidth = constraints.maxWidth; |
- _layoutRoot.minWidth = constraints.minWidth; |
- _layoutRoot.minHeight = constraints.minHeight; |
- _layoutRoot.maxHeight = constraints.maxHeight; |
- _layoutRoot.layout(); |
- _constraintsForCurrentLayout = constraints; |
- } |
- |
- double getMinIntrinsicWidth(BoxConstraints constraints) { |
- _layout(constraints); |
- return constraints.constrainWidth( |
- _applyFloatingPointHack(_layoutRoot.rootElement.minContentWidth)); |
- } |
- |
- double getMaxIntrinsicWidth(BoxConstraints constraints) { |
- _layout(constraints); |
- return constraints.constrainWidth( |
- _applyFloatingPointHack(_layoutRoot.rootElement.maxContentWidth)); |
- } |
- |
- double _getIntrinsicHeight(BoxConstraints constraints) { |
- _layout(constraints); |
- return constraints.constrainHeight( |
- _applyFloatingPointHack(_layoutRoot.rootElement.height)); |
- } |
- |
- double getMinIntrinsicHeight(BoxConstraints constraints) { |
- return _getIntrinsicHeight(constraints); |
- } |
- |
- double getMaxIntrinsicHeight(BoxConstraints constraints) { |
- return _getIntrinsicHeight(constraints); |
- } |
- |
- void performLayout() { |
- _layout(constraints); |
- sky.Element root = _layoutRoot.rootElement; |
- // rootElement.width always expands to fill, use maxContentWidth instead. |
- size = constraints.constrain(new Size(_applyFloatingPointHack(root.maxContentWidth), |
- _applyFloatingPointHack(root.height))); |
- } |
- |
- void paint(RenderObjectDisplayList canvas) { |
- // Ideally we could compute the min/max intrinsic width/height with a |
- // non-destructive operation. However, currently, computing these values |
- // will destroy state inside the layout root. If that happens, we need to |
- // get back the correct state by calling _layout again. |
- // |
- // TODO(abarth): Make computing the min/max intrinsic width/height a |
- // non-destructive operation. |
- if (_constraintsForCurrentLayout != constraints && constraints != null) |
- _layout(constraints); |
- |
- if (style != null) { |
- var cssStyle = _layoutRoot.rootElement.style; |
- if (style.color != null) { |
- Color c = style.color; |
- cssStyle['color'] = |
- 'rgba(${c.red}, ${c.green}, ${c.blue}, ${c.alpha / 255.0})'; |
- } |
- if (style.fontSize != null) { |
- cssStyle['font-size'] = "${style.fontSize}px"; |
- } |
- if (style.fontWeight != null) { |
- cssStyle['font-weight'] = const { |
- FontWeight.light: '300', |
- FontWeight.regular: '400', |
- FontWeight.medium: '500', |
- }[style.fontWeight]; |
- } |
- if (style.textAlign != null) { |
- cssStyle['text-align'] = const { |
- TextAlign.left: 'left', |
- TextAlign.right: 'right', |
- TextAlign.center: 'center', |
- }[style.textAlign]; |
- } |
- } |
- _layoutRoot.paint(canvas); |
- } |
- |
- // we should probably expose a way to do precise (inter-glpyh) hit testing |
- |
- String debugDescribeSettings(String prefix) { |
- String result = '${super.debugDescribeSettings(prefix)}'; |
- if (style != null) |
- result += '${prefix}style:\n' + style.toString('$prefix ') + '\n'; |
- result += '${prefix}text: ${text}\n'; |
- return result; |
- } |
-} |