Commit 7173b394 authored by mrobinson@webkit.org's avatar mrobinson@webkit.org

2010-09-16 Martin Robinson <mrobinson@igalia.com>

        Reviewed by Xan Lopez.

        [GTK] Implement dissolveDragImageToFraction
        https://bugs.webkit.org/show_bug.cgi?id=45826

        * wtf/gobject/GTypedefs.h: Added forward declarations for GtkWindow and GdkEventExpose.
2010-09-16  Martin Robinson  <mrobinson@igalia.com>

        Reviewed by Xan Lopez.

        [GTK] Implement dissolveDragImageToFraction
        https://bugs.webkit.org/show_bug.cgi?id=45826

        Convert the drag image from a GdkPixbuf to a Cairo surface. Not only
        might this allow code to be shared between Cairo ports it prevents a
        full data copy when the image is not resized and makes the implementation
        of dissolveDragImageToFraction more straight-forward.

        This feature is covered by manual-tests/drag-image.html.

        * page/gtk/DragControllerGtk.cpp:
        (WebCore::DragController::maxDragImageSize): Make the maximum size of the drag
        image a little smaller.
        * platform/DragImage.h: Changed the drag image type to be a cairo_surface_t*.
        * platform/gtk/DragImageGtk.cpp:
        (WebCore::dragImageSize): Reimplemented to reflect new drag image type.
        (WebCore::deleteDragImage): Ditto.
        (WebCore::scaleDragImage): Ditto.
        (WebCore::dissolveDragImageToFraction): Filled the stub of this function.
        (WebCore::createDragImageFromImage): Reimplemented to reflect new drag image type.
        * platform/gtk/GtkVersioning.h: Added definition for gtk_widget_get_realized for older GTK+s.
2010-09-16  Martin Robinson  <mrobinson@igalia.com>

        Reviewed by Xan Lopez.

        [GTK] Implement dissolveDragImageToFraction
        https://bugs.webkit.org/show_bug.cgi?id=45826

        To support full alpha in the drag icon, changed the drag icon to be a
        GtkWindow with an RGBA colormap. Added logic to support painting the drag
        image to this window during the expose event.

        * WebCoreSupport/DragClientGtk.cpp:
        (WebKit::dragIconWindowExposeEventCallback): Added.
        (WebKit::DragClient::DragClient): Initialize the new drag icon window.
        (WebKit::DragClient::~DragClient): Disconnect the expose event signal.
        (WebKit::DragClient::startDrag): Resize the drag icon window the appropriate size and
        if necessary, set its colormap.
        (WebKit::DragClient::dragIconWindowExposeEvent): Added.
        * WebCoreSupport/DragClientGtk.h: Added new member and method declarations.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@67664 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent 1152bf85
2010-09-16 Martin Robinson <mrobinson@igalia.com>
Reviewed by Xan Lopez.
[GTK] Implement dissolveDragImageToFraction
https://bugs.webkit.org/show_bug.cgi?id=45826
* wtf/gobject/GTypedefs.h: Added forward declarations for GtkWindow and GdkEventExpose.
2010-09-16 Eric Uhrhane <ericu@chromium.org>
Reviewed by Jian Li.
......
......@@ -45,6 +45,7 @@ typedef struct _GdkCursor GdkCursor;
typedef struct _GdkDragContext GdkDragContext;
typedef struct _GdkDrawable GdkDrawable;
typedef struct _GdkEventConfigure GdkEventConfigure;
typedef struct _GdkEventExpose GdkEventExpose;
typedef struct _GdkPixbuf GdkPixbuf;
typedef struct _GError GError;
typedef struct _GFile GFile;
......@@ -79,6 +80,7 @@ typedef struct _GtkStyle GtkStyle;
typedef struct _GtkTargetList GtkTargetList;
typedef struct _GtkThemeParts GtkThemeParts;
typedef struct _GtkWidget GtkWidget;
typedef struct _GtkWindow GtkWindow;
#ifdef GTK_API_VERSION_2
typedef struct _GdkRectangle GdkRectangle;
......
2010-09-16 Martin Robinson <mrobinson@igalia.com>
Reviewed by Xan Lopez.
[GTK] Implement dissolveDragImageToFraction
https://bugs.webkit.org/show_bug.cgi?id=45826
Convert the drag image from a GdkPixbuf to a Cairo surface. Not only
might this allow code to be shared between Cairo ports it prevents a
full data copy when the image is not resized and makes the implementation
of dissolveDragImageToFraction more straight-forward.
This feature is covered by manual-tests/drag-image.html.
* page/gtk/DragControllerGtk.cpp:
(WebCore::DragController::maxDragImageSize): Make the maximum size of the drag
image a little smaller.
* platform/DragImage.h: Changed the drag image type to be a cairo_surface_t*.
* platform/gtk/DragImageGtk.cpp:
(WebCore::dragImageSize): Reimplemented to reflect new drag image type.
(WebCore::deleteDragImage): Ditto.
(WebCore::scaleDragImage): Ditto.
(WebCore::dissolveDragImageToFraction): Filled the stub of this function.
(WebCore::createDragImageFromImage): Reimplemented to reflect new drag image type.
* platform/gtk/GtkVersioning.h: Added definition for gtk_widget_get_realized for older GTK+s.
2010-09-15 David Hyatt <hyatt@apple.com>
Reviewed by Darin Adler.
......@@ -58,8 +58,7 @@ DragOperation DragController::dragOperation(DragData* dragData)
const IntSize& DragController::maxDragImageSize()
{
static const IntSize maxDragImageSize(400, 400);
static const IntSize maxDragImageSize(200, 200);
return maxDragImageSize;
}
......
......@@ -48,7 +48,7 @@ class wxDragImage;
#elif PLATFORM(CHROMIUM)
#include "DragImageRef.h"
#elif PLATFORM(GTK)
typedef struct _GdkPixbuf GdkPixbuf;
typedef struct _cairo_surface cairo_surface_t;
#elif PLATFORM(HAIKU)
class BBitmap;
#elif PLATFORM(BREWMP)
......@@ -75,7 +75,7 @@ namespace WebCore {
#elif PLATFORM(WX)
typedef wxDragImage* DragImageRef;
#elif PLATFORM(GTK)
typedef GdkPixbuf* DragImageRef;
typedef cairo_surface_t* DragImageRef;
#elif PLATFORM(HAIKU)
typedef BBitmap* DragImageRef;
#elif PLATFORM(BREWMP)
......
/*
* 2010 Igalia S.L
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
......@@ -19,15 +21,15 @@
#include "CachedImage.h"
#include "Image.h"
#include <gtk/gtk.h>
#include "PlatformRefPtrCairo.h"
#include <cairo.h>
namespace WebCore {
IntSize dragImageSize(DragImageRef image)
{
if (image)
return IntSize(gdk_pixbuf_get_width(image), gdk_pixbuf_get_height(image));
return IntSize(cairo_image_surface_get_width(image), cairo_image_surface_get_height(image));
return IntSize(0, 0);
}
......@@ -35,32 +37,45 @@ IntSize dragImageSize(DragImageRef image)
void deleteDragImage(DragImageRef image)
{
if (image)
g_object_unref(image);
cairo_surface_destroy(image);
}
DragImageRef scaleDragImage(DragImageRef image, FloatSize scale)
{
if (image) {
IntSize imageSize = dragImageSize(image);
GdkPixbuf* scaledImage = gdk_pixbuf_scale_simple(image,
imageSize.width() * scale.width(),
imageSize.height() * scale.height(),
GDK_INTERP_BILINEAR);
deleteDragImage(image);
return scaledImage;
}
if (!image)
return 0;
return 0;
int newWidth = scale.width() * cairo_image_surface_get_width(image);
int newHeight = scale.height() * cairo_image_surface_get_height(image);
cairo_surface_t* scaledSurface = cairo_surface_create_similar(image, CAIRO_CONTENT_COLOR_ALPHA, newWidth, newHeight);
PlatformRefPtr<cairo_t> context = adoptPlatformRef(cairo_create(scaledSurface));
cairo_scale(context.get(), scale.width(), scale.height());
cairo_pattern_set_extend(cairo_get_source(context.get()), CAIRO_EXTEND_PAD);
cairo_pattern_set_filter(cairo_get_source(context.get()), CAIRO_FILTER_BEST);
cairo_set_operator(context.get(), CAIRO_OPERATOR_SOURCE);
cairo_set_source_surface(context.get(), image, 0, 0);
cairo_paint(context.get());
deleteDragImage(image);
return scaledSurface;
}
DragImageRef dissolveDragImageToFraction(DragImageRef image, float)
DragImageRef dissolveDragImageToFraction(DragImageRef image, float fraction)
{
if (!image)
return 0;
PlatformRefPtr<cairo_t> context = adoptPlatformRef(cairo_create(image));
cairo_set_operator(context.get(), CAIRO_OPERATOR_DEST_IN);
cairo_set_source_rgba(context.get(), 0, 0, 0, fraction);
cairo_paint(context.get());
return image;
}
DragImageRef createDragImageFromImage(Image* image)
{
return image->getGdkPixbuf();
return cairo_surface_reference(image->nativeImageForCurrentFrame());
}
DragImageRef createDragImageIconForCachedImage(CachedImage*)
......
......@@ -42,6 +42,7 @@ G_BEGIN_DECLS
#endif // GTK_CHECK_VERSION(2, 21, 2)
#if !GTK_CHECK_VERSION(2, 20, 0)
#define gtk_widget_get_realized(widget) GTK_WIDGET_REALIZED(widget)
#define gtk_widget_set_realized(widget, TRUE) GTK_WIDGET_SET_FLAGS((widget), GTK_REALIZED)
#define gtk_range_get_min_slider_size(range) (range)->min_slider_size
#endif // GTK_CHECK_VERSION(2, 20, 0)
......
2010-09-16 Martin Robinson <mrobinson@igalia.com>
Reviewed by Xan Lopez.
[GTK] Implement dissolveDragImageToFraction
https://bugs.webkit.org/show_bug.cgi?id=45826
To support full alpha in the drag icon, changed the drag icon to be a
GtkWindow with an RGBA colormap. Added logic to support painting the drag
image to this window during the expose event.
* WebCoreSupport/DragClientGtk.cpp:
(WebKit::dragIconWindowExposeEventCallback): Added.
(WebKit::DragClient::DragClient): Initialize the new drag icon window.
(WebKit::DragClient::~DragClient): Disconnect the expose event signal.
(WebKit::DragClient::startDrag): Resize the drag icon window the appropriate size and
if necessary, set its colormap.
(WebKit::DragClient::dragIconWindowExposeEvent): Added.
* WebCoreSupport/DragClientGtk.h: Added new member and method declarations.
2010-09-14 Philippe Normand <pnormand@igalia.com>
Reviewed by Eric Carlson and Martin Robinson.
......
......@@ -34,16 +34,30 @@
#include "RenderObject.h"
#include "webkitprivate.h"
#include "webkitwebview.h"
#include <gdk/gdk.h>
#include <gtk/gtk.h>
using namespace WebCore;
namespace WebKit {
static gboolean dragIconWindowExposeEventCallback(GtkWidget* widget, GdkEventExpose* event, DragClient* client)
{
client->dragIconWindowExposeEvent(widget, event);
return TRUE;
}
DragClient::DragClient(WebKitWebView* webView)
: m_webView(webView)
, m_startPos(0, 0)
, m_dragIconWindow(gtk_window_new(GTK_WINDOW_POPUP))
{
g_signal_connect(m_dragIconWindow.get(), "expose-event", G_CALLBACK(dragIconWindowExposeEventCallback), this);
}
DragClient::~DragClient()
{
g_signal_handlers_disconnect_by_func(m_dragIconWindow.get(), (gpointer) dragIconWindowExposeEventCallback, this);
}
void DragClient::willPerformDragDestinationAction(DragDestinationAction, DragData*)
......@@ -83,12 +97,38 @@ void DragClient::startDrag(DragImageRef image, const IntPoint& dragImageOrigin,
// happen if a drag is followed very quickly by another click (like in the DRT).
webView->priv->previousClickTime = 0;
if (image)
gtk_drag_set_icon_pixbuf(context, image, eventPos.x() - dragImageOrigin.x(), eventPos.y() - dragImageOrigin.y());
else
// This strategy originally comes from Chromium:
// src/chrome/browser/gtk/tab_contents_drag_source.cc
if (image) {
m_dragImage = image;
IntSize imageSize(cairo_image_surface_get_width(image), cairo_image_surface_get_height(image));
gtk_window_resize(GTK_WINDOW(m_dragIconWindow.get()), imageSize.width(), imageSize.height());
if (!gtk_widget_get_realized(m_dragIconWindow.get())) {
GdkScreen* screen = gtk_widget_get_screen(m_dragIconWindow.get());
GdkColormap* rgba = gdk_screen_get_rgba_colormap(screen);
if (rgba)
gtk_widget_set_colormap(m_dragIconWindow.get(), rgba);
}
IntSize origin = eventPos - dragImageOrigin;
gtk_drag_set_icon_widget(context, m_dragIconWindow.get(),
origin.width(), origin.height());
} else
gtk_drag_set_icon_default(context);
}
void DragClient::dragIconWindowExposeEvent(GtkWidget* widget, GdkEventExpose* event)
{
PlatformRefPtr<cairo_t> context = adoptPlatformRef(gdk_cairo_create(event->window));
cairo_rectangle(context.get(), 0, 0,
cairo_image_surface_get_width(m_dragImage.get()),
cairo_image_surface_get_height(m_dragImage.get()));
cairo_set_operator(context.get(), CAIRO_OPERATOR_SOURCE);
cairo_set_source_surface(context.get(), m_dragImage.get(), 0, 0);
cairo_fill(context.get());
}
DragImageRef DragClient::createDragImageForLink(KURL&, const String&, Frame*)
{
notImplemented();
......
......@@ -31,6 +31,8 @@
#define DragClientGtk_h
#include "DragClient.h"
#include "GRefPtr.h"
#include "PlatformRefPtrCairo.h"
typedef struct _WebKitWebView WebKitWebView;
......@@ -39,6 +41,7 @@ namespace WebKit {
class DragClient : public WebCore::DragClient {
public:
DragClient(WebKitWebView*);
~DragClient();
virtual void willPerformDragDestinationAction(WebCore::DragDestinationAction, WebCore::DragData*);
virtual void willPerformDragSourceAction(WebCore::DragSourceAction, const WebCore::IntPoint&, WebCore::Clipboard*);
......@@ -51,9 +54,13 @@ namespace WebKit {
virtual void dragControllerDestroyed();
void dragIconWindowExposeEvent(GtkWidget*, GdkEventExpose*);
private:
WebKitWebView* m_webView;
WebCore::IntPoint m_startPos;
PlatformRefPtr<GtkWidget> m_dragIconWindow;
PlatformRefPtr<cairo_surface_t> m_dragImage;
};
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment