Log Message
Source/_javascript_Core: https://bugs.webkit.org/show_bug.cgi?id=69372 [CSS3 Regions] Make sure overflow:visible lets content spill out of regions. Add support for reverse iteration to ListHashSet to support being able to walk them backwards easily.
Reviewed by Anders Carlsson. * wtf/ListHashSet.h: (WTF::ListHashSetReverseIterator::ListHashSetReverseIterator): (WTF::ListHashSetReverseIterator::get): (WTF::ListHashSetReverseIterator::operator*): (WTF::ListHashSetReverseIterator::operator->): (WTF::ListHashSetReverseIterator::operator++): (WTF::ListHashSetReverseIterator::operator--): (WTF::ListHashSetReverseIterator::operator==): (WTF::ListHashSetReverseIterator::operator!=): (WTF::ListHashSetReverseIterator::operator const_reverse_iterator): (WTF::ListHashSetReverseIterator::node): (WTF::ListHashSetConstReverseIterator::ListHashSetConstReverseIterator): (WTF::ListHashSetConstReverseIterator::get): (WTF::ListHashSetConstReverseIterator::operator*): (WTF::ListHashSetConstReverseIterator::operator->): (WTF::ListHashSetConstReverseIterator::operator++): (WTF::ListHashSetConstReverseIterator::operator--): (WTF::ListHashSetConstReverseIterator::operator==): (WTF::ListHashSetConstReverseIterator::operator!=): (WTF::ListHashSetConstReverseIterator::node): (WTF::::rbegin): (WTF::::rend): (WTF::::makeReverseIterator): (WTF::::makeConstReverseIterator): (WTF::::makeConstIterator): Source/WebCore: https://bugs.webkit.org/show_bug.cgi?id=69372 [CSS3 Regions] Make sure overflow:visible lets content spill out of regions. Reviewed by Anders Carlsson. No new tests, since plenty of results changed. * rendering/RenderFlowThread.cpp: (WebCore::RenderFlowThread::paintIntoRegion): (WebCore::RenderFlowThread::hitTestRegion): (WebCore::RenderFlowThread::repaintRectangleInRegions): (WebCore::RenderFlowThread::firstRegion): (WebCore::RenderFlowThread::lastRegion): * rendering/RenderFlowThread.h: * rendering/RenderRegion.cpp: (WebCore::RenderRegion::regionOverflowRect): (WebCore::RenderRegion::isFirstRegion): (WebCore::RenderRegion::isLastRegion): (WebCore::RenderRegion::layout): * rendering/RenderRegion.h: (WebCore::RenderRegion::setRegionRect): (WebCore::RenderRegion::regionRect): LayoutTests: https://bugs.webkit.org/show_bug.cgi?id=69372 [CSS3 Regions] Make sure overflow:visible lets content spill out of regions. Reviewed by Anders Carlsson. * platform/mac/fast/regions/content-flowed-into-regions-dynamically-removed-expected.png: * platform/mac/fast/regions/percentage-margins-mixed-ltr-dominant-regions-expected.png: * platform/mac/fast/regions/percentage-margins-mixed-rtl-dominant-regions-expected.png: * platform/mac/fast/regions/percentage-margins-rtl-variable-width-regions-expected.png: * platform/mac/fast/regions/percentage-margins-variable-width-regions-expected.png: * platform/mac/fast/regions/webkit-flow-double-pagination-float-push-expected.png: * platform/mac/fast/regions/webkit-flow-float-unable-to-push-expected.png: * platform/mac/fast/regions/webkit-flow-floats-inside-regions-bounds-expected.png: * platform/mac/fast/regions/webkit-flow-inlines-dynamic-expected.png:
Modified Paths
- trunk/LayoutTests/ChangeLog
- trunk/LayoutTests/platform/mac/fast/regions/content-flowed-into-regions-dynamically-removed-expected.png
- trunk/LayoutTests/platform/mac/fast/regions/percentage-margins-mixed-ltr-dominant-regions-expected.png
- trunk/LayoutTests/platform/mac/fast/regions/percentage-margins-mixed-rtl-dominant-regions-expected.png
- trunk/LayoutTests/platform/mac/fast/regions/percentage-margins-rtl-variable-width-regions-expected.png
- trunk/LayoutTests/platform/mac/fast/regions/percentage-margins-variable-width-regions-expected.png
- trunk/LayoutTests/platform/mac/fast/regions/webkit-flow-double-pagination-float-push-expected.png
- trunk/LayoutTests/platform/mac/fast/regions/webkit-flow-float-unable-to-push-expected.png
- trunk/LayoutTests/platform/mac/fast/regions/webkit-flow-floats-inside-regions-bounds-expected.png
- trunk/LayoutTests/platform/mac/fast/regions/webkit-flow-inlines-dynamic-expected.png
- trunk/Source/_javascript_Core/ChangeLog
- trunk/Source/_javascript_Core/wtf/ListHashSet.h
- trunk/Source/WebCore/ChangeLog
- trunk/Source/WebCore/rendering/RenderFlowThread.cpp
- trunk/Source/WebCore/rendering/RenderFlowThread.h
- trunk/Source/WebCore/rendering/RenderRegion.cpp
- trunk/Source/WebCore/rendering/RenderRegion.h
Diff
Modified: trunk/LayoutTests/ChangeLog (96642 => 96643)
--- trunk/LayoutTests/ChangeLog 2011-10-04 21:10:48 UTC (rev 96642)
+++ trunk/LayoutTests/ChangeLog 2011-10-04 21:16:56 UTC (rev 96643)
@@ -1,3 +1,21 @@
+2011-10-04 David Hyatt <hy...@apple.com>
+
+ https://bugs.webkit.org/show_bug.cgi?id=69372
+
+ [CSS3 Regions] Make sure overflow:visible lets content spill out of regions.
+
+ Reviewed by Anders Carlsson.
+
+ * platform/mac/fast/regions/content-flowed-into-regions-dynamically-removed-expected.png:
+ * platform/mac/fast/regions/percentage-margins-mixed-ltr-dominant-regions-expected.png:
+ * platform/mac/fast/regions/percentage-margins-mixed-rtl-dominant-regions-expected.png:
+ * platform/mac/fast/regions/percentage-margins-rtl-variable-width-regions-expected.png:
+ * platform/mac/fast/regions/percentage-margins-variable-width-regions-expected.png:
+ * platform/mac/fast/regions/webkit-flow-double-pagination-float-push-expected.png:
+ * platform/mac/fast/regions/webkit-flow-float-unable-to-push-expected.png:
+ * platform/mac/fast/regions/webkit-flow-floats-inside-regions-bounds-expected.png:
+ * platform/mac/fast/regions/webkit-flow-inlines-dynamic-expected.png:
+
2011-10-04 Csaba Osztrogonác <o...@webkit.org>
[Qt] Unreviewed gardening. Update Qt specific expected results.
Modified: trunk/LayoutTests/platform/mac/fast/regions/content-flowed-into-regions-dynamically-removed-expected.png
(Binary files differ)
Modified: trunk/LayoutTests/platform/mac/fast/regions/percentage-margins-mixed-ltr-dominant-regions-expected.png
(Binary files differ)
Modified: trunk/LayoutTests/platform/mac/fast/regions/percentage-margins-mixed-rtl-dominant-regions-expected.png
(Binary files differ)
Modified: trunk/LayoutTests/platform/mac/fast/regions/percentage-margins-rtl-variable-width-regions-expected.png
(Binary files differ)
Modified: trunk/LayoutTests/platform/mac/fast/regions/percentage-margins-variable-width-regions-expected.png
(Binary files differ)
Modified: trunk/LayoutTests/platform/mac/fast/regions/webkit-flow-double-pagination-float-push-expected.png
(Binary files differ)
Modified: trunk/LayoutTests/platform/mac/fast/regions/webkit-flow-float-unable-to-push-expected.png
(Binary files differ)
Modified: trunk/LayoutTests/platform/mac/fast/regions/webkit-flow-floats-inside-regions-bounds-expected.png
(Binary files differ)
Modified: trunk/LayoutTests/platform/mac/fast/regions/webkit-flow-inlines-dynamic-expected.png
(Binary files differ)
Modified: trunk/Source/_javascript_Core/ChangeLog (96642 => 96643)
--- trunk/Source/_javascript_Core/ChangeLog 2011-10-04 21:10:48 UTC (rev 96642)
+++ trunk/Source/_javascript_Core/ChangeLog 2011-10-04 21:16:56 UTC (rev 96643)
@@ -1,3 +1,40 @@
+2011-10-04 David Hyatt <hy...@apple.com>
+
+ https://bugs.webkit.org/show_bug.cgi?id=69372
+
+ [CSS3 Regions] Make sure overflow:visible lets content spill out of regions.
+
+ Add support for reverse iteration to ListHashSet to support being able to walk them
+ backwards easily.
+
+ Reviewed by Anders Carlsson.
+
+ * wtf/ListHashSet.h:
+ (WTF::ListHashSetReverseIterator::ListHashSetReverseIterator):
+ (WTF::ListHashSetReverseIterator::get):
+ (WTF::ListHashSetReverseIterator::operator*):
+ (WTF::ListHashSetReverseIterator::operator->):
+ (WTF::ListHashSetReverseIterator::operator++):
+ (WTF::ListHashSetReverseIterator::operator--):
+ (WTF::ListHashSetReverseIterator::operator==):
+ (WTF::ListHashSetReverseIterator::operator!=):
+ (WTF::ListHashSetReverseIterator::operator const_reverse_iterator):
+ (WTF::ListHashSetReverseIterator::node):
+ (WTF::ListHashSetConstReverseIterator::ListHashSetConstReverseIterator):
+ (WTF::ListHashSetConstReverseIterator::get):
+ (WTF::ListHashSetConstReverseIterator::operator*):
+ (WTF::ListHashSetConstReverseIterator::operator->):
+ (WTF::ListHashSetConstReverseIterator::operator++):
+ (WTF::ListHashSetConstReverseIterator::operator--):
+ (WTF::ListHashSetConstReverseIterator::operator==):
+ (WTF::ListHashSetConstReverseIterator::operator!=):
+ (WTF::ListHashSetConstReverseIterator::node):
+ (WTF::::rbegin):
+ (WTF::::rend):
+ (WTF::::makeReverseIterator):
+ (WTF::::makeConstReverseIterator):
+ (WTF::::makeConstIterator):
+
2011-10-04 Gavin Peters <gav...@chromium.org>
fix gtk breakage caused by changeset 96595
Modified: trunk/Source/_javascript_Core/wtf/ListHashSet.h (96642 => 96643)
--- trunk/Source/_javascript_Core/wtf/ListHashSet.h 2011-10-04 21:10:48 UTC (rev 96642)
+++ trunk/Source/_javascript_Core/wtf/ListHashSet.h 2011-10-04 21:16:56 UTC (rev 96643)
@@ -49,6 +49,8 @@
template<typename ValueArg, size_t inlineCapacity, typename HashArg> class ListHashSetIterator;
template<typename ValueArg, size_t inlineCapacity, typename HashArg> class ListHashSetConstIterator;
+ template<typename ValueArg, size_t inlineCapacity, typename HashArg> class ListHashSetReverseIterator;
+ template<typename ValueArg, size_t inlineCapacity, typename HashArg> class ListHashSetConstReverseIterator;
template<typename ValueArg, size_t inlineCapacity> struct ListHashSetNode;
template<typename ValueArg, size_t inlineCapacity> struct ListHashSetNodeAllocator;
@@ -71,11 +73,15 @@
public:
typedef ValueArg ValueType;
+
typedef ListHashSetIterator<ValueType, inlineCapacity, HashArg> iterator;
typedef ListHashSetConstIterator<ValueType, inlineCapacity, HashArg> const_iterator;
-
friend class ListHashSetConstIterator<ValueType, inlineCapacity, HashArg>;
+ typedef ListHashSetReverseIterator<ValueType, inlineCapacity, HashArg> reverse_iterator;
+ typedef ListHashSetConstReverseIterator<ValueType, inlineCapacity, HashArg> const_reverse_iterator;
+ friend class ListHashSetConstReverseIterator<ValueType, inlineCapacity, HashArg>;
+
ListHashSet();
ListHashSet(const ListHashSet&);
ListHashSet& operator=(const ListHashSet&);
@@ -92,6 +98,11 @@
const_iterator begin() const;
const_iterator end() const;
+ reverse_iterator rbegin();
+ reverse_iterator rend();
+ const_reverse_iterator rbegin() const;
+ const_reverse_iterator rend() const;
+
ValueType& first();
const ValueType& first() const;
@@ -126,8 +137,11 @@
void appendNode(Node*);
void insertNodeBefore(Node* beforeNode, Node* newNode);
void deleteAllNodes();
+
iterator makeIterator(Node*);
const_iterator makeConstIterator(Node*) const;
+ reverse_iterator makeReverseIterator(Node*);
+ const_reverse_iterator makeConstReverseIterator(Node*) const;
friend void deleteAllValues<>(const ListHashSet&);
@@ -358,7 +372,118 @@
Node* m_position;
};
+ template<typename ValueArg, size_t inlineCapacity, typename HashArg> class ListHashSetReverseIterator {
+ private:
+ typedef ListHashSet<ValueArg, inlineCapacity, HashArg> ListHashSetType;
+ typedef ListHashSetReverseIterator<ValueArg, inlineCapacity, HashArg> reverse_iterator;
+ typedef ListHashSetConstIterator<ValueArg, inlineCapacity, HashArg> const_reverse_iterator;
+ typedef ListHashSetNode<ValueArg, inlineCapacity> Node;
+ typedef ValueArg ValueType;
+ typedef ValueType& ReferenceType;
+ typedef ValueType* PointerType;
+ friend class ListHashSet<ValueArg, inlineCapacity, HashArg>;
+
+ ListHashSetReverseIterator(const ListHashSetType* set, Node* position) : m_iterator(set, position) { }
+
+ public:
+ ListHashSetReverseIterator() { }
+
+ // default copy, assignment and destructor are OK
+
+ PointerType get() const { return const_cast<PointerType>(m_iterator.get()); }
+ ReferenceType operator*() const { return *get(); }
+ PointerType operator->() const { return get(); }
+
+ reverse_iterator& operator++() { ++m_iterator; return *this; }
+
+ // postfix ++ intentionally omitted
+
+ reverse_iterator& operator--() { --m_iterator; return *this; }
+
+ // postfix -- intentionally omitted
+
+ // Comparison.
+ bool operator==(const reverse_iterator& other) const { return m_iterator == other.m_iterator; }
+ bool operator!=(const reverse_iterator& other) const { return m_iterator != other.m_iterator; }
+
+ operator const_reverse_iterator() const { return m_iterator; }
+
+ private:
+ Node* node() { return m_iterator.node(); }
+
+ const_reverse_iterator m_iterator;
+ };
+
+ template<typename ValueArg, size_t inlineCapacity, typename HashArg> class ListHashSetConstReverseIterator {
+ private:
+ typedef ListHashSet<ValueArg, inlineCapacity, HashArg> ListHashSetType;
+ typedef ListHashSetReverseIterator<ValueArg, inlineCapacity, HashArg> reverse_iterator;
+ typedef ListHashSetConstReverseIterator<ValueArg, inlineCapacity, HashArg> const_reverse_iterator;
+ typedef ListHashSetNode<ValueArg, inlineCapacity> Node;
+ typedef ValueArg ValueType;
+ typedef const ValueType& ReferenceType;
+ typedef const ValueType* PointerType;
+
+ friend class ListHashSet<ValueArg, inlineCapacity, HashArg>;
+ friend class ListHashSetConstReverseIterator<ValueArg, inlineCapacity, HashArg>;
+
+ ListHashSetConstReverseIterator(const ListHashSetType* set, Node* position)
+ : m_set(set)
+ , m_position(position)
+ {
+ }
+
+ public:
+ ListHashSetConstReverseIterator()
+ {
+ }
+
+ PointerType get() const
+ {
+ return &m_position->m_value;
+ }
+ ReferenceType operator*() const { return *get(); }
+ PointerType operator->() const { return get(); }
+
+ const_reverse_iterator& operator++()
+ {
+ ASSERT(m_position != 0);
+ m_position = m_position->m_prev;
+ return *this;
+ }
+
+ // postfix ++ intentionally omitted
+
+ const_reverse_iterator& operator--()
+ {
+ ASSERT(m_position != m_set->m_tail);
+ if (!m_position)
+ m_position = m_set->m_head;
+ else
+ m_position = m_position->m_next;
+ return *this;
+ }
+
+ // postfix -- intentionally omitted
+
+ // Comparison.
+ bool operator==(const const_reverse_iterator& other) const
+ {
+ return m_position == other.m_position;
+ }
+ bool operator!=(const const_reverse_iterator& other) const
+ {
+ return m_position != other.m_position;
+ }
+
+ private:
+ Node* node() { return m_position; }
+
+ const ListHashSetType* m_set;
+ Node* m_position;
+ };
+
template<typename ValueType, size_t inlineCapacity, typename HashFunctions>
struct ListHashSetTranslator {
private:
@@ -458,6 +583,30 @@
}
template<typename T, size_t inlineCapacity, typename U>
+ inline typename ListHashSet<T, inlineCapacity, U>::reverse_iterator ListHashSet<T, inlineCapacity, U>::rbegin()
+ {
+ return makeReverseIterator(m_tail);
+ }
+
+ template<typename T, size_t inlineCapacity, typename U>
+ inline typename ListHashSet<T, inlineCapacity, U>::reverse_iterator ListHashSet<T, inlineCapacity, U>::rend()
+ {
+ return makeReverseIterator(0);
+ }
+
+ template<typename T, size_t inlineCapacity, typename U>
+ inline typename ListHashSet<T, inlineCapacity, U>::const_reverse_iterator ListHashSet<T, inlineCapacity, U>::rbegin() const
+ {
+ return makeConstReverseIterator(m_tail);
+ }
+
+ template<typename T, size_t inlineCapacity, typename U>
+ inline typename ListHashSet<T, inlineCapacity, U>::const_reverse_iterator ListHashSet<T, inlineCapacity, U>::rend() const
+ {
+ return makeConstReverseIterator(0);
+ }
+
+ template<typename T, size_t inlineCapacity, typename U>
inline T& ListHashSet<T, inlineCapacity, U>::first()
{
ASSERT(!isEmpty());
@@ -676,6 +825,18 @@
}
template<typename T, size_t inlineCapacity, typename U>
+ inline ListHashSetReverseIterator<T, inlineCapacity, U> ListHashSet<T, inlineCapacity, U>::makeReverseIterator(Node* position)
+ {
+ return ListHashSetReverseIterator<T, inlineCapacity, U>(this, position);
+ }
+
+ template<typename T, size_t inlineCapacity, typename U>
+ inline ListHashSetConstReverseIterator<T, inlineCapacity, U> ListHashSet<T, inlineCapacity, U>::makeConstReverseIterator(Node* position) const
+ {
+ return ListHashSetConstReverseIterator<T, inlineCapacity, U>(this, position);
+ }
+
+ template<typename T, size_t inlineCapacity, typename U>
inline ListHashSetIterator<T, inlineCapacity, U> ListHashSet<T, inlineCapacity, U>::makeIterator(Node* position)
{
return ListHashSetIterator<T, inlineCapacity, U>(this, position);
@@ -686,7 +847,6 @@
{
return ListHashSetConstIterator<T, inlineCapacity, U>(this, position);
}
-
template<bool, typename ValueType, typename HashTableType>
void deleteAllValues(HashTableType& collection)
{
Modified: trunk/Source/WebCore/ChangeLog (96642 => 96643)
--- trunk/Source/WebCore/ChangeLog 2011-10-04 21:10:48 UTC (rev 96642)
+++ trunk/Source/WebCore/ChangeLog 2011-10-04 21:16:56 UTC (rev 96643)
@@ -1,3 +1,29 @@
+2011-10-04 David Hyatt <hy...@apple.com>
+
+ https://bugs.webkit.org/show_bug.cgi?id=69372
+
+ [CSS3 Regions] Make sure overflow:visible lets content spill out of regions.
+
+ Reviewed by Anders Carlsson.
+
+ No new tests, since plenty of results changed.
+
+ * rendering/RenderFlowThread.cpp:
+ (WebCore::RenderFlowThread::paintIntoRegion):
+ (WebCore::RenderFlowThread::hitTestRegion):
+ (WebCore::RenderFlowThread::repaintRectangleInRegions):
+ (WebCore::RenderFlowThread::firstRegion):
+ (WebCore::RenderFlowThread::lastRegion):
+ * rendering/RenderFlowThread.h:
+ * rendering/RenderRegion.cpp:
+ (WebCore::RenderRegion::regionOverflowRect):
+ (WebCore::RenderRegion::isFirstRegion):
+ (WebCore::RenderRegion::isLastRegion):
+ (WebCore::RenderRegion::layout):
+ * rendering/RenderRegion.h:
+ (WebCore::RenderRegion::setRegionRect):
+ (WebCore::RenderRegion::regionRect):
+
2011-10-04 Chris Rogers <crog...@google.com>
Avoid unnecessary ASSERT in AudioDSPKernelProcessor::setNumberOfChannels()
Modified: trunk/Source/WebCore/rendering/RenderFlowThread.cpp (96642 => 96643)
--- trunk/Source/WebCore/rendering/RenderFlowThread.cpp 2011-10-04 21:10:48 UTC (rev 96642)
+++ trunk/Source/WebCore/rendering/RenderFlowThread.cpp 2011-10-04 21:16:56 UTC (rev 96643)
@@ -420,7 +420,8 @@
// paintOffset contains the offset where the painting should occur
// adjusted with the region padding and border.
LayoutRect regionRect(region->regionRect());
- LayoutRect regionClippingRect(paintOffset, regionRect.size());
+ LayoutRect regionOverflowRect(region->regionOverflowRect());
+ LayoutRect regionClippingRect(paintOffset, regionOverflowRect.size());
PaintInfo info(paintInfo);
info.rect.intersect(regionClippingRect);
@@ -452,8 +453,9 @@
bool RenderFlowThread::hitTestRegion(RenderRegion* region, const HitTestRequest& request, HitTestResult& result, const LayoutPoint& pointInContainer, const LayoutPoint& accumulatedOffset)
{
- LayoutRect regionRect = region->regionRect();
- LayoutRect regionClippingRect(accumulatedOffset, regionRect.size());
+ LayoutRect regionRect(region->regionRect());
+ LayoutRect regionOverflowRect = region->regionOverflowRect();
+ LayoutRect regionClippingRect(accumulatedOffset, regionOverflowRect.size());
if (!regionClippingRect.contains(pointInContainer))
return false;
@@ -504,9 +506,11 @@
// We only have to issue a repaint in this region if the region rect intersects the repaint rect.
LayoutRect flippedRegionRect(region->regionRect());
- flipForWritingMode(flippedRegionRect); // Put the region rect into physical coordinates.
-
- IntRect clippedRect(flippedRegionRect);
+ LayoutRect flippedRegionOverflowRect(region->regionOverflowRect());
+ flipForWritingMode(flippedRegionRect); // Put the region rects into physical coordinates.
+ flipForWritingMode(flippedRegionOverflowRect);
+
+ IntRect clippedRect(flippedRegionOverflowRect);
clippedRect.intersect(repaintRect);
if (clippedRect.isEmpty())
continue;
@@ -699,4 +703,30 @@
return 0;
}
+RenderRegion* RenderFlowThread::firstRegion() const
+{
+ if (!hasValidRegions())
+ return 0;
+ for (RenderRegionList::const_iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) {
+ RenderRegion* region = *iter;
+ if (!region->isValid())
+ continue;
+ return region;
+ }
+ return 0;
+}
+
+RenderRegion* RenderFlowThread::lastRegion() const
+{
+ if (!hasValidRegions())
+ return 0;
+ for (RenderRegionList::const_reverse_iterator iter = m_regionList.rbegin(); iter != m_regionList.rend(); ++iter) {
+ RenderRegion* region = *iter;
+ if (!region->isValid())
+ continue;
+ return region;
+ }
+ return 0;
+}
+
} // namespace WebCore
Modified: trunk/Source/WebCore/rendering/RenderFlowThread.h (96642 => 96643)
--- trunk/Source/WebCore/rendering/RenderFlowThread.h 2011-10-04 21:10:48 UTC (rev 96642)
+++ trunk/Source/WebCore/rendering/RenderFlowThread.h 2011-10-04 21:16:56 UTC (rev 96643)
@@ -114,6 +114,9 @@
LayoutUnit contentLogicalHeightOfFirstRegion() const;
LayoutUnit contentLogicalLeftOfFirstRegion() const;
+ RenderRegion* firstRegion() const;
+ RenderRegion* lastRegion() const;
+
private:
virtual const char* renderName() const { return "RenderFlowThread"; }
Modified: trunk/Source/WebCore/rendering/RenderRegion.cpp (96642 => 96643)
--- trunk/Source/WebCore/rendering/RenderRegion.cpp 2011-10-04 21:10:48 UTC (rev 96642)
+++ trunk/Source/WebCore/rendering/RenderRegion.cpp 2011-10-04 21:16:56 UTC (rev 96643)
@@ -53,6 +53,40 @@
deleteAllRenderBoxRegionInfo();
}
+LayoutRect RenderRegion::regionOverflowRect() const
+{
+ if (hasOverflowClip() || !isValid() || !m_flowThread)
+ return regionRect();
+
+ LayoutRect flowThreadOverflow = m_flowThread->visualOverflowRect();
+
+ // Only clip along the flow thread axis.
+ LayoutRect clipRect;
+ if (m_flowThread->isHorizontalWritingMode()) {
+ LayoutUnit minY = isFirstRegion() ? flowThreadOverflow.y() : regionRect().y();
+ LayoutUnit maxY = isLastRegion() ? flowThreadOverflow.maxY() : regionRect().maxY();
+ clipRect = LayoutRect(flowThreadOverflow.x(), minY, flowThreadOverflow.width(), maxY - minY);
+ } else {
+ LayoutUnit minX = isFirstRegion() ? flowThreadOverflow.x() : regionRect().x();
+ LayoutUnit maxX = isLastRegion() ? flowThreadOverflow.maxX() : regionRect().maxX();
+ clipRect = LayoutRect(minX, flowThreadOverflow.y(), maxX - minX, flowThreadOverflow.height());
+ }
+
+ return clipRect;
+}
+
+bool RenderRegion::isFirstRegion() const
+{
+ ASSERT(isValid() && m_flowThread);
+ return m_flowThread->firstRegion() == this;
+}
+
+bool RenderRegion::isLastRegion() const
+{
+ ASSERT(isValid() && m_flowThread);
+ return m_flowThread->lastRegion() == this;
+}
+
void RenderRegion::paintReplaced(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
{
// Delegate painting of content in region to RenderFlowThread.
@@ -91,6 +125,17 @@
if (regionRect().width() != contentWidth() || regionRect().height() != contentHeight())
m_flowThread->invalidateRegions();
}
+
+ // FIXME: We need to find a way to set up overflow properly. Our flow thread hasn't gotten a layout
+ // yet, so we can't look to it for correct information. It's possible we could wait until after the RenderFlowThread
+ // gets a layout, and then try to propagate overflow information back to the region, and then mark for a second layout.
+ // That second layout would then be able to use the information from the RenderFlowThread to set up overflow.
+ //
+ // The big problem though is that overflow needs to be region-specific. We can't simply use the RenderFlowThread's global
+ // overflow values, since then we'd always think any narrow region had huge overflow (all the way to the width of the
+ // RenderFlowThread itself).
+ //
+ // We'll need to expand RenderBoxRegionInfo to also hold left and right overflow values.
}
void RenderRegion::attachRegion()
Modified: trunk/Source/WebCore/rendering/RenderRegion.h (96642 => 96643)
--- trunk/Source/WebCore/rendering/RenderRegion.h 2011-10-04 21:10:48 UTC (rev 96642)
+++ trunk/Source/WebCore/rendering/RenderRegion.h 2011-10-04 21:16:56 UTC (rev 96643)
@@ -48,8 +48,9 @@
virtual void paintReplaced(PaintInfo&, const LayoutPoint&);
virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const LayoutPoint& pointInContainer, const LayoutPoint& accumulatedOffset, HitTestAction);
- void setRegionRect(const IntRect& rect) { m_regionRect = rect; }
- IntRect regionRect() const { return m_regionRect; }
+ void setRegionRect(const LayoutRect& rect) { m_regionRect = rect; }
+ LayoutRect regionRect() const { return m_regionRect; }
+ LayoutRect regionOverflowRect() const;
void attachRegion();
void detachRegion();
@@ -70,6 +71,9 @@
LayoutUnit offsetFromLogicalTopOfFirstPage() const;
+ bool isFirstRegion() const;
+ bool isLastRegion() const;
+
private:
virtual const char* renderName() const { return "RenderRegion"; }
@@ -79,7 +83,7 @@
// we need to create a dependency tree, so that layout of the
// regions is always done before the regions themselves.
RenderFlowThread* m_parentFlowThread;
- IntRect m_regionRect;
+ LayoutRect m_regionRect;
// This map holds unique information about a block that is split across regions.
// A RenderBoxRegionInfo* tells us about any layout information for a RenderBox that
_______________________________________________ webkit-changes mailing list webkit-changes@lists.webkit.org http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes