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

Side by Side Diff: Source/core/rendering/RenderBlock.cpp

Issue 22463002: Optimize FloatIntervalSearchAdapter::collectIfNeeded (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebased and merged. Created 7 years, 4 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 | « Source/core/rendering/RenderBlock.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2007 David Smith (catfish.man@gmail.com) 4 * (C) 2007 David Smith (catfish.man@gmail.com)
5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. 6 * Copyright (C) Research In Motion Limited 2010. All rights reserved.
7 * 7 *
8 * This library is free software; you can redistribute it and/or 8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public 9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
(...skipping 4231 matching lines...) Expand 10 before | Expand all | Expand 10 after
4242 // The bottom of the object overlaps the float 4242 // The bottom of the object overlaps the float
4243 if (objectBottom > objectTop && objectBottom > floatTop && objectBottom <= f loatBottom) 4243 if (objectBottom > objectTop && objectBottom > floatTop && objectBottom <= f loatBottom)
4244 return true; 4244 return true;
4245 4245
4246 return false; 4246 return false;
4247 } 4247 }
4248 4248
4249 template<> 4249 template<>
4250 bool RenderBlock::FloatIntervalSearchAdapter<RenderBlock::FloatingObject::FloatL eft>::updateOffsetIfNeeded(const FloatingObject* floatingObject) const 4250 bool RenderBlock::FloatIntervalSearchAdapter<RenderBlock::FloatingObject::FloatL eft>::updateOffsetIfNeeded(const FloatingObject* floatingObject) const
4251 { 4251 {
4252 if (m_renderer->logicalRightForFloat(floatingObject) > m_offset) { 4252 LayoutUnit logicalRight = m_renderer->logicalRightForFloat(floatingObject);
4253 m_offset = m_renderer->logicalRightForFloat(floatingObject); 4253 if (logicalRight > m_offset) {
4254 m_offset = logicalRight;
4254 return true; 4255 return true;
4255 } 4256 }
4256 return false; 4257 return false;
4257 } 4258 }
4258 4259
4259 template<> 4260 template<>
4260 bool RenderBlock::FloatIntervalSearchAdapter<RenderBlock::FloatingObject::FloatR ight>::updateOffsetIfNeeded(const FloatingObject* floatingObject) const 4261 bool RenderBlock::FloatIntervalSearchAdapter<RenderBlock::FloatingObject::FloatR ight>::updateOffsetIfNeeded(const FloatingObject* floatingObject) const
4261 { 4262 {
4262 if (m_renderer->logicalLeftForFloat(floatingObject) < m_offset) { 4263 LayoutUnit logicalLeft = m_renderer->logicalLeftForFloat(floatingObject);
4263 m_offset = m_renderer->logicalLeftForFloat(floatingObject); 4264 if (logicalLeft < m_offset) {
4265 m_offset = logicalLeft;
4264 return true; 4266 return true;
4265 } 4267 }
4266 return false; 4268 return false;
4267 } 4269 }
4268 4270
4269 template <RenderBlock::FloatingObject::Type FloatTypeValue> 4271 template <RenderBlock::FloatingObject::Type FloatTypeValue>
4270 inline void RenderBlock::FloatIntervalSearchAdapter<FloatTypeValue>::collectIfNe eded(const IntervalType& interval) const 4272 inline void RenderBlock::FloatIntervalSearchAdapter<FloatTypeValue>::collectIfNe eded(const IntervalType& interval)
4271 { 4273 {
4272 const FloatingObject* floatingObject = interval.data(); 4274 const FloatingObject* floatingObject = interval.data();
4273 if (floatingObject->type() != FloatTypeValue || !rangesIntersect(interval.lo w(), interval.high(), m_lowValue, m_highValue)) 4275 if (floatingObject->type() != FloatTypeValue || !rangesIntersect(interval.lo w(), interval.high(), m_lowValue, m_highValue))
4274 return; 4276 return;
4275 4277
4276 // All the objects returned from the tree should be already placed. 4278 // All the objects returned from the tree should be already placed.
4277 ASSERT(floatingObject->isPlaced()); 4279 ASSERT(floatingObject->isPlaced());
4278 ASSERT(rangesIntersect(m_renderer->pixelSnappedLogicalTopForFloat(floatingOb ject), m_renderer->pixelSnappedLogicalBottomForFloat(floatingObject), m_lowValue , m_highValue)); 4280 ASSERT(rangesIntersect(m_renderer->pixelSnappedLogicalTopForFloat(floatingOb ject), m_renderer->pixelSnappedLogicalBottomForFloat(floatingObject), m_lowValue , m_highValue));
4279 4281
4280 bool floatIsNewExtreme = updateOffsetIfNeeded(floatingObject); 4282 bool floatIsNewExtreme = updateOffsetIfNeeded(floatingObject);
4281 if (floatIsNewExtreme && m_heightRemaining) 4283 if (floatIsNewExtreme) {
eseidel 2013/08/12 22:13:29 I believe webkit style drops these {}
shatch 2013/08/12 22:20:33 Done.
4282 *m_heightRemaining = m_renderer->logicalBottomForFloat(floatingObject) - m_lowValue; 4284 m_floatForHeight = floatingObject;
4285 }
4283 4286
4284 m_last = floatingObject; 4287 m_last = floatingObject;
4285 } 4288 }
4286 4289
4290 template <RenderBlock::FloatingObject::Type FloatTypeValue>
4291 LayoutUnit RenderBlock::FloatIntervalSearchAdapter<FloatTypeValue>::getHeightRem aining() const
4292 {
4293 return m_floatForHeight ? m_renderer->logicalBottomForFloat(m_floatForHeight ) - m_lowValue : LayoutUnit(1);
4294 }
4295
4287 LayoutUnit RenderBlock::textIndentOffset() const 4296 LayoutUnit RenderBlock::textIndentOffset() const
4288 { 4297 {
4289 LayoutUnit cw = 0; 4298 LayoutUnit cw = 0;
4290 RenderView* renderView = 0; 4299 RenderView* renderView = 0;
4291 if (style()->textIndent().isPercent()) 4300 if (style()->textIndent().isPercent())
4292 cw = containingBlock()->availableLogicalWidth(); 4301 cw = containingBlock()->availableLogicalWidth();
4293 else if (style()->textIndent().isViewportPercentage()) 4302 else if (style()->textIndent().isViewportPercentage())
4294 renderView = view(); 4303 renderView = view();
4295 return minimumValueForLength(style()->textIndent(), cw, renderView); 4304 return minimumValueForLength(style()->textIndent(), cw, renderView);
4296 } 4305 }
(...skipping 14 matching lines...) Expand all
4311 if (!region) 4320 if (!region)
4312 return logicalRightOffset; 4321 return logicalRightOffset;
4313 LayoutRect boxRect = borderBoxRectInRegion(region, offsetFromLogicalTopOfFir stPage); 4322 LayoutRect boxRect = borderBoxRectInRegion(region, offsetFromLogicalTopOfFir stPage);
4314 return logicalRightOffset - (logicalWidth() - (isHorizontalWritingMode() ? b oxRect.maxX() : boxRect.maxY())); 4323 return logicalRightOffset - (logicalWidth() - (isHorizontalWritingMode() ? b oxRect.maxX() : boxRect.maxY()));
4315 } 4324 }
4316 4325
4317 LayoutUnit RenderBlock::logicalLeftFloatOffsetForLine(LayoutUnit logicalTop, Lay outUnit fixedOffset, LayoutUnit* heightRemaining, LayoutUnit logicalHeight, Shap eOutsideFloatOffsetMode offsetMode) const 4326 LayoutUnit RenderBlock::logicalLeftFloatOffsetForLine(LayoutUnit logicalTop, Lay outUnit fixedOffset, LayoutUnit* heightRemaining, LayoutUnit logicalHeight, Shap eOutsideFloatOffsetMode offsetMode) const
4318 { 4327 {
4319 LayoutUnit left = fixedOffset; 4328 LayoutUnit left = fixedOffset;
4320 if (m_floatingObjects && m_floatingObjects->hasLeftObjects()) { 4329 if (m_floatingObjects && m_floatingObjects->hasLeftObjects()) {
4330 FloatIntervalSearchAdapter<FloatingObject::FloatLeft> adapter(this, roun dToInt(logicalTop), roundToInt(logicalTop + logicalHeight), left);
4331 m_floatingObjects->placedFloatsTree().allOverlapsWithAdapter(adapter);
4332
4321 if (heightRemaining) 4333 if (heightRemaining)
4322 *heightRemaining = 1; 4334 *heightRemaining = adapter.getHeightRemaining();
4323
4324 FloatIntervalSearchAdapter<FloatingObject::FloatLeft> adapter(this, roun dToInt(logicalTop), roundToInt(logicalTop + logicalHeight), left, heightRemainin g);
4325 m_floatingObjects->placedFloatsTree().allOverlapsWithAdapter(adapter);
4326 4335
4327 const FloatingObject* lastFloat = adapter.lastFloat(); 4336 const FloatingObject* lastFloat = adapter.lastFloat();
4328 if (offsetMode == ShapeOutsideFloatShapeOffset && lastFloat) { 4337 if (offsetMode == ShapeOutsideFloatShapeOffset && lastFloat) {
4329 if (ShapeOutsideInfo* shapeOutside = lastFloat->renderer()->shapeOut sideInfo()) { 4338 if (ShapeOutsideInfo* shapeOutside = lastFloat->renderer()->shapeOut sideInfo()) {
4330 shapeOutside->computeSegmentsForContainingBlockLine(logicalTop, logicalTopForFloat(lastFloat), logicalHeight); 4339 shapeOutside->computeSegmentsForContainingBlockLine(logicalTop, logicalTopForFloat(lastFloat), logicalHeight);
4331 left += shapeOutside->rightSegmentMarginBoxDelta(); 4340 left += shapeOutside->rightSegmentMarginBoxDelta();
4332 } 4341 }
4333 } 4342 }
4334 } 4343 }
4335 4344
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
4371 // (https://bugs.webkit.org/show_bug.cgi?id=79944) 4380 // (https://bugs.webkit.org/show_bug.cgi?id=79944)
4372 float remainder = fmodf(maxCharWidth - fmodf(left + layoutOffset - lineGridO ffset, maxCharWidth), maxCharWidth); 4381 float remainder = fmodf(maxCharWidth - fmodf(left + layoutOffset - lineGridO ffset, maxCharWidth), maxCharWidth);
4373 left += remainder; 4382 left += remainder;
4374 return left; 4383 return left;
4375 } 4384 }
4376 4385
4377 LayoutUnit RenderBlock::logicalRightFloatOffsetForLine(LayoutUnit logicalTop, La youtUnit fixedOffset, LayoutUnit* heightRemaining, LayoutUnit logicalHeight, Sha peOutsideFloatOffsetMode offsetMode) const 4386 LayoutUnit RenderBlock::logicalRightFloatOffsetForLine(LayoutUnit logicalTop, La youtUnit fixedOffset, LayoutUnit* heightRemaining, LayoutUnit logicalHeight, Sha peOutsideFloatOffsetMode offsetMode) const
4378 { 4387 {
4379 LayoutUnit right = fixedOffset; 4388 LayoutUnit right = fixedOffset;
4380 if (m_floatingObjects && m_floatingObjects->hasRightObjects()) { 4389 if (m_floatingObjects && m_floatingObjects->hasRightObjects()) {
4390 LayoutUnit rightFloatOffset = fixedOffset;
4391 FloatIntervalSearchAdapter<FloatingObject::FloatRight> adapter(this, rou ndToInt(logicalTop), roundToInt(logicalTop + logicalHeight), rightFloatOffset);
4392 m_floatingObjects->placedFloatsTree().allOverlapsWithAdapter(adapter);
4393
4381 if (heightRemaining) 4394 if (heightRemaining)
4382 *heightRemaining = 1; 4395 *heightRemaining = adapter.getHeightRemaining();
4383
4384 LayoutUnit rightFloatOffset = fixedOffset;
4385 FloatIntervalSearchAdapter<FloatingObject::FloatRight> adapter(this, rou ndToInt(logicalTop), roundToInt(logicalTop + logicalHeight), rightFloatOffset, h eightRemaining);
4386 m_floatingObjects->placedFloatsTree().allOverlapsWithAdapter(adapter);
4387 4396
4388 const FloatingObject* lastFloat = adapter.lastFloat(); 4397 const FloatingObject* lastFloat = adapter.lastFloat();
4389 if (offsetMode == ShapeOutsideFloatShapeOffset && lastFloat) { 4398 if (offsetMode == ShapeOutsideFloatShapeOffset && lastFloat) {
4390 if (ShapeOutsideInfo* shapeOutside = lastFloat->renderer()->shapeOut sideInfo()) { 4399 if (ShapeOutsideInfo* shapeOutside = lastFloat->renderer()->shapeOut sideInfo()) {
4391 shapeOutside->computeSegmentsForContainingBlockLine(logicalTop, logicalTopForFloat(lastFloat), logicalHeight); 4400 shapeOutside->computeSegmentsForContainingBlockLine(logicalTop, logicalTopForFloat(lastFloat), logicalHeight);
4392 rightFloatOffset += shapeOutside->leftSegmentMarginBoxDelta(); 4401 rightFloatOffset += shapeOutside->leftSegmentMarginBoxDelta();
4393 } 4402 }
4394 } 4403 }
4395 4404
4396 right = min(right, rightFloatOffset); 4405 right = min(right, rightFloatOffset);
(...skipping 3766 matching lines...) Expand 10 before | Expand all | Expand 10 after
8163 8172
8164 String ValueToString<RenderBlock::FloatingObject*>::string(const RenderBlock::Fl oatingObject* floatingObject) 8173 String ValueToString<RenderBlock::FloatingObject*>::string(const RenderBlock::Fl oatingObject* floatingObject)
8165 { 8174 {
8166 return String::format("%p (%dx%d %dx%d)", floatingObject, floatingObject->fr ameRect().pixelSnappedX(), floatingObject->frameRect().pixelSnappedY(), floating Object->frameRect().pixelSnappedMaxX(), floatingObject->frameRect().pixelSnapped MaxY()); 8175 return String::format("%p (%dx%d %dx%d)", floatingObject, floatingObject->fr ameRect().pixelSnappedX(), floatingObject->frameRect().pixelSnappedY(), floating Object->frameRect().pixelSnappedMaxX(), floatingObject->frameRect().pixelSnapped MaxY());
8167 } 8176 }
8168 8177
8169 8178
8170 #endif 8179 #endif
8171 8180
8172 } // namespace WebCore 8181 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderBlock.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698