TEST_P(PaintControllerPaintTestForSlimmingPaintV1AndV2, InlineRelayout) { setBodyInnerHTML("<div id='div' style='width:100px; height: 200px'>AAAAAAAAAA BBBBBBBBBB</div>"); PaintLayer& rootLayer = *layoutView().layer(); Element& div = *toElement(document().body()->firstChild()); LayoutBlock& divBlock = *toLayoutBlock(document().body()->firstChild()->layoutObject()); LayoutText& text = *toLayoutText(divBlock.firstChild()); InlineTextBox& firstTextBox = *text.firstTextBox(); if (RuntimeEnabledFeatures::slimmingPaintSynchronizedPaintingEnabled()) { EXPECT_DISPLAY_LIST(rootPaintController().displayItemList(), 4, TestDisplayItem(rootLayer, DisplayItem::Subsequence), TestDisplayItem(layoutView(), backgroundType), TestDisplayItem(firstTextBox, foregroundType), TestDisplayItem(rootLayer, DisplayItem::EndSubsequence)); } else { GraphicsContext context(rootPaintController()); PaintLayerPaintingInfo paintingInfo(&rootLayer, LayoutRect(0, 0, 800, 600), GlobalPaintNormalPhase, LayoutSize()); PaintLayerPainter(rootLayer).paintLayerContents(&context, paintingInfo, PaintLayerPaintingCompositingAllPhases); rootPaintController().commitNewDisplayItems(); EXPECT_DISPLAY_LIST(rootPaintController().displayItemList(), 2, TestDisplayItem(layoutView(), backgroundType), TestDisplayItem(firstTextBox, foregroundType)); } div.setAttribute(HTMLNames::styleAttr, "width: 10px; height: 200px"); document().view()->updateAllLifecyclePhases(); LayoutText& newText = *toLayoutText(divBlock.firstChild()); InlineTextBox& newFirstTextBox = *newText.firstTextBox(); InlineTextBox& secondTextBox = *newText.firstTextBox()->nextTextBox(); if (RuntimeEnabledFeatures::slimmingPaintSynchronizedPaintingEnabled()) { EXPECT_DISPLAY_LIST(rootPaintController().displayItemList(), 5, TestDisplayItem(rootLayer, DisplayItem::Subsequence), TestDisplayItem(layoutView(), backgroundType), TestDisplayItem(newFirstTextBox, foregroundType), TestDisplayItem(secondTextBox, foregroundType), TestDisplayItem(rootLayer, DisplayItem::EndSubsequence)); } else { GraphicsContext context(rootPaintController()); PaintLayerPaintingInfo paintingInfo(&rootLayer, LayoutRect(0, 0, 800, 600), GlobalPaintNormalPhase, LayoutSize()); PaintLayerPainter(rootLayer).paintLayerContents(&context, paintingInfo, PaintLayerPaintingCompositingAllPhases); rootPaintController().commitNewDisplayItems(); EXPECT_DISPLAY_LIST(rootPaintController().displayItemList(), 3, TestDisplayItem(layoutView(), backgroundType), TestDisplayItem(newFirstTextBox, foregroundType), TestDisplayItem(secondTextBox, foregroundType)); } }
TEST_P(PaintControllerPaintTestForSlimmingPaintV1AndV2, FullDocumentPaintingWithCaret) { setBodyInnerHTML("<div id='div' contentEditable='true' style='outline:none'>XYZ</div>"); document().page()->focusController().setActive(true); document().page()->focusController().setFocused(true); PaintLayer& rootLayer = *layoutView().layer(); Element& div = *toElement(document().body()->firstChild()); LayoutObject& divLayoutObject = *document().body()->firstChild()->layoutObject(); InlineTextBox& textInlineBox = *toLayoutText(div.firstChild()->layoutObject())->firstTextBox(); if (RuntimeEnabledFeatures::slimmingPaintSynchronizedPaintingEnabled()) { EXPECT_DISPLAY_LIST(rootPaintController().displayItemList(), 4, TestDisplayItem(rootLayer, DisplayItem::Subsequence), TestDisplayItem(layoutView(), backgroundType), TestDisplayItem(textInlineBox, foregroundType), TestDisplayItem(rootLayer, DisplayItem::EndSubsequence)); } else { GraphicsContext context(rootPaintController()); PaintLayerPaintingInfo paintingInfo(&rootLayer, LayoutRect(0, 0, 800, 600), GlobalPaintNormalPhase, LayoutSize()); PaintLayerPainter(rootLayer).paintLayerContents(&context, paintingInfo, PaintLayerPaintingCompositingAllPhases); rootPaintController().commitNewDisplayItems(); EXPECT_DISPLAY_LIST(rootPaintController().displayItemList(), 2, TestDisplayItem(layoutView(), backgroundType), TestDisplayItem(textInlineBox, foregroundType)); } div.focus(); document().view()->updateAllLifecyclePhases(); if (RuntimeEnabledFeatures::slimmingPaintSynchronizedPaintingEnabled()) { EXPECT_DISPLAY_LIST(rootPaintController().displayItemList(), 5, TestDisplayItem(rootLayer, DisplayItem::Subsequence), TestDisplayItem(layoutView(), backgroundType), TestDisplayItem(textInlineBox, foregroundType), TestDisplayItem(divLayoutObject, DisplayItem::Caret), // New! TestDisplayItem(rootLayer, DisplayItem::EndSubsequence)); } else { GraphicsContext context(rootPaintController()); PaintLayerPaintingInfo paintingInfo(&rootLayer, LayoutRect(0, 0, 800, 600), GlobalPaintNormalPhase, LayoutSize()); PaintLayerPainter(rootLayer).paintLayerContents(&context, paintingInfo, PaintLayerPaintingCompositingAllPhases); rootPaintController().commitNewDisplayItems(); EXPECT_DISPLAY_LIST(rootPaintController().displayItemList(), 3, TestDisplayItem(layoutView(), backgroundType), TestDisplayItem(textInlineBox, foregroundType), TestDisplayItem(divLayoutObject, DisplayItem::Caret)); // New! } }
// TODO(wangxianzhu): Create a version for slimming paint v2 when it supports interest rect TEST_F(TableCellPainterTest, TableCellBackgroundInterestRect) { setBodyInnerHTML( "<style>" " td { width: 200px; height: 200px; border: none; }" " tr { background-color: blue; }" " table { border: none; border-spacing: 0; border-collapse: collapse; }" "</style>" "<table>" " <tr><td id='cell1'></td></tr>" " <tr><td id='cell2'></td></tr>" "</table>"); LayoutView& layoutView = *document().layoutView(); PaintLayer& rootLayer = *layoutView.layer(); LayoutObject& cell1 = *document().getElementById("cell1")->layoutObject(); LayoutObject& cell2 = *document().getElementById("cell2")->layoutObject(); GraphicsContext context(&rootDisplayItemList()); PaintLayerPaintingInfo paintingInfo(&rootLayer, LayoutRect(0, 0, 200, 200), GlobalPaintNormalPhase, LayoutSize()); PaintLayerPainter(rootLayer).paintLayerContents(&context, paintingInfo, PaintLayerPaintingCompositingAllPhases); rootDisplayItemList().commitNewDisplayItems(); EXPECT_DISPLAY_LIST(rootDisplayItemList().displayItems(), 2, TestDisplayItem(layoutView, DisplayItem::BoxDecorationBackground), TestDisplayItem(cell1, DisplayItem::TableCellBackgroundFromRow)); PaintLayerPaintingInfo paintingInfo1(&rootLayer, LayoutRect(0, 300, 200, 200), GlobalPaintNormalPhase, LayoutSize()); PaintLayerPainter(rootLayer).paintLayerContents(&context, paintingInfo1, PaintLayerPaintingCompositingAllPhases); rootDisplayItemList().commitNewDisplayItems(); EXPECT_DISPLAY_LIST(rootDisplayItemList().displayItems(), 2, TestDisplayItem(layoutView, DisplayItem::BoxDecorationBackground), TestDisplayItem(cell2, DisplayItem::TableCellBackgroundFromRow)); }
void PaintLayerPainter::paintOverlayScrollbars(GraphicsContext* context, const LayoutRect& damageRect, const GlobalPaintFlags paintFlags, LayoutObject* paintingRoot) { if (!m_paintLayer.containsDirtyOverlayScrollbars()) return; PaintLayerPaintingInfo paintingInfo(&m_paintLayer, LayoutRect(enclosingIntRect(damageRect)), paintFlags, LayoutSize(), paintingRoot); paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars); m_paintLayer.setContainsDirtyOverlayScrollbars(false); }
void FrameView::paint(GraphicsContext* context, const IntRect& rect) { #ifndef NDEBUG bool fillWithRed; if (isTransparent()) fillWithRed = false; // Transparent, don't fill with red. else fillWithRed = true; if (fillWithRed) context->fillRect(rect, Color(0xFF, 0, 0)); #endif RenderView* renderView = this->renderView(); if (!renderView) { WTF_LOG_ERROR("called FrameView::paint with nil renderer"); return; } RELEASE_ASSERT(!needsLayout()); bool isTopLevelPainter = !s_inPaintContents; s_inPaintContents = true; FontCachePurgePreventer fontCachePurgePreventer; ASSERT(!m_isPainting); m_isPainting = true; #if ENABLE(ASSERT) renderView->assertSubtreeIsLaidOut(); RenderObject::SetLayoutNeededForbiddenScope forbidSetNeedsLayout(*renderView); #endif LayerPaintingInfo paintingInfo(renderView->layer(), pixelSnappedIntRect(renderView->viewRect()), LayoutSize()); renderView->paintLayer(context, paintingInfo); m_isPainting = false; m_lastPaintTime = currentTime(); if (isTopLevelPainter) { // Everything that happens after paintContents completions is considered // to be part of the next frame. s_currentFrameTimeStamp = currentTime(); s_inPaintContents = false; } }
void RenderReplica::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset) { if (paintInfo.phase != PaintPhaseForeground && paintInfo.phase != PaintPhaseMask) return; LayoutPoint adjustedPaintOffset = paintOffset + location(); if (paintInfo.phase == PaintPhaseForeground) { // Turn around and paint the parent layer. Use temporary clipRects, so that the layer doesn't end up caching clip rects // computing using the wrong rootLayer RenderLayer* rootPaintingLayer = layer()->transform() ? layer()->parent() : layer()->enclosingTransformedAncestor(); RenderLayer::LayerPaintingInfo paintingInfo(rootPaintingLayer, paintInfo.rect, PaintBehaviorNormal, LayoutSize(), 0); RenderLayer::PaintLayerFlags flags = RenderLayer::PaintLayerHaveTransparency | RenderLayer::PaintLayerAppliedTransform | RenderLayer::PaintLayerTemporaryClipRects | RenderLayer::PaintLayerPaintingReflection; layer()->parent()->paintLayer(paintInfo.context(), paintingInfo, flags); } else if (paintInfo.phase == PaintPhaseMask) paintMask(paintInfo, adjustedPaintOffset); }
void ReplicaPainter::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset) { ANNOTATE_GRAPHICS_CONTEXT(paintInfo, &m_renderReplica); if (paintInfo.phase != PaintPhaseForeground && paintInfo.phase != PaintPhaseMask) return; LayoutPoint adjustedPaintOffset = paintOffset + m_renderReplica.location(); if (paintInfo.phase == PaintPhaseForeground) { // Turn around and paint the parent layer. Use temporary clipRects, so that the layer doesn't end up caching clip rects // computing using the wrong rootLayer RenderLayer* rootPaintingLayer = m_renderReplica.layer()->transform() ? m_renderReplica.layer()->parent() : m_renderReplica.layer()->enclosingTransformedAncestor(); LayerPaintingInfo paintingInfo(rootPaintingLayer, paintInfo.rect, PaintBehaviorNormal, LayoutSize(), 0); PaintLayerFlags flags = PaintLayerHaveTransparency | PaintLayerAppliedTransform | PaintLayerUncachedClipRects | PaintLayerPaintingReflection; LayerPainter(*m_renderReplica.layer()->parent()).paintLayer(paintInfo.context, paintingInfo, flags); } else if (paintInfo.phase == PaintPhaseMask) { m_renderReplica.paintMask(paintInfo, adjustedPaintOffset); } }
void PaintLayerPainter::paint(GraphicsContext* context, const LayoutRect& damageRect, const GlobalPaintFlags globalPaintFlags, LayoutObject* paintingRoot, PaintLayerFlags paintFlags) { PaintLayerPaintingInfo paintingInfo(&m_paintLayer, LayoutRect(enclosingIntRect(damageRect)), globalPaintFlags, LayoutSize(), paintingRoot); if (shouldPaintLayerInSoftwareMode(globalPaintFlags, paintFlags)) paintLayer(context, paintingInfo, paintFlags); }