| Index: Source/core/rendering/FloatingObjects.cpp
|
| diff --git a/Source/core/rendering/FloatingObjects.cpp b/Source/core/rendering/FloatingObjects.cpp
|
| index 152a3a329c6aa7429fd7bfb15c84b2729c7a6759..d1e294700a32bb590bbd7bb936f96e9ac7b752c8 100644
|
| --- a/Source/core/rendering/FloatingObjects.cpp
|
| +++ b/Source/core/rendering/FloatingObjects.cpp
|
| @@ -113,16 +113,16 @@ public:
|
| {
|
| }
|
|
|
| + virtual ~ComputeFloatOffsetAdapter() { }
|
| +
|
| int lowValue() const { return m_lineTop; }
|
| int highValue() const { return m_lineBottom; }
|
| void collectIfNeeded(const IntervalType&);
|
|
|
| LayoutUnit offset() const { return m_offset; }
|
| - LayoutUnit shapeOffset() const;
|
| - LayoutUnit heightRemaining() const;
|
|
|
| -private:
|
| - bool updateOffsetIfNeeded(const FloatingObject*);
|
| +protected:
|
| + virtual bool updateOffsetIfNeeded(const FloatingObject*) = 0;
|
|
|
| const RenderBlockFlow* m_renderer;
|
| int m_lineTop;
|
| @@ -131,6 +131,36 @@ private:
|
| const FloatingObject* m_outermostFloat;
|
| };
|
|
|
| +template <FloatingObject::Type FloatTypeValue>
|
| +class ComputeFloatOffsetForFloatLayoutAdapter : public ComputeFloatOffsetAdapter<FloatTypeValue> {
|
| +public:
|
| + ComputeFloatOffsetForFloatLayoutAdapter(const RenderBlockFlow* renderer, LayoutUnit lineTop, LayoutUnit lineBottom, LayoutUnit offset)
|
| + : ComputeFloatOffsetAdapter<FloatTypeValue>(renderer, lineTop, lineBottom, offset)
|
| + {
|
| + }
|
| +
|
| + virtual ~ComputeFloatOffsetForFloatLayoutAdapter() { }
|
| +
|
| + LayoutUnit heightRemaining() const;
|
| +
|
| +protected:
|
| + virtual bool updateOffsetIfNeeded(const FloatingObject*) OVERRIDE FINAL;
|
| +};
|
| +
|
| +template <FloatingObject::Type FloatTypeValue>
|
| +class ComputeFloatOffsetForLineLayoutAdapter : public ComputeFloatOffsetAdapter<FloatTypeValue> {
|
| +public:
|
| + ComputeFloatOffsetForLineLayoutAdapter(const RenderBlockFlow* renderer, LayoutUnit lineTop, LayoutUnit lineBottom, LayoutUnit offset)
|
| + : ComputeFloatOffsetAdapter<FloatTypeValue>(renderer, lineTop, lineBottom, offset)
|
| + {
|
| + }
|
| +
|
| + virtual ~ComputeFloatOffsetForLineLayoutAdapter() { }
|
| +
|
| +protected:
|
| + virtual bool updateOffsetIfNeeded(const FloatingObject*) OVERRIDE FINAL;
|
| +};
|
| +
|
|
|
| FloatingObjects::~FloatingObjects()
|
| {
|
| @@ -147,17 +177,6 @@ void FloatingObjects::clearLineBoxTreePointers()
|
| }
|
| }
|
|
|
| -template<>
|
| -inline bool ComputeFloatOffsetAdapter<FloatingObject::FloatLeft>::updateOffsetIfNeeded(const FloatingObject* floatingObject)
|
| -{
|
| - LayoutUnit logicalRight = m_renderer->logicalRightForFloat(floatingObject);
|
| - if (logicalRight > m_offset) {
|
| - m_offset = logicalRight;
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| FloatingObjects::FloatingObjects(const RenderBlockFlow* renderer, bool horizontalWritingMode)
|
| : m_placedFloatsTree(UninitializedTree)
|
| , m_leftObjectsCount(0)
|
| @@ -358,40 +377,10 @@ void FloatingObjects::computePlacedFloatsTree()
|
| }
|
| }
|
|
|
| -static inline ShapeOutsideInfo* shapeInfoForFloat(const FloatingObject* floatingObject, const RenderBlockFlow* containingBlock, LayoutUnit lineTop, LayoutUnit lineBottom)
|
| -{
|
| - if (floatingObject) {
|
| - if (ShapeOutsideInfo* shapeOutside = floatingObject->renderer()->shapeOutsideInfo()) {
|
| - shapeOutside->updateDeltasForContainingBlockLine(containingBlock, floatingObject, lineTop, lineBottom - lineTop);
|
| - return shapeOutside;
|
| - }
|
| - }
|
| -
|
| - return 0;
|
| -}
|
| -
|
| -template<>
|
| -inline LayoutUnit ComputeFloatOffsetAdapter<FloatingObject::FloatLeft>::shapeOffset() const
|
| -{
|
| - if (ShapeOutsideInfo* shapeOutside = shapeInfoForFloat(m_outermostFloat, m_renderer, m_lineTop, m_lineBottom))
|
| - return m_offset + shapeOutside->rightMarginBoxDelta();
|
| -
|
| - return m_offset;
|
| -}
|
| -
|
| -template<>
|
| -inline LayoutUnit ComputeFloatOffsetAdapter<FloatingObject::FloatRight>::shapeOffset() const
|
| -{
|
| - if (ShapeOutsideInfo* shapeOutside = shapeInfoForFloat(m_outermostFloat, m_renderer, m_lineTop, m_lineBottom))
|
| - return m_offset + shapeOutside->leftMarginBoxDelta();
|
| -
|
| - return m_offset;
|
| -}
|
| -
|
| LayoutUnit FloatingObjects::logicalLeftOffsetForPositioningFloat(LayoutUnit fixedOffset, LayoutUnit logicalTop, LayoutUnit *heightRemaining)
|
| {
|
| int logicalTopAsInt = roundToInt(logicalTop);
|
| - ComputeFloatOffsetAdapter<FloatingObject::FloatLeft> adapter(m_renderer, logicalTopAsInt, logicalTopAsInt, fixedOffset);
|
| + ComputeFloatOffsetForFloatLayoutAdapter<FloatingObject::FloatLeft> adapter(m_renderer, logicalTopAsInt, logicalTopAsInt, fixedOffset);
|
| placedFloatsTree().allOverlapsWithAdapter(adapter);
|
|
|
| if (heightRemaining)
|
| @@ -403,7 +392,7 @@ LayoutUnit FloatingObjects::logicalLeftOffsetForPositioningFloat(LayoutUnit fixe
|
| LayoutUnit FloatingObjects::logicalRightOffsetForPositioningFloat(LayoutUnit fixedOffset, LayoutUnit logicalTop, LayoutUnit *heightRemaining)
|
| {
|
| int logicalTopAsInt = roundToInt(logicalTop);
|
| - ComputeFloatOffsetAdapter<FloatingObject::FloatRight> adapter(m_renderer, logicalTopAsInt, logicalTopAsInt, fixedOffset);
|
| + ComputeFloatOffsetForFloatLayoutAdapter<FloatingObject::FloatRight> adapter(m_renderer, logicalTopAsInt, logicalTopAsInt, fixedOffset);
|
| placedFloatsTree().allOverlapsWithAdapter(adapter);
|
|
|
| if (heightRemaining)
|
| @@ -414,18 +403,18 @@ LayoutUnit FloatingObjects::logicalRightOffsetForPositioningFloat(LayoutUnit fix
|
|
|
| LayoutUnit FloatingObjects::logicalLeftOffset(LayoutUnit fixedOffset, LayoutUnit logicalTop, LayoutUnit logicalHeight)
|
| {
|
| - ComputeFloatOffsetAdapter<FloatingObject::FloatLeft> adapter(m_renderer, roundToInt(logicalTop), roundToInt(logicalTop + logicalHeight), fixedOffset);
|
| + ComputeFloatOffsetForLineLayoutAdapter<FloatingObject::FloatLeft> adapter(m_renderer, roundToInt(logicalTop), roundToInt(logicalTop + logicalHeight), fixedOffset);
|
| placedFloatsTree().allOverlapsWithAdapter(adapter);
|
|
|
| - return adapter.shapeOffset();
|
| + return adapter.offset();
|
| }
|
|
|
| LayoutUnit FloatingObjects::logicalRightOffset(LayoutUnit fixedOffset, LayoutUnit logicalTop, LayoutUnit logicalHeight)
|
| {
|
| - ComputeFloatOffsetAdapter<FloatingObject::FloatRight> adapter(m_renderer, roundToInt(logicalTop), roundToInt(logicalTop + logicalHeight), fixedOffset);
|
| + ComputeFloatOffsetForLineLayoutAdapter<FloatingObject::FloatRight> adapter(m_renderer, roundToInt(logicalTop), roundToInt(logicalTop + logicalHeight), fixedOffset);
|
| placedFloatsTree().allOverlapsWithAdapter(adapter);
|
|
|
| - return min(fixedOffset, adapter.shapeOffset());
|
| + return min(fixedOffset, adapter.offset());
|
| }
|
|
|
| FloatingObjects::FloatBottomCachedValue::FloatBottomCachedValue()
|
| @@ -455,7 +444,18 @@ inline static bool rangesIntersect(int floatTop, int floatBottom, int objectTop,
|
| }
|
|
|
| template<>
|
| -inline bool ComputeFloatOffsetAdapter<FloatingObject::FloatRight>::updateOffsetIfNeeded(const FloatingObject* floatingObject)
|
| +inline bool ComputeFloatOffsetForFloatLayoutAdapter<FloatingObject::FloatLeft>::updateOffsetIfNeeded(const FloatingObject* floatingObject)
|
| +{
|
| + LayoutUnit logicalRight = m_renderer->logicalRightForFloat(floatingObject);
|
| + if (logicalRight > m_offset) {
|
| + m_offset = logicalRight;
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +template<>
|
| +inline bool ComputeFloatOffsetForFloatLayoutAdapter<FloatingObject::FloatRight>::updateOffsetIfNeeded(const FloatingObject* floatingObject)
|
| {
|
| LayoutUnit logicalLeft = m_renderer->logicalLeftForFloat(floatingObject);
|
| if (logicalLeft < m_offset) {
|
| @@ -466,6 +466,12 @@ inline bool ComputeFloatOffsetAdapter<FloatingObject::FloatRight>::updateOffsetI
|
| }
|
|
|
| template <FloatingObject::Type FloatTypeValue>
|
| +LayoutUnit ComputeFloatOffsetForFloatLayoutAdapter<FloatTypeValue>::heightRemaining() const
|
| +{
|
| + return this->m_outermostFloat ? this->m_renderer->logicalBottomForFloat(this->m_outermostFloat) - this->m_lineTop : LayoutUnit(1);
|
| +}
|
| +
|
| +template <FloatingObject::Type FloatTypeValue>
|
| inline void ComputeFloatOffsetAdapter<FloatTypeValue>::collectIfNeeded(const IntervalType& interval)
|
| {
|
| const FloatingObject* floatingObject = interval.data();
|
| @@ -482,10 +488,52 @@ inline void ComputeFloatOffsetAdapter<FloatTypeValue>::collectIfNeeded(const Int
|
| m_outermostFloat = floatingObject;
|
| }
|
|
|
| -template <FloatingObject::Type FloatTypeValue>
|
| -LayoutUnit ComputeFloatOffsetAdapter<FloatTypeValue>::heightRemaining() const
|
| +static inline ShapeOutsideInfo* shapeInfoForFloat(const FloatingObject* floatingObject, const RenderBlockFlow* containingBlock, LayoutUnit lineTop, LayoutUnit lineBottom)
|
| {
|
| - return m_outermostFloat ? m_renderer->logicalBottomForFloat(m_outermostFloat) - m_lineTop : LayoutUnit(1);
|
| + if (floatingObject) {
|
| + if (ShapeOutsideInfo* shapeOutside = floatingObject->renderer()->shapeOutsideInfo()) {
|
| + shapeOutside->updateDeltasForContainingBlockLine(containingBlock, floatingObject, lineTop, lineBottom - lineTop);
|
| + return shapeOutside;
|
| + }
|
| + }
|
| +
|
| + return nullptr;
|
| +}
|
| +
|
| +template<>
|
| +inline bool ComputeFloatOffsetForLineLayoutAdapter<FloatingObject::FloatLeft>::updateOffsetIfNeeded(const FloatingObject* floatingObject)
|
| +{
|
| + LayoutUnit logicalRight = m_renderer->logicalRightForFloat(floatingObject);
|
| + if (ShapeOutsideInfo* shapeOutside = shapeInfoForFloat(floatingObject, m_renderer, m_lineTop, m_lineBottom)) {
|
| + if (!shapeOutside->lineOverlapsShape())
|
| + return false;
|
| +
|
| + logicalRight += shapeOutside->rightMarginBoxDelta();
|
| + }
|
| + if (logicalRight > m_offset) {
|
| + m_offset = logicalRight;
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| +}
|
| +
|
| +template<>
|
| +inline bool ComputeFloatOffsetForLineLayoutAdapter<FloatingObject::FloatRight>::updateOffsetIfNeeded(const FloatingObject* floatingObject)
|
| +{
|
| + LayoutUnit logicalLeft = m_renderer->logicalLeftForFloat(floatingObject);
|
| + if (ShapeOutsideInfo* shapeOutside = shapeInfoForFloat(floatingObject, m_renderer, m_lineTop, m_lineBottom)) {
|
| + if (!shapeOutside->lineOverlapsShape())
|
| + return false;
|
| +
|
| + logicalLeft += shapeOutside->leftMarginBoxDelta();
|
| + }
|
| + if (logicalLeft < m_offset) {
|
| + m_offset = logicalLeft;
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| }
|
|
|
| #ifndef NDEBUG
|
|
|