void PluginProxy::paint(GraphicsContext* graphicsContext, const IntRect& dirtyRect) { if (!needsBackingStore() || !m_backingStore) return; if (!m_pluginBackingStoreContainsValidData) { m_connection->connection()->sendSync(Messages::PluginControllerProxy::PaintEntirePlugin(), Messages::PluginControllerProxy::PaintEntirePlugin::Reply(), m_pluginInstanceID); // Blit the plug-in backing store into our own backing store. auto graphicsContext = m_backingStore->createGraphicsContext(); graphicsContext->applyDeviceScaleFactor(contentsScaleFactor()); graphicsContext->setCompositeOperation(CompositeCopy); m_pluginBackingStore->paint(*graphicsContext, contentsScaleFactor(), IntPoint(), pluginBounds()); m_pluginBackingStoreContainsValidData = true; } m_backingStore->paint(*graphicsContext, contentsScaleFactor(), dirtyRect.location(), dirtyRect); if (m_waitingForPaintInResponseToUpdate) { m_waitingForPaintInResponseToUpdate = false; m_connection->connection()->send(Messages::PluginControllerProxy::DidUpdate(), m_pluginInstanceID); } }
static PassRefPtr<WebImage> imageForRect(FrameView* frameView, const IntRect& rect, SnapshotOptions options) { IntSize bitmapSize = rect.size(); float scaleFactor = frameView->frame().page()->deviceScaleFactor(); bitmapSize.scale(scaleFactor); auto snapshot = WebImage::create(bitmapSize, snapshotOptionsToImageOptions(options)); if (!snapshot->bitmap()) return 0; auto graphicsContext = snapshot->bitmap()->createGraphicsContext(); graphicsContext->clearRect(IntRect(IntPoint(), bitmapSize)); graphicsContext->applyDeviceScaleFactor(scaleFactor); graphicsContext->translate(-rect.x(), -rect.y()); FrameView::SelectionInSnapshot shouldPaintSelection = FrameView::IncludeSelection; if (options & SnapshotOptionsExcludeSelectionHighlighting) shouldPaintSelection = FrameView::ExcludeSelection; PaintBehavior paintBehavior = frameView->paintBehavior() | PaintBehaviorFlattenCompositingLayers; if (options & SnapshotOptionsForceBlackText) paintBehavior |= PaintBehaviorForceBlackText; if (options & SnapshotOptionsForceWhiteText) paintBehavior |= PaintBehaviorForceWhiteText; PaintBehavior oldPaintBehavior = frameView->paintBehavior(); frameView->setPaintBehavior(paintBehavior); frameView->paintContentsForSnapshot(*graphicsContext.get(), rect, shouldPaintSelection, FrameView::DocumentCoordinates); frameView->setPaintBehavior(oldPaintBehavior); return snapshot; }
void CoordinatedDrawingArea::display(UpdateInfo& updateInfo) { ASSERT(!m_isPaintingSuspended); ASSERT(!m_layerTreeHost); ASSERT(!m_webPage.size().isEmpty()); m_webPage.layoutIfNeeded(); // The layout may have put the page into accelerated compositing mode. If the LayerTreeHost is // in charge of displaying, we have nothing more to do. if (m_layerTreeHost) return; updateInfo.viewSize = m_webPage.size(); updateInfo.deviceScaleFactor = m_webPage.corePage()->deviceScaleFactor(); IntRect bounds = m_dirtyRegion.bounds(); ASSERT(m_webPage.bounds().contains(bounds)); IntSize bitmapSize = bounds.size(); float deviceScaleFactor = m_webPage.corePage()->deviceScaleFactor(); bitmapSize.scale(deviceScaleFactor); RefPtr<ShareableBitmap> bitmap = ShareableBitmap::createShareable(bitmapSize, ShareableBitmap::SupportsAlpha); if (!bitmap) return; if (!bitmap->createHandle(updateInfo.bitmapHandle)) return; Vector<IntRect> rects = m_dirtyRegion.rects(); if (shouldPaintBoundsRect(bounds, rects)) { rects.clear(); rects.append(bounds); } updateInfo.scrollRect = m_scrollRect; updateInfo.scrollOffset = m_scrollOffset; m_dirtyRegion = Region(); m_scrollRect = IntRect(); m_scrollOffset = IntSize(); auto graphicsContext = bitmap->createGraphicsContext(); graphicsContext->applyDeviceScaleFactor(deviceScaleFactor); updateInfo.updateRectBounds = bounds; graphicsContext->translate(-bounds.x(), -bounds.y()); for (auto& rect : rects) { m_webPage.drawRect(*graphicsContext, rect); updateInfo.updateRects.append(rect); } // Layout can trigger more calls to setNeedsDisplay and we don't want to process them // until the UI process has painted the update, so we stop the timer here. m_displayTimer.stop(); }
void PluginProxy::update(const IntRect& paintedRect) { if (paintedRect == pluginBounds()) m_pluginBackingStoreContainsValidData = true; if (m_backingStore) { // Blit the plug-in backing store into our own backing store. auto graphicsContext = m_backingStore->createGraphicsContext(); graphicsContext->applyDeviceScaleFactor(contentsScaleFactor()); graphicsContext->setCompositeOperation(CompositeCopy); m_pluginBackingStore->paint(*graphicsContext, contentsScaleFactor(), paintedRect.location(), paintedRect); } // Ask the controller to invalidate the rect for us. m_waitingForPaintInResponseToUpdate = true; controller()->invalidate(paintedRect); }
static PassRefPtr<WebImage> imageForRect(FrameView* frameView, const IntRect& rect, SnapshotOptions options) { IntSize bitmapSize = rect.size(); float scaleFactor = frameView->frame().page()->deviceScaleFactor(); bitmapSize.scale(scaleFactor); RefPtr<WebImage> snapshot = WebImage::create(bitmapSize, snapshotOptionsToImageOptions(options)); if (!snapshot->bitmap()) return 0; auto graphicsContext = snapshot->bitmap()->createGraphicsContext(); graphicsContext->clearRect(IntRect(IntPoint(), bitmapSize)); graphicsContext->applyDeviceScaleFactor(scaleFactor); graphicsContext->translate(-rect.x(), -rect.y()); FrameView::SelectionInSnapshot shouldPaintSelection = FrameView::IncludeSelection; if (options & SnapshotOptionsExcludeSelectionHighlighting) shouldPaintSelection = FrameView::ExcludeSelection; frameView->paintContentsForSnapshot(graphicsContext.get(), rect, shouldPaintSelection, FrameView::DocumentCoordinates); return snapshot.release(); }