WebBitmap* Frame::selectionImage(bool forceWhiteText) const { m_view->setPaintBehavior(PaintBehaviorSelectionOnly | (forceWhiteText ? 0 : PaintBehaviorForceBlackText)); WebBitmap* result = imageFromRect(selectionBounds(true)); m_view->setPaintBehavior(PaintBehaviorNormal); return result; }
HBITMAP imageFromSelection(Frame* frame, bool forceBlackText) { frame->document()->updateLayout(); frame->view()->setPaintBehavior(PaintBehaviorSelectionOnly | (forceBlackText ? PaintBehaviorForceBlackText : 0)); FloatRect fr = frame->selection()->bounds(); IntRect ir(static_cast<int>(fr.x()), static_cast<int>(fr.y()), static_cast<int>(fr.width()), static_cast<int>(fr.height())); HBITMAP image = imageFromRect(frame, ir); frame->view()->setPaintBehavior(PaintBehaviorNormal); return image; }
DragImageRef Frame::nodeImage(Node* node) { RenderObject* renderer = node->renderer(); if (!renderer) return 0; IntRect topLevelRect; IntRect paintingRect = renderer->paintingRootRect(topLevelRect); document()->updateLayout(); m_view->setNodeToDraw(node); // invoke special sub-tree drawing mode HBITMAP result = imageFromRect(this, paintingRect); m_view->setNodeToDraw(0); return result; }
WebBitmap* Frame::snapshotDragImage(Node* node, IntRect& imageRect, IntRect& elementRect) const { RenderObject* renderer = node->renderer(); if (!renderer) return NULL; renderer->updateDragState(true); // mark dragged nodes (so they pick up the right CSS) m_doc->updateLayout(); // forces style recalc - needed since changing the drag state might // imply new styles, plus JS could have changed other things IntRect topLevelRect; IntRect paintingRect = renderer->paintingRootRect(topLevelRect); m_view->setNodeToDraw(node); // invoke special sub-tree drawing mode WebBitmap* result = imageFromRect(paintingRect); renderer->updateDragState(false); m_doc->updateLayout(); m_view->setNodeToDraw(0); elementRect = topLevelRect; imageRect = paintingRect; return result; }