From ff90543c1cbf0d0297cccfceb1e884c4c3ea9a2a Mon Sep 17 00:00:00 2001 From: "eric@webkit.org" Date: Wed, 7 Apr 2010 01:02:11 +0000 Subject: [PATCH] 2010-04-06 Nicolas Weber Reviewed by Dimitri Glazkov. Implement DragImage functionality for chromium/mac. https://bugs.webkit.org/show_bug.cgi?id=37069 * page/chromium/DragControllerChromium.cpp: (WebCore::DragController::maxDragImageSize): Use a max size of 400x400 on OS X. * platform/chromium/DragImageChromiumMac.cpp: (WebCore::dragImageSize): Implement. (WebCore::deleteDragImage): Implement. (WebCore::scaleDragImage): Implement. (WebCore::dissolveDragImageToFraction): Implement. (WebCore::createDragImageFromImage): Implement. * platform/chromium/DragImageRef.h: Use CGImageRefs as DragImageRef on OS X. 2010-04-06 Nicolas Weber Reviewed by Dimitri Glazkov. Use drag images on OS X as well. https://bugs.webkit.org/show_bug.cgi?id=37069 * src/DragClientImpl.cpp: (WebKit::DragClientImpl::startDrag): git-svn-id: http://svn.webkit.org/repository/webkit/trunk@57180 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- WebCore/ChangeLog | 19 +++++++ .../page/chromium/DragControllerChromium.cpp | 5 ++ .../chromium/DragImageChromiumMac.cpp | 56 +++++++++++++++---- WebCore/platform/chromium/DragImageRef.h | 7 ++- WebKit/chromium/ChangeLog | 10 ++++ WebKit/chromium/src/DragClientImpl.cpp | 11 ++-- 6 files changed, 88 insertions(+), 20 deletions(-) diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog index 6e257f4649e..5facfa09df5 100644 --- a/WebCore/ChangeLog +++ b/WebCore/ChangeLog @@ -1,3 +1,22 @@ +2010-04-06 Nicolas Weber + + Reviewed by Dimitri Glazkov. + + Implement DragImage functionality for chromium/mac. + https://bugs.webkit.org/show_bug.cgi?id=37069 + + * page/chromium/DragControllerChromium.cpp: + (WebCore::DragController::maxDragImageSize): + Use a max size of 400x400 on OS X. + * platform/chromium/DragImageChromiumMac.cpp: + (WebCore::dragImageSize): Implement. + (WebCore::deleteDragImage): Implement. + (WebCore::scaleDragImage): Implement. + (WebCore::dissolveDragImageToFraction): Implement. + (WebCore::createDragImageFromImage): Implement. + * platform/chromium/DragImageRef.h: + Use CGImageRefs as DragImageRef on OS X. + 2010-04-06 Chris Evans Reviewed by Adam Barth. diff --git a/WebCore/page/chromium/DragControllerChromium.cpp b/WebCore/page/chromium/DragControllerChromium.cpp index 7b0958d25ec..de53d19399f 100644 --- a/WebCore/page/chromium/DragControllerChromium.cpp +++ b/WebCore/page/chromium/DragControllerChromium.cpp @@ -66,7 +66,12 @@ bool DragController::isCopyKeyDown() const IntSize& DragController::maxDragImageSize() { +#if OS(DARWIN) + // Match Safari's drag image size. + static const IntSize maxDragImageSize(400, 400); +#else static const IntSize maxDragImageSize(200, 200); +#endif return maxDragImageSize; } diff --git a/WebCore/platform/chromium/DragImageChromiumMac.cpp b/WebCore/platform/chromium/DragImageChromiumMac.cpp index dd2dfc30873..b7917d27d68 100644 --- a/WebCore/platform/chromium/DragImageChromiumMac.cpp +++ b/WebCore/platform/chromium/DragImageChromiumMac.cpp @@ -31,37 +31,71 @@ #include "config.h" #include "DragImage.h" +#include "Image.h" #include "NotImplemented.h" +#include +#include + namespace WebCore { IntSize dragImageSize(DragImageRef image) { - notImplemented(); - return IntSize(); + if (!image) + return IntSize(); + return IntSize(CGImageGetWidth(image), CGImageGetHeight(image)); } void deleteDragImage(DragImageRef image) { - notImplemented(); + CGImageRelease(image); } DragImageRef scaleDragImage(DragImageRef image, FloatSize scale) { - notImplemented(); - return 0; + if (!image) + return 0; + size_t width = roundf(CGImageGetWidth(image) * scale.width()); + size_t height = roundf(CGImageGetHeight(image) * scale.height()); + CGContextRef context = CGBitmapContextCreate(0, width, height, 8, width * 4, CGImageGetColorSpace(image), kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host); + if (!context) + return 0; + CGContextDrawImage(context, CGRectMake(0, 0, width, height), image); + CGImageRelease(image); + + CGImageRef scaledImage = CGBitmapContextCreateImage(context); + CGContextRelease(context); + return scaledImage; } -DragImageRef dissolveDragImageToFraction(DragImageRef image, float) +DragImageRef dissolveDragImageToFraction(DragImageRef image, float delta) { - notImplemented(); - return image; + if (!image) + return 0; + size_t width = CGImageGetWidth(image); + size_t height = CGImageGetHeight(image); + CGContextRef context = CGBitmapContextCreate(0, width, height, 8, width * 4, CGImageGetColorSpace(image), kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host); + if (!context) + return 0; + // From CGContext.h: + // The Porter-Duff "source over" mode is called `kCGBlendModeNormal': + // R = S + D*(1 - Sa) + // This is the same as NSCompositeSourceOver, which is what -[NSImage dissolveToPoint:fraction:] uses. + CGContextSetAlpha(context, delta); + CGContextSetBlendMode(context, kCGBlendModeNormal); + CGContextDrawImage(context, CGRectMake(0, 0, width, height), image); + CGImageRelease(image); + + CGImageRef dissolvedImage = CGBitmapContextCreateImage(context); + CGContextRelease(context); + return dissolvedImage; } -DragImageRef createDragImageFromImage(Image* img) +DragImageRef createDragImageFromImage(Image* image) { - notImplemented(); - return 0; + if (!image) + return 0; + return CGImageCreateCopy(image->nativeImageForCurrentFrame()); } DragImageRef createDragImageIconForCachedImage(CachedImage*) diff --git a/WebCore/platform/chromium/DragImageRef.h b/WebCore/platform/chromium/DragImageRef.h index 52f5e1016d2..a2d7f8d6979 100644 --- a/WebCore/platform/chromium/DragImageRef.h +++ b/WebCore/platform/chromium/DragImageRef.h @@ -29,13 +29,16 @@ #ifndef DragImageRef_h #define DragImageRef_h +#if OS(DARWIN) +typedef struct CGImage* CGImageRef; +#else class SkBitmap; +#endif namespace WebCore { #if OS(DARWIN) -// FIXME: not implemented. -typedef void* DragImageRef; +typedef CGImageRef DragImageRef; #else typedef SkBitmap* DragImageRef; #endif diff --git a/WebKit/chromium/ChangeLog b/WebKit/chromium/ChangeLog index 4cfea3182af..85021f57b1d 100644 --- a/WebKit/chromium/ChangeLog +++ b/WebKit/chromium/ChangeLog @@ -1,3 +1,13 @@ +2010-04-06 Nicolas Weber + + Reviewed by Dimitri Glazkov. + + Use drag images on OS X as well. + https://bugs.webkit.org/show_bug.cgi?id=37069 + + * src/DragClientImpl.cpp: + (WebKit::DragClientImpl::startDrag): + 2010-04-06 Vangelis Kokkevis Reviewed by Dimitri Glazkov. diff --git a/WebKit/chromium/src/DragClientImpl.cpp b/WebKit/chromium/src/DragClientImpl.cpp index 79292504d1c..987440162f6 100644 --- a/WebKit/chromium/src/DragClientImpl.cpp +++ b/WebKit/chromium/src/DragClientImpl.cpp @@ -86,17 +86,14 @@ void DragClientImpl::startDrag(DragImageRef dragImage, IntSize offsetSize(eventPos - dragImageOrigin); WebPoint offsetPoint(offsetSize.width(), offsetSize.height()); -#if WEBKIT_USING_SKIA m_webView->startDragging( dragData, static_cast(dragOperationMask), - dragImage ? WebImage(*dragImage) : WebImage(), offsetPoint); +#if WEBKIT_USING_SKIA + dragImage ? WebImage(*dragImage) : WebImage(), #else - // FIXME: When DragImageRef is implemented for CG, we can probably just remove - // this #if fork. For now, pass an empty image. - m_webView->startDragging( - dragData, static_cast(dragOperationMask), - WebImage(), WebPoint()); + dragImage ? WebImage(dragImage) : WebImage(), #endif + offsetPoint); } DragImageRef DragClientImpl::createDragImageForLink(KURL&, const String& label, Frame*) -- GitLab