DragImageRef createDragImageForRange(Frame& frame, Range& range, bool forceBlackText) { frame.document()->updateLayout(); RenderView* view = frame.contentRenderer(); if (!view) return nullptr; // To snapshot the range, temporarily select it and take selection snapshot. Position start = range.startPosition(); Position candidate = start.downstream(); if (candidate.deprecatedNode() && candidate.deprecatedNode()->renderer()) start = candidate; Position end = range.endPosition(); candidate = end.upstream(); if (candidate.deprecatedNode() && candidate.deprecatedNode()->renderer()) end = candidate; if (start.isNull() || end.isNull() || start == end) return nullptr; const ScopedFrameSelectionState selectionState(frame); RenderObject* startRenderer = start.deprecatedNode()->renderer(); RenderObject* endRenderer = end.deprecatedNode()->renderer(); if (!startRenderer || !endRenderer) return nullptr; SnapshotOptions options = forceBlackText ? SnapshotOptionsForceBlackText : SnapshotOptionsNone; view->setSelection(startRenderer, start.deprecatedEditingOffset(), endRenderer, end.deprecatedEditingOffset(), RenderView::RepaintNothing); std::unique_ptr<ImageBuffer> snapshot = snapshotSelection(frame, options); return createDragImageFromSnapshot(std::move(snapshot), nullptr); }
PassRefPtr<ShareableBitmap> WebFrame::createSelectionSnapshot() const { std::unique_ptr<ImageBuffer> snapshot = snapshotSelection(*coreFrame(), WebCore::SnapshotOptionsForceBlackText); if (!snapshot) return nullptr; RefPtr<ShareableBitmap> sharedSnapshot = ShareableBitmap::createShareable(snapshot->internalSize(), ShareableBitmap::SupportsAlpha); if (!sharedSnapshot) return nullptr; // FIXME: We should consider providing a way to use subpixel antialiasing for the snapshot // if we're compositing this image onto a solid color (e.g. the modern find indicator style). auto graphicsContext = sharedSnapshot->createGraphicsContext(); float deviceScaleFactor = coreFrame()->page()->deviceScaleFactor(); graphicsContext->scale(FloatSize(deviceScaleFactor, deviceScaleFactor)); graphicsContext->drawImageBuffer(snapshot.get(), ColorSpaceDeviceRGB, FloatPoint()); return sharedSnapshot.release(); }
DragImageRef createDragImageForSelection(Frame& frame, bool forceBlackText) { SnapshotOptions options = forceBlackText ? SnapshotOptionsForceBlackText : SnapshotOptionsNone; std::unique_ptr<ImageBuffer> snapshot = snapshotSelection(frame, options); return createDragImageFromSnapshot(std::move(snapshot), nullptr); }