Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(98)

Side by Side Diff: sky/sdk/lib/rendering/box.dart

Issue 1200233002: Use the baseline information exposed by C++ to pipe baseline data through RenderBox. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « sky/sdk/lib/rendering/block.dart ('k') | sky/sdk/lib/rendering/flex.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 import 'dart:math' as math; 5 import 'dart:math' as math;
6 import 'dart:sky' as sky; 6 import 'dart:sky' as sky;
7 7
8 import 'package:vector_math/vector_math.dart'; 8 import 'package:vector_math/vector_math.dart';
9 9
10 import '../base/debug.dart'; 10 import '../base/debug.dart';
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 class BoxParentData extends ParentData { 218 class BoxParentData extends ParentData {
219 Point _position = Point.origin; 219 Point _position = Point.origin;
220 Point get position => _position; 220 Point get position => _position;
221 void set position(Point value) { 221 void set position(Point value) {
222 assert(RenderObject.debugDoingLayout); 222 assert(RenderObject.debugDoingLayout);
223 _position = value; 223 _position = value;
224 } 224 }
225 String toString() => 'position=$position'; 225 String toString() => 'position=$position';
226 } 226 }
227 227
228 enum TextBaseline { alphabetic, ideographic }
229
228 abstract class RenderBox extends RenderObject { 230 abstract class RenderBox extends RenderObject {
229 231
230 void setParentData(RenderObject child) { 232 void setParentData(RenderObject child) {
231 if (child.parentData is! BoxParentData) 233 if (child.parentData is! BoxParentData)
232 child.parentData = new BoxParentData(); 234 child.parentData = new BoxParentData();
233 } 235 }
234 236
235 // getMinIntrinsicWidth() should return the minimum width that this box could 237 // getMinIntrinsicWidth() should return the minimum width that this box could
236 // be without failing to render its contents within itself. 238 // be without failing to render its contents within itself.
237 double getMinIntrinsicWidth(BoxConstraints constraints) { 239 double getMinIntrinsicWidth(BoxConstraints constraints) {
(...skipping 14 matching lines...) Expand all
252 254
253 // getMaxIntrinsicHeight should return the smallest height beyond which 255 // getMaxIntrinsicHeight should return the smallest height beyond which
254 // increasing the height never decreases the width. 256 // increasing the height never decreases the width.
255 // If the layout algorithm used is width-in-height-out, i.e. the height 257 // If the layout algorithm used is width-in-height-out, i.e. the height
256 // depends on the width and not vice versa, then this will return the same 258 // depends on the width and not vice versa, then this will return the same
257 // as getMinIntrinsicHeight(). 259 // as getMinIntrinsicHeight().
258 double getMaxIntrinsicHeight(BoxConstraints constraints) { 260 double getMaxIntrinsicHeight(BoxConstraints constraints) {
259 return constraints.constrainHeight(0.0); 261 return constraints.constrainHeight(0.0);
260 } 262 }
261 263
264 // getDistanceToBaseline() should return the distance from the
265 // y-coordinate of the position of the box to the y-coordinate of
266 // the first given baseline in the box's contents. This is used by
267 // certain layout models to align adjacent boxes on a common
268 // baseline, regardless of padding, font size differences, etc. If
269 // there is no baseline, then it should return the distance from the
270 // y-coordinate of the position of the box to the y-coordinate of
271 // the bottom of the box, i.e., the height of the box.
272 // Only call this after layout has been performed.
273 double getDistanceToBaseline(TextBaseline baseline) {
274 assert(!needsLayout);
275 double result = getDistanceToActualBaseline(baseline);
276 if (result == null)
277 return size.height;
278 return result;
279 }
280 // getDistanceToActualBaseline() should return the distance from the
281 // y-coordinate of the position of the box to the y-coordinate of
282 // the first given baseline in the box's contents, if any, or null
283 // otherwise.
284 double getDistanceToActualBaseline(TextBaseline baseline) {
285 assert(!needsLayout);
286 return null;
287 }
288
262 // This whole block should only be here in debug builds 289 // This whole block should only be here in debug builds
263 bool _debugDoingThisLayout = false; 290 bool _debugDoingThisLayout = false;
264 bool _debugCanParentUseSize; 291 bool _debugCanParentUseSize;
265 void layoutWithoutResize() { 292 void layoutWithoutResize() {
266 _debugDoingThisLayout = true; 293 _debugDoingThisLayout = true;
267 _debugCanParentUseSize = false; 294 _debugCanParentUseSize = false;
268 super.layoutWithoutResize(); 295 super.layoutWithoutResize();
269 _debugCanParentUseSize = null; 296 _debugCanParentUseSize = null;
270 _debugDoingThisLayout = false; 297 _debugDoingThisLayout = false;
271 } 298 }
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 return child.getMinIntrinsicHeight(constraints); 368 return child.getMinIntrinsicHeight(constraints);
342 return super.getMinIntrinsicHeight(constraints); 369 return super.getMinIntrinsicHeight(constraints);
343 } 370 }
344 371
345 double getMaxIntrinsicHeight(BoxConstraints constraints) { 372 double getMaxIntrinsicHeight(BoxConstraints constraints) {
346 if (child != null) 373 if (child != null)
347 return child.getMaxIntrinsicHeight(constraints); 374 return child.getMaxIntrinsicHeight(constraints);
348 return super.getMaxIntrinsicHeight(constraints); 375 return super.getMaxIntrinsicHeight(constraints);
349 } 376 }
350 377
378 double getDistanceToActualBaseline(TextBaseline baseline) {
379 if (child != null)
380 return child.getDistanceToActualBaseline(baseline);
381 return super.getDistanceToActualBaseline(baseline);
382 }
383
351 void performLayout() { 384 void performLayout() {
352 if (child != null) { 385 if (child != null) {
353 child.layout(constraints, parentUsesSize: true); 386 child.layout(constraints, parentUsesSize: true);
354 size = child.size; 387 size = child.size;
355 } else { 388 } else {
356 performResize(); 389 performResize();
357 } 390 }
358 } 391 }
359 392
360 void hitTestChildren(HitTestResult result, { Point position }) { 393 void hitTestChildren(HitTestResult result, { Point position }) {
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
578 611
579 RenderShiftedBox(RenderBox child) { 612 RenderShiftedBox(RenderBox child) {
580 this.child = child; 613 this.child = child;
581 } 614 }
582 615
583 void paint(RenderCanvas canvas) { 616 void paint(RenderCanvas canvas) {
584 if (child != null) 617 if (child != null)
585 canvas.paintChild(child, child.parentData.position); 618 canvas.paintChild(child, child.parentData.position);
586 } 619 }
587 620
621 double getDistanceToActualBaseline(TextBaseline baseline) {
622 double result;
623 if (child != null) {
624 assert(!needsLayout);
625 result = child.getDistanceToActualBaseline(baseline);
626 assert(child.parentData is BoxParentData);
627 if (result != null)
628 result += child.parentData.position.y;
629 } else {
630 result = super.getDistanceToActualBaseline(baseline);
631 }
632 return result;
633 }
634
588 void hitTestChildren(HitTestResult result, { Point position }) { 635 void hitTestChildren(HitTestResult result, { Point position }) {
589 if (child != null) { 636 if (child != null) {
590 assert(child.parentData is BoxParentData); 637 assert(child.parentData is BoxParentData);
591 Rect childBounds = new Rect.fromPointAndSize(child.parentData.position, ch ild.size); 638 Rect childBounds = new Rect.fromPointAndSize(child.parentData.position, ch ild.size);
592 if (childBounds.contains(position)) { 639 if (childBounds.contains(position)) {
593 child.hitTest(result, position: new Point(position.x - child.parentData. position.x, 640 child.hitTest(result, position: new Point(position.x - child.parentData. position.x,
594 position.y - child.parentD ata.position.y)); 641 position.y - child.parentD ata.position.y));
595 } 642 }
596 } 643 }
597 } 644 }
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after
1082 RenderObject.debugDoingPaint = false; 1129 RenderObject.debugDoingPaint = false;
1083 sky.tracing.end('RenderView.paintFrame'); 1130 sky.tracing.end('RenderView.paintFrame');
1084 } 1131 }
1085 } 1132 }
1086 1133
1087 } 1134 }
1088 1135
1089 // DEFAULT BEHAVIORS FOR RENDERBOX CONTAINERS 1136 // DEFAULT BEHAVIORS FOR RENDERBOX CONTAINERS
1090 abstract class RenderBoxContainerDefaultsMixin<ChildType extends RenderBox, Pare ntDataType extends ContainerParentDataMixin<ChildType>> implements ContainerRend erObjectMixin<ChildType, ParentDataType> { 1137 abstract class RenderBoxContainerDefaultsMixin<ChildType extends RenderBox, Pare ntDataType extends ContainerParentDataMixin<ChildType>> implements ContainerRend erObjectMixin<ChildType, ParentDataType> {
1091 1138
1139 double defaultGetDistanceToFirstActualBaseline(TextBaseline baseline) {
1140 assert(!needsLayout);
1141 RenderBox child = firstChild;
1142 while (child != null) {
1143 assert(child.parentData is ParentDataType);
1144 double result = child.getDistanceToActualBaseline(baseline);
1145 if (result != null)
1146 return result + child.parentData.position.y;
1147 child = child.parentData.nextSibling;
1148 }
1149 return null;
1150 }
1151
1152 double defaultGetDistanceToHighestActualBaseline(TextBaseline baseline) {
1153 assert(!needsLayout);
1154 double result;
1155 RenderBox child = firstChild;
1156 while (child != null) {
1157 assert(child.parentData is ParentDataType);
1158 double candidate = child.getDistanceToActualBaseline(baseline);
1159 if (candidate != null) {
1160 candidate += child.parentData.position.x;
1161 if (result != null)
1162 result = math.min(result, candidate);
1163 else
1164 result = candidate;
1165 }
1166 child = child.parentData.nextSibling;
1167 }
1168 return result;
1169 }
1170
1092 void defaultHitTestChildren(HitTestResult result, { Point position }) { 1171 void defaultHitTestChildren(HitTestResult result, { Point position }) {
1093 // the x, y parameters have the top left of the node's box as the origin 1172 // the x, y parameters have the top left of the node's box as the origin
1094 ChildType child = lastChild; 1173 ChildType child = lastChild;
1095 while (child != null) { 1174 while (child != null) {
1096 assert(child.parentData is ParentDataType); 1175 assert(child.parentData is ParentDataType);
1097 Rect childBounds = new Rect.fromPointAndSize(child.parentData.position, ch ild.size); 1176 Rect childBounds = new Rect.fromPointAndSize(child.parentData.position, ch ild.size);
1098 if (childBounds.contains(position)) { 1177 if (childBounds.contains(position)) {
1099 if (child.hitTest(result, position: new Point(position.x - child.parentD ata.position.x, 1178 if (child.hitTest(result, position: new Point(position.x - child.parentD ata.position.x,
1100 position.y - child.par entData.position.y))) 1179 position.y - child.par entData.position.y)))
1101 break; 1180 break;
1102 } 1181 }
1103 child = child.parentData.previousSibling; 1182 child = child.parentData.previousSibling;
1104 } 1183 }
1105 } 1184 }
1106 1185
1107 void defaultPaint(RenderCanvas canvas) { 1186 void defaultPaint(RenderCanvas canvas) {
1108 RenderBox child = firstChild; 1187 RenderBox child = firstChild;
1109 while (child != null) { 1188 while (child != null) {
1110 assert(child.parentData is ParentDataType); 1189 assert(child.parentData is ParentDataType);
1111 canvas.paintChild(child, child.parentData.position); 1190 canvas.paintChild(child, child.parentData.position);
1112 child = child.parentData.nextSibling; 1191 child = child.parentData.nextSibling;
1113 } 1192 }
1114 } 1193 }
1115 } 1194 }
OLDNEW
« no previous file with comments | « sky/sdk/lib/rendering/block.dart ('k') | sky/sdk/lib/rendering/flex.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698