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

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: Changes from review. 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)
4282 *m_heightRemaining = m_renderer->logicalBottomForFloat(floatingObject) - m_lowValue; 4284 m_floatForHeight = floatingObject;
4283 4285
4284 m_last = floatingObject; 4286 m_last = floatingObject;
4285 } 4287 }
4286 4288
4289 template <RenderBlock::FloatingObject::Type FloatTypeValue>
4290 LayoutUnit RenderBlock::FloatIntervalSearchAdapter<FloatTypeValue>::getHeightRem aining() const
4291 {
4292 return m_floatForHeight ? m_renderer->logicalBottomForFloat(m_floatForHeight ) - m_lowValue : LayoutUnit(1);
4293 }
4294
4287 LayoutUnit RenderBlock::textIndentOffset() const 4295 LayoutUnit RenderBlock::textIndentOffset() const
4288 { 4296 {
4289 LayoutUnit cw = 0; 4297 LayoutUnit cw = 0;
4290 RenderView* renderView = 0; 4298 RenderView* renderView = 0;
4291 if (style()->textIndent().isPercent()) 4299 if (style()->textIndent().isPercent())
4292 cw = containingBlock()->availableLogicalWidth(); 4300 cw = containingBlock()->availableLogicalWidth();
4293 else if (style()->textIndent().isViewportPercentage()) 4301 else if (style()->textIndent().isViewportPercentage())
4294 renderView = view(); 4302 renderView = view();
4295 return minimumValueForLength(style()->textIndent(), cw, renderView); 4303 return minimumValueForLength(style()->textIndent(), cw, renderView);
4296 } 4304 }
(...skipping 14 matching lines...) Expand all
4311 if (!region) 4319 if (!region)
4312 return logicalRightOffset; 4320 return logicalRightOffset;
4313 LayoutRect boxRect = borderBoxRectInRegion(region, offsetFromLogicalTopOfFir stPage); 4321 LayoutRect boxRect = borderBoxRectInRegion(region, offsetFromLogicalTopOfFir stPage);
4314 return logicalRightOffset - (logicalWidth() - (isHorizontalWritingMode() ? b oxRect.maxX() : boxRect.maxY())); 4322 return logicalRightOffset - (logicalWidth() - (isHorizontalWritingMode() ? b oxRect.maxX() : boxRect.maxY()));
4315 } 4323 }
4316 4324
4317 LayoutUnit RenderBlock::logicalLeftFloatOffsetForLine(LayoutUnit logicalTop, Lay outUnit fixedOffset, LayoutUnit* heightRemaining, LayoutUnit logicalHeight, Shap eOutsideFloatOffsetMode offsetMode) const 4325 LayoutUnit RenderBlock::logicalLeftFloatOffsetForLine(LayoutUnit logicalTop, Lay outUnit fixedOffset, LayoutUnit* heightRemaining, LayoutUnit logicalHeight, Shap eOutsideFloatOffsetMode offsetMode) const
4318 { 4326 {
4319 LayoutUnit left = fixedOffset; 4327 LayoutUnit left = fixedOffset;
4320 if (m_floatingObjects && m_floatingObjects->hasLeftObjects()) { 4328 if (m_floatingObjects && m_floatingObjects->hasLeftObjects()) {
4329 FloatIntervalSearchAdapter<FloatingObject::FloatLeft> adapter(this, roun dToInt(logicalTop), roundToInt(logicalTop + logicalHeight), left);
4330 m_floatingObjects->placedFloatsTree().allOverlapsWithAdapter(adapter);
4331
4321 if (heightRemaining) 4332 if (heightRemaining)
4322 *heightRemaining = 1; 4333 *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 4334
4327 const FloatingObject* lastFloat = adapter.lastFloat(); 4335 const FloatingObject* lastFloat = adapter.lastFloat();
4328 if (offsetMode == ShapeOutsideFloatShapeOffset && lastFloat) { 4336 if (offsetMode == ShapeOutsideFloatShapeOffset && lastFloat) {
4329 if (ShapeOutsideInfo* shapeOutside = lastFloat->renderer()->shapeOut sideInfo()) { 4337 if (ShapeOutsideInfo* shapeOutside = lastFloat->renderer()->shapeOut sideInfo()) {
4330 shapeOutside->computeSegmentsForContainingBlockLine(logicalTop, logicalTopForFloat(lastFloat), logicalHeight); 4338 shapeOutside->computeSegmentsForContainingBlockLine(logicalTop, logicalTopForFloat(lastFloat), logicalHeight);
4331 left += shapeOutside->rightSegmentMarginBoxDelta(); 4339 left += shapeOutside->rightSegmentMarginBoxDelta();
4332 } 4340 }
4333 } 4341 }
4334 } 4342 }
4335 4343
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
4371 // (https://bugs.webkit.org/show_bug.cgi?id=79944) 4379 // (https://bugs.webkit.org/show_bug.cgi?id=79944)
4372 float remainder = fmodf(maxCharWidth - fmodf(left + layoutOffset - lineGridO ffset, maxCharWidth), maxCharWidth); 4380 float remainder = fmodf(maxCharWidth - fmodf(left + layoutOffset - lineGridO ffset, maxCharWidth), maxCharWidth);
4373 left += remainder; 4381 left += remainder;
4374 return left; 4382 return left;
4375 } 4383 }
4376 4384
4377 LayoutUnit RenderBlock::logicalRightFloatOffsetForLine(LayoutUnit logicalTop, La youtUnit fixedOffset, LayoutUnit* heightRemaining, LayoutUnit logicalHeight, Sha peOutsideFloatOffsetMode offsetMode) const 4385 LayoutUnit RenderBlock::logicalRightFloatOffsetForLine(LayoutUnit logicalTop, La youtUnit fixedOffset, LayoutUnit* heightRemaining, LayoutUnit logicalHeight, Sha peOutsideFloatOffsetMode offsetMode) const
4378 { 4386 {
4379 LayoutUnit right = fixedOffset; 4387 LayoutUnit right = fixedOffset;
4380 if (m_floatingObjects && m_floatingObjects->hasRightObjects()) { 4388 if (m_floatingObjects && m_floatingObjects->hasRightObjects()) {
4389 LayoutUnit rightFloatOffset = fixedOffset;
4390 FloatIntervalSearchAdapter<FloatingObject::FloatRight> adapter(this, rou ndToInt(logicalTop), roundToInt(logicalTop + logicalHeight), rightFloatOffset);
4391 m_floatingObjects->placedFloatsTree().allOverlapsWithAdapter(adapter);
4392
4381 if (heightRemaining) 4393 if (heightRemaining)
4382 *heightRemaining = 1; 4394 *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 4395
4388 const FloatingObject* lastFloat = adapter.lastFloat(); 4396 const FloatingObject* lastFloat = adapter.lastFloat();
4389 if (offsetMode == ShapeOutsideFloatShapeOffset && lastFloat) { 4397 if (offsetMode == ShapeOutsideFloatShapeOffset && lastFloat) {
4390 if (ShapeOutsideInfo* shapeOutside = lastFloat->renderer()->shapeOut sideInfo()) { 4398 if (ShapeOutsideInfo* shapeOutside = lastFloat->renderer()->shapeOut sideInfo()) {
4391 shapeOutside->computeSegmentsForContainingBlockLine(logicalTop, logicalTopForFloat(lastFloat), logicalHeight); 4399 shapeOutside->computeSegmentsForContainingBlockLine(logicalTop, logicalTopForFloat(lastFloat), logicalHeight);
4392 rightFloatOffset += shapeOutside->leftSegmentMarginBoxDelta(); 4400 rightFloatOffset += shapeOutside->leftSegmentMarginBoxDelta();
4393 } 4401 }
4394 } 4402 }
4395 4403
4396 right = min(right, rightFloatOffset); 4404 right = min(right, rightFloatOffset);
(...skipping 3766 matching lines...) Expand 10 before | Expand all | Expand 10 after
8163 8171
8164 String ValueToString<RenderBlock::FloatingObject*>::string(const RenderBlock::Fl oatingObject* floatingObject) 8172 String ValueToString<RenderBlock::FloatingObject*>::string(const RenderBlock::Fl oatingObject* floatingObject)
8165 { 8173 {
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()); 8174 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 } 8175 }
8168 8176
8169 8177
8170 #endif 8178 #endif
8171 8179
8172 } // namespace WebCore 8180 } // 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