Commit 328e05af authored by kojii's avatar kojii Committed by Commit bot

Fix CSS outline property in flipped blocks Writing Mode (vertical-rl)

This patch fixes CSS outline property for inline elements in flipped
blocks Writing Mode (vertical-rl.)

LayoutObject::addOutlineRects() returns rects in the object's
coordinate, which does not take flipped blocks into account if the
object is not a LayoutBox.

This patch calls LayoutObject::localToContainerRects(), which is
extracted from LayoutBoxModelObject.

BUG=491454

Review URL: https://codereview.chromium.org/1458733002

Cr-Commit-Position: refs/heads/master@{#361297}
parent 4bd60bd3
......@@ -675,7 +675,6 @@ crbug.com/492664 imported/csswg-test/css-writing-modes-3/inline-block-alignment-
crbug.com/492664 imported/csswg-test/css-writing-modes-3/inline-block-alignment-007.xht [ Failure ]
crbug.com/492664 imported/csswg-test/css-writing-modes-3/inline-table-alignment-003.xht [ Failure ]
crbug.com/492664 imported/csswg-test/css-writing-modes-3/inline-table-alignment-005.xht [ Failure ]
crbug.com/491454 imported/csswg-test/css-writing-modes-3/outline-inline-vrl-006.html [ Failure ]
crbug.com/492664 imported/csswg-test/css-writing-modes-3/table-column-order-002.xht [ Failure ]
crbug.com/492664 imported/csswg-test/css-writing-modes-3/table-column-order-003.xht [ Failure ]
crbug.com/492664 imported/csswg-test/css-writing-modes-3/table-column-order-004.xht [ Failure ]
......
......@@ -451,14 +451,8 @@ void LayoutBoxModelObject::addOutlineRectsForDescendant(const LayoutObject& desc
if (descendant.hasLayer()) {
Vector<LayoutRect> layerOutlineRects;
descendant.addOutlineRects(layerOutlineRects, LayoutPoint(), includeBlockOverflows);
for (size_t i = 0; i < layerOutlineRects.size(); ++i) {
FloatQuad quadInBox = toLayoutBoxModelObject(descendant).localToContainerQuad(FloatQuad(FloatRect(layerOutlineRects[i])), this);
LayoutRect rect = LayoutRect(quadInBox.boundingBox());
if (!rect.isEmpty()) {
rect.moveBy(additionalOffset);
rects.append(rect);
}
}
descendant.localToContainerRects(layerOutlineRects, this, LayoutPoint(), additionalOffset);
rects.appendVector(layerOutlineRects);
return;
}
......
......@@ -2231,6 +2231,22 @@ FloatPoint LayoutObject::localToContainerPoint(const FloatPoint& localPoint, con
return transformState.lastPlanarPoint();
}
void LayoutObject::localToContainerRects(Vector<LayoutRect>& rects, const LayoutBoxModelObject* paintInvalidationContainer, const LayoutPoint& preOffset, const LayoutPoint& postOffset) const
{
for (size_t i = 0; i < rects.size(); ++i) {
LayoutRect& rect = rects[i];
rect.moveBy(preOffset);
FloatQuad containerQuad = localToContainerQuad(FloatQuad(FloatRect(rect)), paintInvalidationContainer);
LayoutRect containerRect = LayoutRect(containerQuad.boundingBox());
if (containerRect.isEmpty()) {
rects.remove(i--);
continue;
}
containerRect.moveBy(postOffset);
rects[i] = containerRect;
}
}
FloatPoint LayoutObject::localToInvalidationBackingPoint(const LayoutPoint& localPoint, PaintLayer** backingLayer)
{
const LayoutBoxModelObject& paintInvalidationContainer = containerForPaintInvalidationOnRootedTree();
......
......@@ -944,6 +944,7 @@ public:
// Convert a local quad into the coordinate system of container, taking transforms into account.
FloatQuad localToContainerQuad(const FloatQuad&, const LayoutBoxModelObject* paintInvalidationContainer, MapCoordinatesFlags = 0, bool* wasFixed = nullptr) const;
FloatPoint localToContainerPoint(const FloatPoint&, const LayoutBoxModelObject* paintInvalidationContainer, MapCoordinatesFlags = 0, bool* wasFixed = nullptr, const PaintInvalidationState* = nullptr) const;
void localToContainerRects(Vector<LayoutRect>&, const LayoutBoxModelObject* paintInvalidationContainer, const LayoutPoint& preOffset, const LayoutPoint& postOffset) const;
// Convert a local point into the coordinate system of backing coordinates. Also returns the backing layer if needed.
FloatPoint localToInvalidationBackingPoint(const LayoutPoint&, PaintLayer** backingLayer = nullptr);
......
......@@ -5,6 +5,7 @@
#include "config.h"
#include "core/paint/ObjectPainter.h"
#include "core/layout/LayoutBlock.h"
#include "core/layout/LayoutInline.h"
#include "core/layout/LayoutObject.h"
#include "core/layout/LayoutTheme.h"
......@@ -206,6 +207,14 @@ void ObjectPainter::paintOutline(const PaintInfo& paintInfo, const LayoutPoint&
if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(*paintInfo.context, m_layoutObject, paintInfo.phase, paintOffset))
return;
// The result rects are in coordinates of m_layoutObject's border box.
// Block flipping is not applied yet if !m_layoutObject.isBox().
if (!m_layoutObject.isBox() && m_layoutObject.styleRef().isFlippedBlocksWritingMode()) {
LayoutBlock* container = m_layoutObject.containingBlock();
if (container)
m_layoutObject.localToContainerRects(outlineRects, container, -paintOffset, paintOffset);
}
Vector<IntRect> pixelSnappedOutlineRects;
for (auto& r : outlineRects)
pixelSnappedOutlineRects.append(pixelSnappedIntRect(r));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment