+2011-09-22 David Hyatt <hyatt@apple.com>
+
+ https://bugs.webkit.org/show_bug.cgi?id=68638
+
+ Make RenderFlowThread cache whether or not it has regions of varying widths. This will
+ be relevant for performance as we begin adding code to do custom block painting and
+ layout based off regions not having the same width.
+
+ Reviewed by Dan Bernstein and Adam Roben.
+
+ * rendering/RenderFlowThread.cpp:
+ (WebCore::RenderFlowThread::RenderFlowThread):
+ (WebCore::RenderFlowThread::layout):
+ * rendering/RenderFlowThread.h:
+
2011-09-22 Anders Carlsson <andersca@apple.com>
FrameView::invalidateRect and FrameView::setFrameRect shouldn't take LayoutRects
, m_flowThread(flowThread)
, m_hasValidRegions(false)
, m_regionsInvalidated(false)
+ , m_regionsHaveUniformLogicalWidth(true)
, m_regionFittingDisableCount(0)
{
setIsAnonymous(false);
bool regionsChanged = m_regionsInvalidated && m_everHadLayout;
if (m_regionsInvalidated) {
m_regionsInvalidated = false;
+ m_hasValidRegions = false;
+ m_regionsHaveUniformLogicalWidth = true;
+ LayoutUnit previousRegionLogicalWidth = 0;
if (hasRegions()) {
int logicalHeight = 0;
for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) {
ASSERT(!region->needsLayout());
- m_hasValidRegions = true;
+ LayoutUnit regionLogicalWidth;
IntRect regionRect;
if (isHorizontalWritingMode()) {
regionRect = IntRect(0, logicalHeight, region->contentWidth(), region->contentHeight());
logicalHeight += regionRect.height();
+ regionLogicalWidth = region->contentWidth();
} else {
regionRect = IntRect(logicalHeight, 0, region->contentWidth(), region->contentHeight());
logicalHeight += regionRect.width();
+ regionLogicalWidth = region->contentHeight();
}
+ if (!m_hasValidRegions)
+ m_hasValidRegions = true;
+ else if (m_regionsHaveUniformLogicalWidth && previousRegionLogicalWidth != regionLogicalWidth)
+ m_regionsHaveUniformLogicalWidth = false;
+
+ previousRegionLogicalWidth = regionLogicalWidth;
+
region->setRegionRect(regionRect);
}
}
void disableRegionFitting() { m_regionFittingDisableCount++; }
void enableRegionFitting() { ASSERT(m_regionFittingDisableCount > 0); m_regionFittingDisableCount--; }
+ bool regionsHaveUniformLogicalWidth() const { return m_regionsHaveUniformLogicalWidth; }
+
RenderRegion* mapFromFlowToRegion(TransformState&) const;
private:
bool m_hasValidRegions;
bool m_regionsInvalidated;
+ bool m_regionsHaveUniformLogicalWidth;
unsigned m_regionFittingDisableCount;
};