void SVGImagePainter::paint(PaintInfo& paintInfo) { ANNOTATE_GRAPHICS_CONTEXT(paintInfo, &m_renderSVGImage); if (paintInfo.phase != PaintPhaseForeground || m_renderSVGImage.style()->visibility() == HIDDEN || !m_renderSVGImage.imageResource()->hasImage()) return; FloatRect boundingBox = m_renderSVGImage.paintInvalidationRectInLocalCoordinates(); if (!SVGRenderSupport::paintInfoIntersectsPaintInvalidationRect(boundingBox, m_renderSVGImage.localToParentTransform(), paintInfo)) return; PaintInfo childPaintInfo(paintInfo); GraphicsContextStateSaver stateSaver(*childPaintInfo.context, false); childPaintInfo.applyTransform(m_renderSVGImage.localToParentTransform(), &stateSaver); if (!m_renderSVGImage.objectBoundingBox().isEmpty()) { // SVGRenderingContext may taint the state - make sure we're always saving. stateSaver.saveIfNeeded(); SVGRenderingContext renderingContext(&m_renderSVGImage, childPaintInfo); if (renderingContext.isRenderingPrepared()) { if (m_renderSVGImage.style()->svgStyle().bufferedRendering() == BR_STATIC && renderingContext.bufferForeground(m_renderSVGImage.bufferedForeground())) return; paintForeground(m_renderSVGImage, childPaintInfo); } } if (m_renderSVGImage.style()->outlineWidth()) ObjectPainter(m_renderSVGImage).paintOutline(childPaintInfo, IntRect(boundingBox)); }
void TableSectionPainter::paint(const PaintInfo& paintInfo, const LayoutPoint& paintOffset) { ANNOTATE_GRAPHICS_CONTEXT(paintInfo, &m_layoutTableSection); ASSERT(!m_layoutTableSection.needsLayout()); // avoid crashing on bugs that cause us to paint with dirty layout if (m_layoutTableSection.needsLayout()) return; unsigned totalRows = m_layoutTableSection.numRows(); unsigned totalCols = m_layoutTableSection.table()->columns().size(); if (!totalRows || !totalCols) return; LayoutPoint adjustedPaintOffset = paintOffset + m_layoutTableSection.location(); { BoxClipper boxClipper(m_layoutTableSection, paintInfo, adjustedPaintOffset, ForceContentsClip); paintObject(paintInfo, adjustedPaintOffset); } if ((paintInfo.phase == PaintPhaseOutline || paintInfo.phase == PaintPhaseSelfOutline) && m_layoutTableSection.style()->visibility() == VISIBLE) { LayoutRect visualOverflowRect(m_layoutTableSection.visualOverflowRect()); visualOverflowRect.moveBy(adjustedPaintOffset); ObjectPainter(m_layoutTableSection).paintOutline(paintInfo, LayoutRect(adjustedPaintOffset, m_layoutTableSection.size()), visualOverflowRect); } }
void RenderSVGImage::paint(PaintInfo& paintInfo, const LayoutPoint&) { ANNOTATE_GRAPHICS_CONTEXT(paintInfo, this); if (paintInfo.context->paintingDisabled() || style()->visibility() == HIDDEN || !m_imageResource->hasImage()) return; FloatRect boundingBox = repaintRectInLocalCoordinates(); if (!SVGRenderSupport::paintInfoIntersectsRepaintRect(boundingBox, m_localTransform, paintInfo)) return; PaintInfo childPaintInfo(paintInfo); bool drawsOutline = style()->outlineWidth() && (childPaintInfo.phase == PaintPhaseOutline || childPaintInfo.phase == PaintPhaseSelfOutline); if (drawsOutline || childPaintInfo.phase == PaintPhaseForeground) { GraphicsContextStateSaver stateSaver(*childPaintInfo.context); childPaintInfo.applyTransform(m_localTransform); if (childPaintInfo.phase == PaintPhaseForeground && !m_objectBoundingBox.isEmpty()) { SVGRenderingContext renderingContext(this, childPaintInfo); if (renderingContext.isRenderingPrepared()) { if (style()->svgStyle()->bufferedRendering() == BR_STATIC && renderingContext.bufferForeground(m_bufferedForeground)) return; paintForeground(childPaintInfo); } } if (drawsOutline) paintOutline(childPaintInfo, IntRect(boundingBox)); } }
void RenderWidget::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset) { ANNOTATE_GRAPHICS_CONTEXT(paintInfo, this); if (!shouldPaint(paintInfo, paintOffset)) return; LayoutPoint adjustedPaintOffset = paintOffset + location(); if (hasBoxDecorationBackground() && (paintInfo.phase == PaintPhaseForeground || paintInfo.phase == PaintPhaseSelection)) paintBoxDecorationBackground(paintInfo, adjustedPaintOffset); if (paintInfo.phase == PaintPhaseMask) { paintMask(paintInfo, adjustedPaintOffset); return; } if ((paintInfo.phase == PaintPhaseOutline || paintInfo.phase == PaintPhaseSelfOutline) && style()->hasOutline()) paintOutline(paintInfo, LayoutRect(adjustedPaintOffset, size())); if (paintInfo.phase != PaintPhaseForeground) return; if (style()->hasBorderRadius()) { LayoutRect borderRect = LayoutRect(adjustedPaintOffset, size()); if (borderRect.isEmpty()) return; // Push a clip if we have a border radius, since we want to round the foreground content that gets painted. paintInfo.context->save(); RoundedRect roundedInnerRect = style()->getRoundedInnerBorderFor(borderRect, paddingTop() + borderTop(), paddingBottom() + borderBottom(), paddingLeft() + borderLeft(), paddingRight() + borderRight(), true, true); BoxPainter::clipRoundedInnerRect(paintInfo.context, borderRect, roundedInnerRect); } Widget* widget = this->widget(); if (widget) paintContents(paintInfo, paintOffset); if (style()->hasBorderRadius()) paintInfo.context->restore(); // Paint a partially transparent wash over selected widgets. if (isSelected() && !document().printing()) { LayoutRect rect = localSelectionRect(); rect.moveBy(adjustedPaintOffset); paintInfo.context->fillRect(pixelSnappedIntRect(rect), selectionBackgroundColor()); } if (canResize()) layer()->scrollableArea()->paintResizer(paintInfo.context, roundedIntPoint(adjustedPaintOffset), paintInfo.rect); }
void RenderSVGContainer::paint(PaintInfo& paintInfo, const LayoutPoint&) { ANNOTATE_GRAPHICS_CONTEXT(paintInfo, this); if (paintInfo.context->paintingDisabled()) return; // Spec: groups w/o children still may render filter content. if (!firstChild() && !selfWillPaint()) return; FloatRect repaintRect = repaintRectInLocalCoordinates(); if (!SVGRenderSupport::paintInfoIntersectsRepaintRect(repaintRect, localToParentTransform(), paintInfo)) return; PaintInfo childPaintInfo(paintInfo); { GraphicsContextStateSaver stateSaver(*childPaintInfo.context); // Let the RenderSVGViewportContainer subclass clip if necessary applyViewportClip(childPaintInfo); childPaintInfo.applyTransform(localToParentTransform()); SVGRenderingContext renderingContext; GraphicsContextCullSaver cullSaver(*childPaintInfo.context); bool continueRendering = true; if (childPaintInfo.phase == PaintPhaseForeground) { renderingContext.prepareToRenderSVGContent(this, childPaintInfo); continueRendering = renderingContext.isRenderingPrepared(); if (continueRendering && document().settings()->containerCullingEnabled()) cullSaver.cull(repaintRectInLocalCoordinates()); } if (continueRendering) { childPaintInfo.updatePaintingRootForChildren(this); for (RenderObject* child = firstChild(); child; child = child->nextSibling()) child->paint(childPaintInfo, IntPoint()); } } // FIXME: This really should be drawn from local coordinates, but currently we hack it // to avoid our clip killing our outline rect. Thus we translate our // outline rect into parent coords before drawing. // FIXME: This means our focus ring won't share our rotation like it should. // We should instead disable our clip during PaintPhaseOutline if ((paintInfo.phase == PaintPhaseOutline || paintInfo.phase == PaintPhaseSelfOutline) && style()->outlineWidth() && style()->visibility() == VISIBLE) { IntRect paintRectInParent = enclosingIntRect(localToParentTransform().mapRect(repaintRect)); paintOutline(paintInfo, paintRectInParent); } }
void FrameSetPainter::paint(const PaintInfo& paintInfo, const LayoutPoint& paintOffset) { ANNOTATE_GRAPHICS_CONTEXT(paintInfo, &m_layoutFrameSet); if (paintInfo.phase != PaintPhaseForeground) return; LayoutObject* child = m_layoutFrameSet.firstChild(); if (!child) return; LayoutPoint adjustedPaintOffset = paintOffset + m_layoutFrameSet.location(); paintChildren(paintInfo, adjustedPaintOffset); paintBorders(paintInfo, adjustedPaintOffset); }
void ViewPainter::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset) { // If we ever require layout but receive a paint anyway, something has gone horribly wrong. ASSERT(!m_renderView.needsLayout()); // RenderViews should never be called to paint with an offset not on device pixels. ASSERT(LayoutPoint(IntPoint(paintOffset.x(), paintOffset.y())) == paintOffset); ANNOTATE_GRAPHICS_CONTEXT(paintInfo, &m_renderView); // This avoids painting garbage between columns if there is a column gap. if (m_renderView.frameView() && m_renderView.style()->isOverflowPaged()) paintInfo.context->fillRect(paintInfo.rect, m_renderView.frameView()->baseBackgroundColor()); m_renderView.paintObject(paintInfo, paintOffset); }
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 SVGImagePainter::paint(const PaintInfo& paintInfo) { ANNOTATE_GRAPHICS_CONTEXT(paintInfo, &m_renderSVGImage); if (paintInfo.phase != PaintPhaseForeground || m_renderSVGImage.style()->visibility() == HIDDEN || !m_renderSVGImage.imageResource()->hasImage()) return; FloatRect boundingBox = m_renderSVGImage.paintInvalidationRectInLocalCoordinates(); PaintInfo childPaintInfo(paintInfo); GraphicsContextStateSaver stateSaver(*childPaintInfo.context); TransformRecorder transformRecorder(*childPaintInfo.context, m_renderSVGImage.displayItemClient(), m_renderSVGImage.localToParentTransform()); SVGRenderingContext renderingContext(&m_renderSVGImage, childPaintInfo); if (renderingContext.isRenderingPrepared()) { RenderDrawingRecorder recorder(childPaintInfo.context, m_renderSVGImage, childPaintInfo.phase, boundingBox); if (!recorder.canUseCachedDrawing()) { if (m_renderSVGImage.style()->svgStyle().bufferedRendering() != BR_STATIC) { paintForeground(childPaintInfo); } else { RefPtr<const SkPicture>& bufferedForeground = m_renderSVGImage.bufferedForeground(); if (!bufferedForeground) { childPaintInfo.context->beginRecording(m_renderSVGImage.objectBoundingBox()); paintForeground(childPaintInfo); bufferedForeground = childPaintInfo.context->endRecording(); } childPaintInfo.context->drawPicture(bufferedForeground.get()); } } } if (m_renderSVGImage.style()->outlineWidth()) ObjectPainter(m_renderSVGImage).paintOutline(childPaintInfo, IntRect(boundingBox)); }
void RenderSVGImage::paint(PaintInfo& paintInfo, const LayoutPoint&) { ANNOTATE_GRAPHICS_CONTEXT(paintInfo, this); if (paintInfo.phase != PaintPhaseForeground || style()->visibility() == HIDDEN || !m_imageResource->hasImage()) return; FloatRect boundingBox = paintInvalidationRectInLocalCoordinates(); if (!SVGRenderSupport::paintInfoIntersectsPaintInvalidationRect(boundingBox, m_localTransform, paintInfo)) return; PaintInfo childPaintInfo(paintInfo); GraphicsContextStateSaver stateSaver(*childPaintInfo.context, false); if (!m_localTransform.isIdentity()) { stateSaver.save(); childPaintInfo.applyTransform(m_localTransform, false); } if (!m_objectBoundingBox.isEmpty()) { // SVGRenderingContext may taint the state - make sure we're always saving. SVGRenderingContext renderingContext(this, childPaintInfo, stateSaver.saved() ? SVGRenderingContext::DontSaveGraphicsContext : SVGRenderingContext::SaveGraphicsContext); if (renderingContext.isRenderingPrepared()) { if (style()->svgStyle().bufferedRendering() == BR_STATIC && renderingContext.bufferForeground(m_bufferedForeground)) return; paintForeground(childPaintInfo); } } if (style()->outlineWidth()) paintOutline(childPaintInfo, IntRect(boundingBox)); }
void InlinePainter::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset) { ANNOTATE_GRAPHICS_CONTEXT(paintInfo, &m_renderInline); LineBoxListPainter(*m_renderInline.lineBoxes()).paint(&m_renderInline, paintInfo, paintOffset); }
void RenderReplaced::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset) { ANNOTATE_GRAPHICS_CONTEXT(paintInfo, this); if (!shouldPaint(paintInfo, paintOffset)) return; LayoutPoint adjustedPaintOffset = paintOffset + location(); if (hasBoxDecorations() && (paintInfo.phase == PaintPhaseForeground || paintInfo.phase == PaintPhaseSelection)) paintBoxDecorations(paintInfo, adjustedPaintOffset); if (paintInfo.phase == PaintPhaseMask) { paintMask(paintInfo, adjustedPaintOffset); return; } LayoutRect paintRect = LayoutRect(adjustedPaintOffset, size()); if ((paintInfo.phase == PaintPhaseOutline || paintInfo.phase == PaintPhaseSelfOutline) && style()->outlineWidth()) paintOutline(paintInfo, paintRect); if (paintInfo.phase != PaintPhaseForeground && paintInfo.phase != PaintPhaseSelection && !canHaveChildren()) return; if (!paintInfo.shouldPaintWithinRoot(this)) return; bool drawSelectionTint = selectionState() != SelectionNone && !document()->printing(); if (paintInfo.phase == PaintPhaseSelection) { if (selectionState() == SelectionNone) return; drawSelectionTint = false; } bool completelyClippedOut = false; if (style()->hasBorderRadius()) { LayoutRect borderRect = LayoutRect(adjustedPaintOffset, size()); if (borderRect.isEmpty()) completelyClippedOut = true; else { // Push a clip if we have a border radius, since we want to round the foreground content that gets painted. paintInfo.context->save(); RoundedRect roundedInnerRect = style()->getRoundedInnerBorderFor(paintRect, paddingTop() + borderTop(), paddingBottom() + borderBottom(), paddingLeft() + borderLeft(), paddingRight() + borderRight(), true, true); clipRoundedInnerRect(paintInfo.context, paintRect, roundedInnerRect); } } if (!completelyClippedOut) { paintReplaced(paintInfo, adjustedPaintOffset); if (style()->hasBorderRadius()) paintInfo.context->restore(); } // The selection tint never gets clipped by border-radius rounding, since we want it to run right up to the edges of // surrounding content. if (drawSelectionTint) { LayoutRect selectionPaintingRect = localSelectionRect(); selectionPaintingRect.moveBy(adjustedPaintOffset); paintInfo.context->fillRect(pixelSnappedIntRect(selectionPaintingRect), selectionBackgroundColor()); } }