Пример #1
0
DragImageRef ClipboardGtk::createDragImage(IntPoint& location) const
{
    location = m_dragLoc;
    if (!m_dragImage)
        return 0;

    return createDragImageFromImage(m_dragImage->image());
}
DragImageRef ClipboardGtk::createDragImage(IntPoint& location) const
{
    location = m_dragLoc;

    if (m_dragImage)
        return createDragImageFromImage(m_dragImage->image());
    if (m_dragImageElement && m_frame)
        return m_frame->nodeImage(m_dragImageElement.get());

    return 0; // We do not have enough information to create a drag image, use the default icon.
}
Пример #3
0
DragImageRef DataTransfer::createDragImage(IntPoint& location) const
{
    location = m_dragLocation;

    if (m_dragImage)
        return createDragImageFromImage(m_dragImage->image(), ImageOrientationDescription());

    if (m_dragImageElement) {
        if (Frame* frame = m_dragImageElement->document().frame())
            return createDragImageForNode(*frame, *m_dragImageElement);
    }

    // We do not have enough information to create a drag image, use the default icon.
    return nullptr;
}
Пример #4
0
DragImageRef Clipboard::createDragImage(IntPoint& dragLocation) const
{
    HBITMAP result = 0;
    if (m_dragImage) {
#if USE(CAIRO) || USE(CG)
        result = createDragImageFromImage(m_dragImage->image());        
        dragLocation = m_dragLoc;
#else
        notImplemented();
#endif
    } else if (m_dragImageElement) {
        Node* node = m_dragImageElement.get();
        result = node->document()->frame()->nodeImage(node);
        dragLocation = m_dragLoc;
    }
    return result;
}
Пример #5
0
void DragController::doImageDrag(Element* element, const IntPoint& dragOrigin, const IntRect& rect, Clipboard* clipboard, Frame* frame, IntPoint& dragImageOffset)
{
    IntPoint mouseDownPoint = dragOrigin;
    DragImageRef dragImage;
    IntPoint origin;

    Image* image = getImage(element);
    if (image && image->size().height() * image->size().width() <= MaxOriginalImageArea
        && (dragImage = createDragImageFromImage(image))) {
        IntSize originalSize = rect.size();
        origin = rect.location();

        dragImage = fitDragImageToMaxSize(dragImage, rect.size(), maxDragImageSize());
        dragImage = dissolveDragImageToFraction(dragImage, DragImageAlpha);
        IntSize newSize = dragImageSize(dragImage);

        // Properly orient the drag image and orient it differently if it's smaller than the original
        float scale = newSize.width() / (float)originalSize.width();
        float dx = origin.x() - mouseDownPoint.x();
        dx *= scale;
        origin.setX((int)(dx + 0.5));
#if PLATFORM(MAC)
        //Compensate for accursed flipped coordinates in cocoa
        origin.setY(origin.y() + originalSize.height());
#endif
        float dy = origin.y() - mouseDownPoint.y();
        dy *= scale;
        origin.setY((int)(dy + 0.5));
    } else {
        dragImage = createDragImageIconForCachedImage(getCachedImage(element));
        if (dragImage)
            origin = IntPoint(DragIconRightInset - dragImageSize(dragImage).width(), DragIconBottomInset);
    }

    dragImageOffset.setX(mouseDownPoint.x() + origin.x());
    dragImageOffset.setY(mouseDownPoint.y() + origin.y());
    doSystemDrag(dragImage, dragImageOffset, dragOrigin, clipboard, frame, false);

    deleteDragImage(dragImage);
}
Пример #6
0
static DragImageRef createDragImageFromSnapshot(std::unique_ptr<ImageBuffer> snapshot, Node* node)
{
    if (!snapshot)
        return nullptr;

    ImageOrientationDescription orientation;
#if ENABLE(CSS_IMAGE_ORIENTATION)
    if (node) {
        RenderObject* renderer = node->renderer();
        if (!renderer)
            return nullptr;

        orientation.setRespectImageOrientation(renderer->shouldRespectImageOrientation());
        orientation.setImageOrientationEnum(renderer->style().imageOrientation());
    }
#else
    UNUSED_PARAM(node);
#endif
    RefPtr<Image> image = snapshot->copyImage(ImageBuffer::fastCopyImageMode());
    if (!image)
        return nullptr;
    return createDragImageFromImage(image.get(), orientation);
}
Пример #7
0
DragImageRef Frame::dragImageForSelection()
{
    if (!selection()->isRange())
        return 0;

    m_doc->updateLayout();

    IntRect paintingRect = enclosingIntRect(selection()->bounds());
    OwnPtr<ImageBuffer> buffer(ImageBuffer::create(paintingRect.size()));
    if (!buffer)
        return 0;

    GraphicsContext* context = buffer->context();
    context->translate(-paintingRect.x(), -paintingRect.y());
    context->clip(FloatRect(0, 0, paintingRect.right(), paintingRect.bottom()));

    PaintBehavior previousPaintBehavior = m_view->paintBehavior();
    m_view->setPaintBehavior(PaintBehaviorSelectionOnly);
    m_view->paintContents(context, paintingRect);
    m_view->setPaintBehavior(previousPaintBehavior);

    RefPtr<Image> image = buffer->copyImage();
    return createDragImageFromImage(image.get());
}