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

Side by Side Diff: Source/core/layout/FloatingObjects.cpp

Issue 763173003: Convert RenderBlockFlow code to use FloatingObject references (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase Created 5 years, 6 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/layout/FloatingObjects.h ('k') | Source/core/layout/LayoutBlockFlow.h » ('j') | 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 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 209
210 LayoutUnit lowestFloatBottom = 0; 210 LayoutUnit lowestFloatBottom = 0;
211 const FloatingObjectSet& floatingObjectSet = set(); 211 const FloatingObjectSet& floatingObjectSet = set();
212 FloatingObjectSetIterator end = floatingObjectSet.end(); 212 FloatingObjectSetIterator end = floatingObjectSet.end();
213 if (floatType == FloatingObject::FloatLeftRight) { 213 if (floatType == FloatingObject::FloatLeftRight) {
214 FloatingObject* lowestFloatingObjectLeft = nullptr; 214 FloatingObject* lowestFloatingObjectLeft = nullptr;
215 FloatingObject* lowestFloatingObjectRight = nullptr; 215 FloatingObject* lowestFloatingObjectRight = nullptr;
216 LayoutUnit lowestFloatBottomLeft = 0; 216 LayoutUnit lowestFloatBottomLeft = 0;
217 LayoutUnit lowestFloatBottomRight = 0; 217 LayoutUnit lowestFloatBottomRight = 0;
218 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end ; ++it) { 218 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end ; ++it) {
219 FloatingObject* floatingObject = it->get(); 219 FloatingObject& floatingObject = *it->get();
220 if (floatingObject->isPlaced()) { 220 if (floatingObject.isPlaced()) {
221 FloatingObject::Type curType = floatingObject->type(); 221 FloatingObject::Type curType = floatingObject.type();
222 LayoutUnit curFloatLogicalBottom = m_layoutObject->logicalBottom ForFloat(floatingObject); 222 LayoutUnit curFloatLogicalBottom = m_layoutObject->logicalBottom ForFloat(floatingObject);
223 if (curType & FloatingObject::FloatLeft && curFloatLogicalBottom > lowestFloatBottomLeft) { 223 if (curType & FloatingObject::FloatLeft && curFloatLogicalBottom > lowestFloatBottomLeft) {
224 lowestFloatBottomLeft = curFloatLogicalBottom; 224 lowestFloatBottomLeft = curFloatLogicalBottom;
225 lowestFloatingObjectLeft = floatingObject; 225 lowestFloatingObjectLeft = &floatingObject;
226 } 226 }
227 if (curType & FloatingObject::FloatRight && curFloatLogicalBotto m > lowestFloatBottomRight) { 227 if (curType & FloatingObject::FloatRight && curFloatLogicalBotto m > lowestFloatBottomRight) {
228 lowestFloatBottomRight = curFloatLogicalBottom; 228 lowestFloatBottomRight = curFloatLogicalBottom;
229 lowestFloatingObjectRight = floatingObject; 229 lowestFloatingObjectRight = &floatingObject;
230 } 230 }
231 } 231 }
232 } 232 }
233 lowestFloatBottom = std::max(lowestFloatBottomLeft, lowestFloatBottomRig ht); 233 lowestFloatBottom = std::max(lowestFloatBottomLeft, lowestFloatBottomRig ht);
234 setCachedLowestFloatLogicalBottom(isInHorizontalWritingMode, FloatingObj ect::FloatLeft, lowestFloatingObjectLeft); 234 setCachedLowestFloatLogicalBottom(isInHorizontalWritingMode, FloatingObj ect::FloatLeft, lowestFloatingObjectLeft);
235 setCachedLowestFloatLogicalBottom(isInHorizontalWritingMode, FloatingObj ect::FloatRight, lowestFloatingObjectRight); 235 setCachedLowestFloatLogicalBottom(isInHorizontalWritingMode, FloatingObj ect::FloatRight, lowestFloatingObjectRight);
236 } else { 236 } else {
237 FloatingObject* lowestFloatingObject = nullptr; 237 FloatingObject* lowestFloatingObject = nullptr;
238 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end ; ++it) { 238 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end ; ++it) {
239 FloatingObject* floatingObject = it->get(); 239 FloatingObject& floatingObject = *it->get();
240 if (floatingObject->isPlaced() && floatingObject->type() == floatTyp e) { 240 if (floatingObject.isPlaced() && floatingObject.type() == floatType) {
241 if (m_layoutObject->logicalBottomForFloat(floatingObject) > lowe stFloatBottom) { 241 if (m_layoutObject->logicalBottomForFloat(floatingObject) > lowe stFloatBottom) {
242 lowestFloatingObject = floatingObject; 242 lowestFloatingObject = &floatingObject;
243 lowestFloatBottom = m_layoutObject->logicalBottomForFloat(fl oatingObject); 243 lowestFloatBottom = m_layoutObject->logicalBottomForFloat(fl oatingObject);
244 } 244 }
245 } 245 }
246 } 246 }
247 setCachedLowestFloatLogicalBottom(isInHorizontalWritingMode, floatType, lowestFloatingObject); 247 setCachedLowestFloatLogicalBottom(isInHorizontalWritingMode, floatType, lowestFloatingObject);
248 } 248 }
249 249
250 return lowestFloatBottom; 250 return lowestFloatBottom;
251 } 251 }
252 252
253 bool FloatingObjects::hasLowestFloatLogicalBottomCached(bool isHorizontal, Float ingObject::Type type) const 253 bool FloatingObjects::hasLowestFloatLogicalBottomCached(bool isHorizontal, Float ingObject::Type type) const
254 { 254 {
255 int floatIndex = static_cast<int>(type) - 1; 255 int floatIndex = static_cast<int>(type) - 1;
256 ASSERT(floatIndex < static_cast<int>(sizeof(m_lowestFloatBottomCache) / size of(FloatBottomCachedValue))); 256 ASSERT(floatIndex < static_cast<int>(sizeof(m_lowestFloatBottomCache) / size of(FloatBottomCachedValue)));
257 ASSERT(floatIndex >= 0); 257 ASSERT(floatIndex >= 0);
258 return (m_cachedHorizontalWritingMode == isHorizontal && !m_lowestFloatBotto mCache[floatIndex].dirty); 258 return (m_cachedHorizontalWritingMode == isHorizontal && !m_lowestFloatBotto mCache[floatIndex].dirty);
259 } 259 }
260 260
261 LayoutUnit FloatingObjects::getCachedlowestFloatLogicalBottom(FloatingObject::Ty pe type) const 261 LayoutUnit FloatingObjects::getCachedlowestFloatLogicalBottom(FloatingObject::Ty pe type) const
262 { 262 {
263 int floatIndex = static_cast<int>(type) - 1; 263 int floatIndex = static_cast<int>(type) - 1;
264 ASSERT(floatIndex < static_cast<int>(sizeof(m_lowestFloatBottomCache) / size of(FloatBottomCachedValue))); 264 ASSERT(floatIndex < static_cast<int>(sizeof(m_lowestFloatBottomCache) / size of(FloatBottomCachedValue)));
265 ASSERT(floatIndex >= 0); 265 ASSERT(floatIndex >= 0);
266 if (!m_lowestFloatBottomCache[floatIndex].floatingObject) 266 if (!m_lowestFloatBottomCache[floatIndex].floatingObject)
267 return LayoutUnit(); 267 return LayoutUnit();
268 return m_layoutObject->logicalBottomForFloat(m_lowestFloatBottomCache[floatI ndex].floatingObject); 268 return m_layoutObject->logicalBottomForFloat(*m_lowestFloatBottomCache[float Index].floatingObject);
269 } 269 }
270 270
271 void FloatingObjects::setCachedLowestFloatLogicalBottom(bool isHorizontal, Float ingObject::Type type, FloatingObject* floatingObject) 271 void FloatingObjects::setCachedLowestFloatLogicalBottom(bool isHorizontal, Float ingObject::Type type, FloatingObject* floatingObject)
272 { 272 {
273 int floatIndex = static_cast<int>(type) - 1; 273 int floatIndex = static_cast<int>(type) - 1;
274 ASSERT(floatIndex < static_cast<int>(sizeof(m_lowestFloatBottomCache) / size of(FloatBottomCachedValue))); 274 ASSERT(floatIndex < static_cast<int>(sizeof(m_lowestFloatBottomCache) / size of(FloatBottomCachedValue)));
275 ASSERT(floatIndex >= 0); 275 ASSERT(floatIndex >= 0);
276 m_cachedHorizontalWritingMode = isHorizontal; 276 m_cachedHorizontalWritingMode = isHorizontal;
277 m_lowestFloatBottomCache[floatIndex].floatingObject = floatingObject; 277 m_lowestFloatBottomCache[floatIndex].floatingObject = floatingObject;
278 m_lowestFloatBottomCache[floatIndex].dirty = false; 278 m_lowestFloatBottomCache[floatIndex].dirty = false;
279 } 279 }
280 280
281 FloatingObject* FloatingObjects::lowestFloatingObject() const 281 FloatingObject* FloatingObjects::lowestFloatingObject() const
282 { 282 {
283 bool isInHorizontalWritingMode = m_horizontalWritingMode; 283 bool isInHorizontalWritingMode = m_horizontalWritingMode;
284 if (!hasLowestFloatLogicalBottomCached(isInHorizontalWritingMode, FloatingOb ject::FloatLeft) && !hasLowestFloatLogicalBottomCached(isInHorizontalWritingMode , FloatingObject::FloatRight)) 284 if (!hasLowestFloatLogicalBottomCached(isInHorizontalWritingMode, FloatingOb ject::FloatLeft) && !hasLowestFloatLogicalBottomCached(isInHorizontalWritingMode , FloatingObject::FloatRight))
285 return nullptr; 285 return nullptr;
286 FloatingObject* lowestLeftObject = m_lowestFloatBottomCache[0].floatingObjec t; 286 FloatingObject* lowestLeftObject = m_lowestFloatBottomCache[0].floatingObjec t;
287 FloatingObject* lowestRightObject = m_lowestFloatBottomCache[1].floatingObje ct; 287 FloatingObject* lowestRightObject = m_lowestFloatBottomCache[1].floatingObje ct;
288 LayoutUnit lowestFloatBottomLeft = lowestLeftObject ? m_layoutObject->logica lBottomForFloat(lowestLeftObject) : LayoutUnit(); 288 LayoutUnit lowestFloatBottomLeft = lowestLeftObject ? m_layoutObject->logica lBottomForFloat(*lowestLeftObject) : LayoutUnit();
289 LayoutUnit lowestFloatBottomRight = lowestRightObject ? m_layoutObject->logi calBottomForFloat(lowestRightObject) : LayoutUnit(); 289 LayoutUnit lowestFloatBottomRight = lowestRightObject ? m_layoutObject->logi calBottomForFloat(*lowestRightObject) : LayoutUnit();
290 290
291 if (lowestFloatBottomLeft > lowestFloatBottomRight) 291 if (lowestFloatBottomLeft > lowestFloatBottomRight)
292 return lowestLeftObject; 292 return lowestLeftObject;
293 return lowestRightObject; 293 return lowestRightObject;
294 } 294 }
295 295
296 void FloatingObjects::markLowestFloatLogicalBottomCacheAsDirty() 296 void FloatingObjects::markLowestFloatLogicalBottomCacheAsDirty()
297 { 297 {
298 for (size_t i = 0; i < sizeof(m_lowestFloatBottomCache) / sizeof(FloatBottom CachedValue); ++i) 298 for (size_t i = 0; i < sizeof(m_lowestFloatBottomCache) / sizeof(FloatBottom CachedValue); ++i)
299 m_lowestFloatBottomCache[i].dirty = true; 299 m_lowestFloatBottomCache[i].dirty = true;
(...skipping 18 matching lines...) Expand all
318 } 318 }
319 319
320 inline void FloatingObjects::decreaseObjectsCount(FloatingObject::Type type) 320 inline void FloatingObjects::decreaseObjectsCount(FloatingObject::Type type)
321 { 321 {
322 if (type == FloatingObject::FloatLeft) 322 if (type == FloatingObject::FloatLeft)
323 m_leftObjectsCount--; 323 m_leftObjectsCount--;
324 else 324 else
325 m_rightObjectsCount--; 325 m_rightObjectsCount--;
326 } 326 }
327 327
328 inline FloatingObjectInterval FloatingObjects::intervalForFloatingObject(Floatin gObject* floatingObject) 328 inline FloatingObjectInterval FloatingObjects::intervalForFloatingObject(Floatin gObject& floatingObject)
329 { 329 {
330 if (m_horizontalWritingMode) 330 if (m_horizontalWritingMode)
331 return FloatingObjectInterval(floatingObject->frameRect().pixelSnappedY( ), floatingObject->frameRect().pixelSnappedMaxY(), floatingObject); 331 return FloatingObjectInterval(floatingObject.frameRect().pixelSnappedY() , floatingObject.frameRect().pixelSnappedMaxY(), &floatingObject);
332 return FloatingObjectInterval(floatingObject->frameRect().pixelSnappedX(), f loatingObject->frameRect().pixelSnappedMaxX(), floatingObject); 332 return FloatingObjectInterval(floatingObject.frameRect().pixelSnappedX(), fl oatingObject.frameRect().pixelSnappedMaxX(), &floatingObject);
333 } 333 }
334 334
335 void FloatingObjects::addPlacedObject(FloatingObject* floatingObject) 335 void FloatingObjects::addPlacedObject(FloatingObject& floatingObject)
336 { 336 {
337 ASSERT(!floatingObject->isInPlacedTree()); 337 ASSERT(!floatingObject.isInPlacedTree());
338 338
339 floatingObject->setIsPlaced(true); 339 floatingObject.setIsPlaced(true);
340 if (m_placedFloatsTree.isInitialized()) 340 if (m_placedFloatsTree.isInitialized())
341 m_placedFloatsTree.add(intervalForFloatingObject(floatingObject)); 341 m_placedFloatsTree.add(intervalForFloatingObject(floatingObject));
342 342
343 #if ENABLE(ASSERT) 343 #if ENABLE(ASSERT)
344 floatingObject->setIsInPlacedTree(true); 344 floatingObject.setIsInPlacedTree(true);
345 #endif 345 #endif
346 markLowestFloatLogicalBottomCacheAsDirty(); 346 markLowestFloatLogicalBottomCacheAsDirty();
347 } 347 }
348 348
349 void FloatingObjects::removePlacedObject(FloatingObject* floatingObject) 349 void FloatingObjects::removePlacedObject(FloatingObject& floatingObject)
350 { 350 {
351 ASSERT(floatingObject->isPlaced() && floatingObject->isInPlacedTree()); 351 ASSERT(floatingObject.isPlaced() && floatingObject.isInPlacedTree());
352 352
353 if (m_placedFloatsTree.isInitialized()) { 353 if (m_placedFloatsTree.isInitialized()) {
354 bool removed = m_placedFloatsTree.remove(intervalForFloatingObject(float ingObject)); 354 bool removed = m_placedFloatsTree.remove(intervalForFloatingObject(float ingObject));
355 ASSERT_UNUSED(removed, removed); 355 ASSERT_UNUSED(removed, removed);
356 } 356 }
357 357
358 floatingObject->setIsPlaced(false); 358 floatingObject.setIsPlaced(false);
359 #if ENABLE(ASSERT) 359 #if ENABLE(ASSERT)
360 floatingObject->setIsInPlacedTree(false); 360 floatingObject.setIsInPlacedTree(false);
361 #endif 361 #endif
362 markLowestFloatLogicalBottomCacheAsDirty(); 362 markLowestFloatLogicalBottomCacheAsDirty();
363 } 363 }
364 364
365 FloatingObject* FloatingObjects::add(PassOwnPtr<FloatingObject> floatingObject) 365 FloatingObject* FloatingObjects::add(PassOwnPtr<FloatingObject> floatingObject)
366 { 366 {
367 FloatingObject* newObject = floatingObject.leakPtr(); 367 FloatingObject* newObject = floatingObject.leakPtr();
368 increaseObjectsCount(newObject->type()); 368 increaseObjectsCount(newObject->type());
369 m_set.add(adoptPtr(newObject)); 369 m_set.add(adoptPtr(newObject));
370 if (newObject->isPlaced()) 370 if (newObject->isPlaced())
371 addPlacedObject(newObject); 371 addPlacedObject(*newObject);
372 markLowestFloatLogicalBottomCacheAsDirty(); 372 markLowestFloatLogicalBottomCacheAsDirty();
373 return newObject; 373 return newObject;
374 } 374 }
375 375
376 void FloatingObjects::remove(FloatingObject* toBeRemoved) 376 void FloatingObjects::remove(FloatingObject* toBeRemoved)
377 { 377 {
378 decreaseObjectsCount(toBeRemoved->type()); 378 decreaseObjectsCount(toBeRemoved->type());
379 OwnPtr<FloatingObject> floatingObject = m_set.take(toBeRemoved); 379 OwnPtr<FloatingObject> floatingObject = m_set.take(toBeRemoved);
380 ASSERT(floatingObject->isPlaced() || !floatingObject->isInPlacedTree()); 380 ASSERT(floatingObject->isPlaced() || !floatingObject->isInPlacedTree());
381 if (floatingObject->isPlaced()) 381 if (floatingObject->isPlaced())
382 removePlacedObject(floatingObject.get()); 382 removePlacedObject(*floatingObject);
383 markLowestFloatLogicalBottomCacheAsDirty(); 383 markLowestFloatLogicalBottomCacheAsDirty();
384 ASSERT(!floatingObject->originatingLine()); 384 ASSERT(!floatingObject->originatingLine());
385 } 385 }
386 386
387 void FloatingObjects::computePlacedFloatsTree() 387 void FloatingObjects::computePlacedFloatsTree()
388 { 388 {
389 ASSERT(!m_placedFloatsTree.isInitialized()); 389 ASSERT(!m_placedFloatsTree.isInitialized());
390 if (m_set.isEmpty()) 390 if (m_set.isEmpty())
391 return; 391 return;
392 m_placedFloatsTree.initIfNeeded(m_layoutObject->view()->intervalArena()); 392 m_placedFloatsTree.initIfNeeded(m_layoutObject->view()->intervalArena());
393 FloatingObjectSetIterator it = m_set.begin(); 393 FloatingObjectSetIterator it = m_set.begin();
394 FloatingObjectSetIterator end = m_set.end(); 394 FloatingObjectSetIterator end = m_set.end();
395 for (; it != end; ++it) { 395 for (; it != end; ++it) {
396 FloatingObject* floatingObject = it->get(); 396 FloatingObject& floatingObject = *it->get();
397 if (floatingObject->isPlaced()) 397 if (floatingObject.isPlaced())
398 m_placedFloatsTree.add(intervalForFloatingObject(floatingObject)); 398 m_placedFloatsTree.add(intervalForFloatingObject(floatingObject));
399 } 399 }
400 } 400 }
401 401
402 LayoutUnit FloatingObjects::logicalLeftOffsetForPositioningFloat(LayoutUnit fixe dOffset, LayoutUnit logicalTop, LayoutUnit *heightRemaining) 402 LayoutUnit FloatingObjects::logicalLeftOffsetForPositioningFloat(LayoutUnit fixe dOffset, LayoutUnit logicalTop, LayoutUnit *heightRemaining)
403 { 403 {
404 int logicalTopAsInt = roundToInt(logicalTop); 404 int logicalTopAsInt = roundToInt(logicalTop);
405 ComputeFloatOffsetForFloatLayoutAdapter<FloatingObject::FloatLeft> adapter(m _layoutObject, logicalTopAsInt, logicalTopAsInt, fixedOffset); 405 ComputeFloatOffsetForFloatLayoutAdapter<FloatingObject::FloatLeft> adapter(m _layoutObject, logicalTopAsInt, logicalTopAsInt, fixedOffset);
406 placedFloatsTree().allOverlapsWithAdapter(adapter); 406 placedFloatsTree().allOverlapsWithAdapter(adapter);
407 407
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
461 // The bottom of the object overlaps the float 461 // The bottom of the object overlaps the float
462 if (objectBottom > objectTop && objectBottom > floatTop && objectBottom <= f loatBottom) 462 if (objectBottom > objectTop && objectBottom > floatTop && objectBottom <= f loatBottom)
463 return true; 463 return true;
464 464
465 return false; 465 return false;
466 } 466 }
467 467
468 template<> 468 template<>
469 inline bool ComputeFloatOffsetForFloatLayoutAdapter<FloatingObject::FloatLeft>:: updateOffsetIfNeeded(const FloatingObject& floatingObject) 469 inline bool ComputeFloatOffsetForFloatLayoutAdapter<FloatingObject::FloatLeft>:: updateOffsetIfNeeded(const FloatingObject& floatingObject)
470 { 470 {
471 LayoutUnit logicalRight = m_layoutObject->logicalRightForFloat(&floatingObje ct); 471 LayoutUnit logicalRight = m_layoutObject->logicalRightForFloat(floatingObjec t);
472 if (logicalRight > m_offset) { 472 if (logicalRight > m_offset) {
473 m_offset = logicalRight; 473 m_offset = logicalRight;
474 return true; 474 return true;
475 } 475 }
476 return false; 476 return false;
477 } 477 }
478 478
479 template<> 479 template<>
480 inline bool ComputeFloatOffsetForFloatLayoutAdapter<FloatingObject::FloatRight>: :updateOffsetIfNeeded(const FloatingObject& floatingObject) 480 inline bool ComputeFloatOffsetForFloatLayoutAdapter<FloatingObject::FloatRight>: :updateOffsetIfNeeded(const FloatingObject& floatingObject)
481 { 481 {
482 LayoutUnit logicalLeft = m_layoutObject->logicalLeftForFloat(&floatingObject ); 482 LayoutUnit logicalLeft = m_layoutObject->logicalLeftForFloat(floatingObject) ;
483 if (logicalLeft < m_offset) { 483 if (logicalLeft < m_offset) {
484 m_offset = logicalLeft; 484 m_offset = logicalLeft;
485 return true; 485 return true;
486 } 486 }
487 return false; 487 return false;
488 } 488 }
489 489
490 template <FloatingObject::Type FloatTypeValue> 490 template <FloatingObject::Type FloatTypeValue>
491 LayoutUnit ComputeFloatOffsetForFloatLayoutAdapter<FloatTypeValue>::heightRemain ing() const 491 LayoutUnit ComputeFloatOffsetForFloatLayoutAdapter<FloatTypeValue>::heightRemain ing() const
492 { 492 {
493 return this->m_outermostFloat ? this->m_layoutObject->logicalBottomForFloat( this->m_outermostFloat) - this->m_lineTop : LayoutUnit(1); 493 return this->m_outermostFloat ? this->m_layoutObject->logicalBottomForFloat( *this->m_outermostFloat) - this->m_lineTop : LayoutUnit(1);
494 } 494 }
495 495
496 template <FloatingObject::Type FloatTypeValue> 496 template <FloatingObject::Type FloatTypeValue>
497 inline void ComputeFloatOffsetAdapter<FloatTypeValue>::collectIfNeeded(const Int ervalType& interval) 497 inline void ComputeFloatOffsetAdapter<FloatTypeValue>::collectIfNeeded(const Int ervalType& interval)
498 { 498 {
499 const FloatingObject* floatingObject = interval.data(); 499 const FloatingObject& floatingObject = *(interval.data());
500 if (floatingObject->type() != FloatTypeValue || !rangesIntersect(interval.lo w(), interval.high(), m_lineTop, m_lineBottom)) 500 if (floatingObject.type() != FloatTypeValue || !rangesIntersect(interval.low (), interval.high(), m_lineTop, m_lineBottom))
501 return; 501 return;
502 502
503 // Make sure the float hasn't changed since it was added to the placed float s tree. 503 // Make sure the float hasn't changed since it was added to the placed float s tree.
504 ASSERT(floatingObject->isPlaced()); 504 ASSERT(floatingObject.isPlaced());
505 ASSERT(interval.low() == m_layoutObject->pixelSnappedLogicalTopForFloat(floa tingObject)); 505 ASSERT(interval.low() == m_layoutObject->pixelSnappedLogicalTopForFloat(floa tingObject));
506 ASSERT(interval.high() == m_layoutObject->pixelSnappedLogicalBottomForFloat( floatingObject)); 506 ASSERT(interval.high() == m_layoutObject->pixelSnappedLogicalBottomForFloat( floatingObject));
507 507
508 bool floatIsNewExtreme = updateOffsetIfNeeded(*floatingObject); 508 bool floatIsNewExtreme = updateOffsetIfNeeded(floatingObject);
509 if (floatIsNewExtreme) 509 if (floatIsNewExtreme)
510 m_outermostFloat = floatingObject; 510 m_outermostFloat = &floatingObject;
511 } 511 }
512 512
513 template<> 513 template<>
514 inline bool ComputeFloatOffsetForLineLayoutAdapter<FloatingObject::FloatLeft>::u pdateOffsetIfNeeded(const FloatingObject& floatingObject) 514 inline bool ComputeFloatOffsetForLineLayoutAdapter<FloatingObject::FloatLeft>::u pdateOffsetIfNeeded(const FloatingObject& floatingObject)
515 { 515 {
516 LayoutUnit logicalRight = m_layoutObject->logicalRightForFloat(&floatingObje ct); 516 LayoutUnit logicalRight = m_layoutObject->logicalRightForFloat(floatingObjec t);
517 if (ShapeOutsideInfo* shapeOutside = floatingObject.layoutObject()->shapeOut sideInfo()) { 517 if (ShapeOutsideInfo* shapeOutside = floatingObject.layoutObject()->shapeOut sideInfo()) {
518 ShapeOutsideDeltas shapeDeltas = shapeOutside->computeDeltasForContainin gBlockLine(*m_layoutObject, floatingObject, m_lineTop, m_lineBottom - m_lineTop) ; 518 ShapeOutsideDeltas shapeDeltas = shapeOutside->computeDeltasForContainin gBlockLine(*m_layoutObject, floatingObject, m_lineTop, m_lineBottom - m_lineTop) ;
519 if (!shapeDeltas.lineOverlapsShape()) 519 if (!shapeDeltas.lineOverlapsShape())
520 return false; 520 return false;
521 521
522 logicalRight += shapeDeltas.rightMarginBoxDelta(); 522 logicalRight += shapeDeltas.rightMarginBoxDelta();
523 } 523 }
524 if (logicalRight > m_offset) { 524 if (logicalRight > m_offset) {
525 m_offset = logicalRight; 525 m_offset = logicalRight;
526 return true; 526 return true;
527 } 527 }
528 528
529 return false; 529 return false;
530 } 530 }
531 531
532 template<> 532 template<>
533 inline bool ComputeFloatOffsetForLineLayoutAdapter<FloatingObject::FloatRight>:: updateOffsetIfNeeded(const FloatingObject& floatingObject) 533 inline bool ComputeFloatOffsetForLineLayoutAdapter<FloatingObject::FloatRight>:: updateOffsetIfNeeded(const FloatingObject& floatingObject)
534 { 534 {
535 LayoutUnit logicalLeft = m_layoutObject->logicalLeftForFloat(&floatingObject ); 535 LayoutUnit logicalLeft = m_layoutObject->logicalLeftForFloat(floatingObject) ;
536 if (ShapeOutsideInfo* shapeOutside = floatingObject.layoutObject()->shapeOut sideInfo()) { 536 if (ShapeOutsideInfo* shapeOutside = floatingObject.layoutObject()->shapeOut sideInfo()) {
537 ShapeOutsideDeltas shapeDeltas = shapeOutside->computeDeltasForContainin gBlockLine(*m_layoutObject, floatingObject, m_lineTop, m_lineBottom - m_lineTop) ; 537 ShapeOutsideDeltas shapeDeltas = shapeOutside->computeDeltasForContainin gBlockLine(*m_layoutObject, floatingObject, m_lineTop, m_lineBottom - m_lineTop) ;
538 if (!shapeDeltas.lineOverlapsShape()) 538 if (!shapeDeltas.lineOverlapsShape())
539 return false; 539 return false;
540 540
541 logicalLeft += shapeDeltas.leftMarginBoxDelta(); 541 logicalLeft += shapeDeltas.leftMarginBoxDelta();
542 } 542 }
543 if (logicalLeft < m_offset) { 543 if (logicalLeft < m_offset) {
544 m_offset = logicalLeft; 544 m_offset = logicalLeft;
545 return true; 545 return true;
(...skipping 10 matching lines...) Expand all
556 } 556 }
557 557
558 String ValueToString<FloatingObject*>::string(const FloatingObject* floatingObje ct) 558 String ValueToString<FloatingObject*>::string(const FloatingObject* floatingObje ct)
559 { 559 {
560 return String::format("%p (%dx%d %dx%d)", floatingObject, floatingObject->fr ameRect().pixelSnappedX(), floatingObject->frameRect().pixelSnappedY(), floating Object->frameRect().pixelSnappedMaxX(), floatingObject->frameRect().pixelSnapped MaxY()); 560 return String::format("%p (%dx%d %dx%d)", floatingObject, floatingObject->fr ameRect().pixelSnappedX(), floatingObject->frameRect().pixelSnappedY(), floating Object->frameRect().pixelSnappedMaxX(), floatingObject->frameRect().pixelSnapped MaxY());
561 } 561 }
562 #endif 562 #endif
563 563
564 564
565 } // namespace blink 565 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/layout/FloatingObjects.h ('k') | Source/core/layout/LayoutBlockFlow.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698