17242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
27242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// Use of this source code is governed by a BSD-style license that can be
37242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// found in the LICENSE file.
47242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
57242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "config.h"
67242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/paint/BlockFlowPainter.h"
77242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
87242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/rendering/FloatingObjects.h"
97242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/rendering/PaintInfo.h"
107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/rendering/RenderBlockFlow.h"
117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccinamespace blink {
137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid BlockFlowPainter::paintFloats(PaintInfo& paintInfo, const LayoutPoint& paintOffset, bool preservePhase)
157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!m_renderBlockFlow.floatingObjects())
177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    const FloatingObjectSet& floatingObjectSet = m_renderBlockFlow.floatingObjects()->set();
207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    FloatingObjectSetIterator end = floatingObjectSet.end();
217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++it) {
227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        FloatingObject* floatingObject = it->get();
237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        // Only paint the object if our m_shouldPaint flag is set.
247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (floatingObject->shouldPaint() && !floatingObject->renderer()->hasSelfPaintingLayer()) {
257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            PaintInfo currentPaintInfo(paintInfo);
267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            currentPaintInfo.phase = preservePhase ? paintInfo.phase : PaintPhaseBlockBackground;
277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            // FIXME: LayoutPoint version of xPositionForFloatIncludingMargin would make this much cleaner.
287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            LayoutPoint childPoint = m_renderBlockFlow.flipFloatForWritingModeForChild(
297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                floatingObject, LayoutPoint(paintOffset.x()
307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                + m_renderBlockFlow.xPositionForFloatIncludingMargin(floatingObject) - floatingObject->renderer()->x(), paintOffset.y()
317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                + m_renderBlockFlow.yPositionForFloatIncludingMargin(floatingObject) - floatingObject->renderer()->y()));
327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            floatingObject->renderer()->paint(currentPaintInfo, childPoint);
337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            if (!preservePhase) {
347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                currentPaintInfo.phase = PaintPhaseChildBlockBackgrounds;
357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                floatingObject->renderer()->paint(currentPaintInfo, childPoint);
367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                currentPaintInfo.phase = PaintPhaseFloat;
377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                floatingObject->renderer()->paint(currentPaintInfo, childPoint);
387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                currentPaintInfo.phase = PaintPhaseForeground;
397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                floatingObject->renderer()->paint(currentPaintInfo, childPoint);
407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                currentPaintInfo.phase = PaintPhaseOutline;
417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                floatingObject->renderer()->paint(currentPaintInfo, childPoint);
427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            }
437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} // namespace blink
48