| OLD | NEW |
| 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 11 matching lines...) Expand all Loading... |
| 22 */ | 22 */ |
| 23 | 23 |
| 24 #include "core/layout/FloatingObjects.h" | 24 #include "core/layout/FloatingObjects.h" |
| 25 | 25 |
| 26 #include "core/layout/LayoutBlockFlow.h" | 26 #include "core/layout/LayoutBlockFlow.h" |
| 27 #include "core/layout/LayoutBox.h" | 27 #include "core/layout/LayoutBox.h" |
| 28 #include "core/layout/LayoutView.h" | 28 #include "core/layout/LayoutView.h" |
| 29 #include "core/layout/shapes/ShapeOutsideInfo.h" | 29 #include "core/layout/shapes/ShapeOutsideInfo.h" |
| 30 #include "core/paint/PaintLayer.h" | 30 #include "core/paint/PaintLayer.h" |
| 31 #include "platform/RuntimeEnabledFeatures.h" | 31 #include "platform/RuntimeEnabledFeatures.h" |
| 32 | 32 #include "wtf/PtrUtil.h" |
| 33 #include <algorithm> | 33 #include <algorithm> |
| 34 #include <memory> |
| 34 | 35 |
| 35 using namespace WTF; | 36 using namespace WTF; |
| 36 | 37 |
| 37 namespace blink { | 38 namespace blink { |
| 38 | 39 |
| 39 struct SameSizeAsFloatingObject { | 40 struct SameSizeAsFloatingObject { |
| 40 void* pointers[2]; | 41 void* pointers[2]; |
| 41 LayoutRect rect; | 42 LayoutRect rect; |
| 42 uint32_t bitfields : 8; | 43 uint32_t bitfields : 8; |
| 43 }; | 44 }; |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 bool FloatingObject::shouldPaintForCompositedLayoutPart() | 82 bool FloatingObject::shouldPaintForCompositedLayoutPart() |
| 82 { | 83 { |
| 83 // HACK: only non-self-painting floats should paint. However, due to the fun
damental compositing bug, some LayoutPart objects | 84 // HACK: only non-self-painting floats should paint. However, due to the fun
damental compositing bug, some LayoutPart objects |
| 84 // may become self-painting due to being composited. This leads to a chicken
-egg issue because layout may not depend on compositing. | 85 // may become self-painting due to being composited. This leads to a chicken
-egg issue because layout may not depend on compositing. |
| 85 // If this is the case, set shouldPaint() to true even if the layer is techn
ically self-painting. This lets the float which contains | 86 // If this is the case, set shouldPaint() to true even if the layer is techn
ically self-painting. This lets the float which contains |
| 86 // a LayoutPart start painting as soon as it stops being composited, without
having to re-layout the float. | 87 // a LayoutPart start painting as soon as it stops being composited, without
having to re-layout the float. |
| 87 // This hack can be removed after SPv2. | 88 // This hack can be removed after SPv2. |
| 88 return m_layoutObject->layer() && m_layoutObject->layer()->isSelfPaintingOnl
yBecauseIsCompositedPart() && !RuntimeEnabledFeatures::slimmingPaintV2Enabled(); | 89 return m_layoutObject->layer() && m_layoutObject->layer()->isSelfPaintingOnl
yBecauseIsCompositedPart() && !RuntimeEnabledFeatures::slimmingPaintV2Enabled(); |
| 89 } | 90 } |
| 90 | 91 |
| 91 PassOwnPtr<FloatingObject> FloatingObject::create(LayoutBox* layoutObject) | 92 std::unique_ptr<FloatingObject> FloatingObject::create(LayoutBox* layoutObject) |
| 92 { | 93 { |
| 93 OwnPtr<FloatingObject> newObj = adoptPtr(new FloatingObject(layoutObject)); | 94 std::unique_ptr<FloatingObject> newObj = wrapUnique(new FloatingObject(layou
tObject)); |
| 94 | 95 |
| 95 // If a layer exists, the float will paint itself. Otherwise someone else wi
ll. | 96 // If a layer exists, the float will paint itself. Otherwise someone else wi
ll. |
| 96 newObj->setShouldPaint(!layoutObject->hasSelfPaintingLayer() || newObj->shou
ldPaintForCompositedLayoutPart()); | 97 newObj->setShouldPaint(!layoutObject->hasSelfPaintingLayer() || newObj->shou
ldPaintForCompositedLayoutPart()); |
| 97 | 98 |
| 98 newObj->setIsDescendant(true); | 99 newObj->setIsDescendant(true); |
| 99 | 100 |
| 100 return newObj; | 101 return newObj; |
| 101 } | 102 } |
| 102 | 103 |
| 103 bool FloatingObject::shouldPaint() const | 104 bool FloatingObject::shouldPaint() const |
| 104 { | 105 { |
| 105 return m_shouldPaint && !m_layoutObject->hasSelfPaintingLayer(); | 106 return m_shouldPaint && !m_layoutObject->hasSelfPaintingLayer(); |
| 106 } | 107 } |
| 107 | 108 |
| 108 PassOwnPtr<FloatingObject> FloatingObject::copyToNewContainer(LayoutSize offset,
bool shouldPaint, bool isDescendant) const | 109 std::unique_ptr<FloatingObject> FloatingObject::copyToNewContainer(LayoutSize of
fset, bool shouldPaint, bool isDescendant) const |
| 109 { | 110 { |
| 110 return adoptPtr(new FloatingObject(layoutObject(), getType(), LayoutRect(fra
meRect().location() - offset, frameRect().size()), shouldPaint, isDescendant, is
LowestNonOverhangingFloatInChild())); | 111 return wrapUnique(new FloatingObject(layoutObject(), getType(), LayoutRect(f
rameRect().location() - offset, frameRect().size()), shouldPaint, isDescendant,
isLowestNonOverhangingFloatInChild())); |
| 111 } | 112 } |
| 112 | 113 |
| 113 PassOwnPtr<FloatingObject> FloatingObject::unsafeClone() const | 114 std::unique_ptr<FloatingObject> FloatingObject::unsafeClone() const |
| 114 { | 115 { |
| 115 OwnPtr<FloatingObject> cloneObject = adoptPtr(new FloatingObject(layoutObjec
t(), getType(), m_frameRect, m_shouldPaint, m_isDescendant, false)); | 116 std::unique_ptr<FloatingObject> cloneObject = wrapUnique(new FloatingObject(
layoutObject(), getType(), m_frameRect, m_shouldPaint, m_isDescendant, false)); |
| 116 cloneObject->m_isPlaced = m_isPlaced; | 117 cloneObject->m_isPlaced = m_isPlaced; |
| 117 return cloneObject; | 118 return cloneObject; |
| 118 } | 119 } |
| 119 | 120 |
| 120 template <FloatingObject::Type FloatTypeValue> | 121 template <FloatingObject::Type FloatTypeValue> |
| 121 class ComputeFloatOffsetAdapter { | 122 class ComputeFloatOffsetAdapter { |
| 122 public: | 123 public: |
| 123 typedef FloatingObjectInterval IntervalType; | 124 typedef FloatingObjectInterval IntervalType; |
| 124 | 125 |
| 125 ComputeFloatOffsetAdapter(const LayoutBlockFlow* layoutObject, LayoutUnit li
neTop, LayoutUnit lineBottom, LayoutUnit offset) | 126 ComputeFloatOffsetAdapter(const LayoutBlockFlow* layoutObject, LayoutUnit li
neTop, LayoutUnit lineBottom, LayoutUnit offset) |
| (...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 399 | 400 |
| 400 void FloatingObjects::markLowestFloatLogicalBottomCacheAsDirty() | 401 void FloatingObjects::markLowestFloatLogicalBottomCacheAsDirty() |
| 401 { | 402 { |
| 402 for (size_t i = 0; i < sizeof(m_lowestFloatBottomCache) / sizeof(FloatBottom
CachedValue); ++i) | 403 for (size_t i = 0; i < sizeof(m_lowestFloatBottomCache) / sizeof(FloatBottom
CachedValue); ++i) |
| 403 m_lowestFloatBottomCache[i].dirty = true; | 404 m_lowestFloatBottomCache[i].dirty = true; |
| 404 } | 405 } |
| 405 | 406 |
| 406 void FloatingObjects::moveAllToFloatInfoMap(LayoutBoxToFloatInfoMap& map) | 407 void FloatingObjects::moveAllToFloatInfoMap(LayoutBoxToFloatInfoMap& map) |
| 407 { | 408 { |
| 408 while (!m_set.isEmpty()) { | 409 while (!m_set.isEmpty()) { |
| 409 OwnPtr<FloatingObject> floatingObject = m_set.takeFirst(); | 410 std::unique_ptr<FloatingObject> floatingObject = m_set.takeFirst(); |
| 410 LayoutBox* layoutObject = floatingObject->layoutObject(); | 411 LayoutBox* layoutObject = floatingObject->layoutObject(); |
| 411 map.add(layoutObject, std::move(floatingObject)); | 412 map.add(layoutObject, std::move(floatingObject)); |
| 412 } | 413 } |
| 413 clear(); | 414 clear(); |
| 414 } | 415 } |
| 415 | 416 |
| 416 inline void FloatingObjects::increaseObjectsCount(FloatingObject::Type type) | 417 inline void FloatingObjects::increaseObjectsCount(FloatingObject::Type type) |
| 417 { | 418 { |
| 418 if (type == FloatingObject::FloatLeft) | 419 if (type == FloatingObject::FloatLeft) |
| 419 m_leftObjectsCount++; | 420 m_leftObjectsCount++; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 459 ASSERT_UNUSED(removed, removed); | 460 ASSERT_UNUSED(removed, removed); |
| 460 } | 461 } |
| 461 | 462 |
| 462 floatingObject.setIsPlaced(false); | 463 floatingObject.setIsPlaced(false); |
| 463 #if ENABLE(ASSERT) | 464 #if ENABLE(ASSERT) |
| 464 floatingObject.setIsInPlacedTree(false); | 465 floatingObject.setIsInPlacedTree(false); |
| 465 #endif | 466 #endif |
| 466 markLowestFloatLogicalBottomCacheAsDirty(); | 467 markLowestFloatLogicalBottomCacheAsDirty(); |
| 467 } | 468 } |
| 468 | 469 |
| 469 FloatingObject* FloatingObjects::add(PassOwnPtr<FloatingObject> floatingObject) | 470 FloatingObject* FloatingObjects::add(std::unique_ptr<FloatingObject> floatingObj
ect) |
| 470 { | 471 { |
| 471 FloatingObject* newObject = floatingObject.leakPtr(); | 472 FloatingObject* newObject = floatingObject.release(); |
| 472 increaseObjectsCount(newObject->getType()); | 473 increaseObjectsCount(newObject->getType()); |
| 473 m_set.add(adoptPtr(newObject)); | 474 m_set.add(wrapUnique(newObject)); |
| 474 if (newObject->isPlaced()) | 475 if (newObject->isPlaced()) |
| 475 addPlacedObject(*newObject); | 476 addPlacedObject(*newObject); |
| 476 markLowestFloatLogicalBottomCacheAsDirty(); | 477 markLowestFloatLogicalBottomCacheAsDirty(); |
| 477 return newObject; | 478 return newObject; |
| 478 } | 479 } |
| 479 | 480 |
| 480 void FloatingObjects::remove(FloatingObject* toBeRemoved) | 481 void FloatingObjects::remove(FloatingObject* toBeRemoved) |
| 481 { | 482 { |
| 482 decreaseObjectsCount(toBeRemoved->getType()); | 483 decreaseObjectsCount(toBeRemoved->getType()); |
| 483 OwnPtr<FloatingObject> floatingObject = m_set.take(toBeRemoved); | 484 std::unique_ptr<FloatingObject> floatingObject = m_set.take(toBeRemoved); |
| 484 ASSERT(floatingObject->isPlaced() || !floatingObject->isInPlacedTree()); | 485 ASSERT(floatingObject->isPlaced() || !floatingObject->isInPlacedTree()); |
| 485 if (floatingObject->isPlaced()) | 486 if (floatingObject->isPlaced()) |
| 486 removePlacedObject(*floatingObject); | 487 removePlacedObject(*floatingObject); |
| 487 markLowestFloatLogicalBottomCacheAsDirty(); | 488 markLowestFloatLogicalBottomCacheAsDirty(); |
| 488 ASSERT(!floatingObject->originatingLine()); | 489 ASSERT(!floatingObject->originatingLine()); |
| 489 } | 490 } |
| 490 | 491 |
| 491 void FloatingObjects::computePlacedFloatsTree() | 492 void FloatingObjects::computePlacedFloatsTree() |
| 492 { | 493 { |
| 493 ASSERT(!m_placedFloatsTree.isInitialized()); | 494 ASSERT(!m_placedFloatsTree.isInitialized()); |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 638 } | 639 } |
| 639 | 640 |
| 640 String ValueToString<FloatingObject*>::toString(const FloatingObject* floatingOb
ject) | 641 String ValueToString<FloatingObject*>::toString(const FloatingObject* floatingOb
ject) |
| 641 { | 642 { |
| 642 return String::format("%p (%gx%g %gx%g)", floatingObject, floatingObject->fr
ameRect().x().toFloat(), floatingObject->frameRect().y().toFloat(), floatingObje
ct->frameRect().maxX().toFloat(), floatingObject->frameRect().maxY().toFloat()); | 643 return String::format("%p (%gx%g %gx%g)", floatingObject, floatingObject->fr
ameRect().x().toFloat(), floatingObject->frameRect().y().toFloat(), floatingObje
ct->frameRect().maxX().toFloat(), floatingObject->frameRect().maxY().toFloat()); |
| 643 } | 644 } |
| 644 #endif | 645 #endif |
| 645 | 646 |
| 646 | 647 |
| 647 } // namespace blink | 648 } // namespace blink |
| OLD | NEW |