void DrawingAreaImpl::scroll(const IntRect& scrollRect, const IntSize& scrollOffset) { if (!m_isPaintingEnabled) return; if (m_layerTreeHost) { ASSERT(m_scrollRect.isEmpty()); ASSERT(m_scrollOffset.isEmpty()); ASSERT(m_dirtyRegion.isEmpty()); m_layerTreeHost->scrollNonCompositedContents(scrollRect, scrollOffset); return; } if (m_webPage->mainFrameHasCustomRepresentation()) return; if (scrollRect.isEmpty()) return; if (!m_scrollRect.isEmpty() && scrollRect != m_scrollRect) { unsigned scrollArea = scrollRect.width() * scrollRect.height(); unsigned currentScrollArea = m_scrollRect.width() * m_scrollRect.height(); if (currentScrollArea >= scrollArea) { // The rect being scrolled is at least as large as the rect we'd like to scroll. // Go ahead and just invalidate the scroll rect. setNeedsDisplay(scrollRect); return; } // Just repaint the entire current scroll rect, we'll scroll the new rect instead. setNeedsDisplay(m_scrollRect); m_scrollRect = IntRect(); m_scrollOffset = IntSize(); } // Get the part of the dirty region that is in the scroll rect. Region dirtyRegionInScrollRect = intersect(scrollRect, m_dirtyRegion); if (!dirtyRegionInScrollRect.isEmpty()) { // There are parts of the dirty region that are inside the scroll rect. // We need to subtract them from the region, move them and re-add them. m_dirtyRegion.subtract(scrollRect); // Move the dirty parts. Region movedDirtyRegionInScrollRect = intersect(translate(dirtyRegionInScrollRect, scrollOffset), scrollRect); // And add them back. m_dirtyRegion.unite(movedDirtyRegionInScrollRect); } // Compute the scroll repaint region. Region scrollRepaintRegion = subtract(scrollRect, translate(scrollRect, scrollOffset)); m_dirtyRegion.unite(scrollRepaintRegion); scheduleDisplay(); m_scrollRect = scrollRect; m_scrollOffset += scrollOffset; }
void ChunkedUpdateDrawingArea::setNeedsDisplay(const IntRect& rect) { // FIXME: Collect a set of rects/region instead of just the union // of all rects. m_dirtyRect.unite(rect); scheduleDisplay(); }
void TiledDrawingArea::setSize(const IntSize& viewSize) { ASSERT(m_shouldPaint); ASSERT_ARG(viewSize, !viewSize.isEmpty()); m_webPage->setSize(viewSize); scheduleDisplay(); WebProcess::shared().connection()->send(DrawingAreaProxyLegacyMessage::DidSetSize, m_webPage->pageID(), CoreIPC::In(viewSize)); }
void ChunkedUpdateDrawingArea::resumePainting(bool forceRepaint) { ASSERT(m_paintingIsSuspended); m_paintingIsSuspended = false; if (forceRepaint) { // Just set the dirty rect to the entire page size. m_dirtyRect = IntRect(IntPoint(0, 0), m_webPage->size()); } // Schedule a display. scheduleDisplay(); }
void CoordinatedDrawingArea::setNeedsDisplayInRect(const IntRect& rect) { if (!m_isPaintingEnabled) return; if (m_layerTreeHost) { ASSERT(m_dirtyRegion.isEmpty()); m_layerTreeHost->setNonCompositedContentsNeedDisplayInRect(rect); return; } IntRect dirtyRect = rect; dirtyRect.intersect(m_webPage->bounds()); if (dirtyRect.isEmpty()) return; m_dirtyRegion.unite(dirtyRect); scheduleDisplay(); }
void DrawingAreaImpl::setNeedsDisplay(const IntRect& rect) { if (!m_isPaintingEnabled) return; IntRect dirtyRect = rect; dirtyRect.intersect(m_webPage->bounds()); if (dirtyRect.isEmpty()) return; if (m_layerTreeHost) { ASSERT(m_dirtyRegion.isEmpty()); m_layerTreeHost->setNonCompositedContentsNeedDisplay(dirtyRect); return; } if (m_webPage->mainFrameHasCustomRepresentation()) return; m_dirtyRegion.unite(dirtyRect); scheduleDisplay(); }