[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26519] trunk/blender/intern/ghost: Cocoa/ DND : added bitmap data type handling in drag'n'drop operations

Damien Plisson damien.plisson at yahoo.fr
Mon Feb 1 18:33:41 CET 2010


Revision: 26519
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26519
Author:   damien78
Date:     2010-02-01 18:33:41 +0100 (Mon, 01 Feb 2010)

Log Message:
-----------
Cocoa/DND : added bitmap data type handling in drag'n'drop operations

Conversion of OS type to ImBuf is done inside ghost.

Modified Paths:
--------------
    trunk/blender/intern/ghost/CMakeLists.txt
    trunk/blender/intern/ghost/SConscript
    trunk/blender/intern/ghost/intern/GHOST_EventDragnDrop.h
    trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.mm
    trunk/blender/intern/ghost/intern/GHOST_WindowCocoa.mm
    trunk/blender/intern/ghost/intern/Makefile

Modified: trunk/blender/intern/ghost/CMakeLists.txt
===================================================================
--- trunk/blender/intern/ghost/CMakeLists.txt	2010-02-01 17:17:50 UTC (rev 26518)
+++ trunk/blender/intern/ghost/CMakeLists.txt	2010-02-01 17:33:41 UTC (rev 26519)
@@ -24,7 +24,7 @@
 #
 # ***** END GPL LICENSE BLOCK *****
 
-SET(INC . ../string ../../extern/glew/include)
+SET(INC . ../string ../../extern/glew/include ../../source/blender/imbuf ../../source/blender/makesdna)
 
 FILE(GLOB SRC intern/*.cpp intern/*.mm)
 

Modified: trunk/blender/intern/ghost/SConscript
===================================================================
--- trunk/blender/intern/ghost/SConscript	2010-02-01 17:17:50 UTC (rev 26518)
+++ trunk/blender/intern/ghost/SConscript	2010-02-01 17:33:41 UTC (rev 26519)
@@ -57,7 +57,7 @@
 if env['BF_GHOST_DEBUG']:
 	defs.append('BF_GHOST_DEBUG')
 	
-incs = '. ../string #extern/glew/include ' + env['BF_OPENGL_INC']
+incs = '. ../string #extern/glew/include #source/blender/imbuf #source/blender/makesdna' + env['BF_OPENGL_INC']
 if window_system in ('win32-vc', 'win32-mingw', 'cygwin', 'linuxcross', 'win64-vc'):
 	incs = env['BF_WINTAB_INC'] + ' ' + incs
 env.BlenderLib ('bf_ghost', sources, Split(incs), defines=defs, libtype=['intern','player'], priority = [40,15] ) 

Modified: trunk/blender/intern/ghost/intern/GHOST_EventDragnDrop.h
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_EventDragnDrop.h	2010-02-01 17:17:50 UTC (rev 26518)
+++ trunk/blender/intern/ghost/intern/GHOST_EventDragnDrop.h	2010-02-01 17:33:41 UTC (rev 26519)
@@ -30,6 +30,10 @@
 #define _GHOST_EVENT_DRAGNDROP_H_
 
 #include "GHOST_Event.h"
+extern "C" {
+#include "IMB_imbuf.h"
+#include "IMB_imbuf_types.h"
+};
 
 /**
  * Drag & drop event
@@ -55,7 +59,7 @@
  * <br>Currently supported object types :
  * <li>UTF-8 string
  * <li>array of strings representing filenames (GHOST_TStringArray)
- * <li>bitmap image
+ * <li>bitmap ImBuf
  */
 class GHOST_EventDragnDrop : public GHOST_Event
 {
@@ -89,7 +93,7 @@
 		
 		switch (m_dragnDropEventData.dataType) {
 			case GHOST_kDragnDropTypeBitmap:
-				//Not currently implemented
+				IMB_freeImBuf((ImBuf*)m_dragnDropEventData.data);
 				break;
 			case GHOST_kDragnDropTypeFilenames:
 			{

Modified: trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.mm
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.mm	2010-02-01 17:17:50 UTC (rev 26518)
+++ trunk/blender/intern/ghost/intern/GHOST_SystemCocoa.mm	2010-02-01 17:33:41 UTC (rev 26519)
@@ -1050,10 +1050,6 @@
 			if (!data) return GHOST_kFailure;
 			
 			switch (draggedObjectType) {
-				case GHOST_kDragnDropTypeBitmap:
-					//TODO: implement bitmap conversion to a blender friendly format
-					return GHOST_kFailure;
-					break;
 				case GHOST_kDragnDropTypeFilenames:
 					droppedArray = (NSArray*)data;
 					
@@ -1102,7 +1098,125 @@
 					
 					eventData = (GHOST_TEventDataPtr) temp_buff;
 					break;
+				
+				case GHOST_kDragnDropTypeBitmap:
+				{
+					NSImage *droppedImg = (NSImage*)data;
+					NSSize imgSize = [droppedImg size];
+					ImBuf *ibuf = NULL;
+					GHOST_TUns8 *rasterRGB = NULL;
+					GHOST_TUns8 *rasterRGBA = NULL;
+					GHOST_TUns8 *toIBuf = NULL;
+					int x, y, to_i, from_i;
+					NSBitmapImageRep *blBitmapFormatImageRGB,*blBitmapFormatImageRGBA,*bitmapImage=nil;
+					NSEnumerator *enumerator;
+					NSImageRep *representation;
 					
+					ibuf = IMB_allocImBuf (imgSize.width , imgSize.height, 32, IB_rect, 0);
+					if (!ibuf) {
+						[droppedImg release];
+						return GHOST_kFailure;
+					}
+					
+					/*Get the bitmap of the image*/
+					enumerator = [[droppedImg representations] objectEnumerator];
+					while ((representation = [enumerator nextObject])) {
+						if ([representation isKindOfClass:[NSBitmapImageRep class]]) {
+							bitmapImage = (NSBitmapImageRep *)representation;
+							break;
+						}
+					}
+					if (bitmapImage == nil) return GHOST_kFailure;
+					
+					if (([bitmapImage bitsPerPixel] == 32) && (([bitmapImage bitmapFormat] & 0x5) == 0)
+						&& ![bitmapImage isPlanar]) {
+						/* Try a fast copy if the image is a meshed RGBA 32bit bitmap*/
+						toIBuf = (GHOST_TUns8*)ibuf->rect;
+						rasterRGB = (GHOST_TUns8*)[bitmapImage bitmapData];
+						for (y = 0; y < imgSize.height; y++) {
+							to_i = (imgSize.height-y-1)*imgSize.width;
+							from_i = y*imgSize.width;
+							memcpy(toIBuf+4*to_i, rasterRGB+4*from_i, 4*imgSize.width);
+						}
+					}
+					else {
+						/* Tell cocoa image resolution is same as current system one */
+						[bitmapImage setSize:imgSize];
+						
+						/* Convert the image in a RGBA 32bit format */
+						/* As Core Graphics does not support contextes with non premutliplied alpha,
+						 we need to get alpha key values in a separate batch */
+						
+						/* First get RGB values w/o Alpha to avoid pre-multiplication, 32bit but last byte is unused */
+						blBitmapFormatImageRGB = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
+																						 pixelsWide:imgSize.width 
+																						 pixelsHigh:imgSize.height
+																					  bitsPerSample:8 samplesPerPixel:3 hasAlpha:NO isPlanar:NO
+																					 colorSpaceName:NSDeviceRGBColorSpace 
+																					   bitmapFormat:(NSBitmapFormat)0
+																						bytesPerRow:4*imgSize.width
+																					   bitsPerPixel:32/*RGB format padded to 32bits*/];
+						
+						[NSGraphicsContext saveGraphicsState];
+						[NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithBitmapImageRep:blBitmapFormatImageRGB]];
+						[bitmapImage draw];
+						[NSGraphicsContext restoreGraphicsState];
+						
+						rasterRGB = (GHOST_TUns8*)[blBitmapFormatImageRGB bitmapData];
+						if (rasterRGB == NULL) {
+							[bitmapImage release];
+							[blBitmapFormatImageRGB release];
+							[droppedImg release];
+							return GHOST_kFailure;
+						}
+						
+						/* Then get Alpha values by getting the RGBA image (that is premultiplied btw) */
+						blBitmapFormatImageRGBA = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
+																						  pixelsWide:imgSize.width
+																						  pixelsHigh:imgSize.height
+																					   bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES isPlanar:NO
+																					  colorSpaceName:NSDeviceRGBColorSpace
+																						bitmapFormat:(NSBitmapFormat)0
+																						 bytesPerRow:4*imgSize.width
+																						bitsPerPixel:32/* RGBA */];
+						
+						[NSGraphicsContext saveGraphicsState];
+						[NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithBitmapImageRep:blBitmapFormatImageRGBA]];
+						[bitmapImage draw];
+						[NSGraphicsContext restoreGraphicsState];
+						
+						rasterRGBA = (GHOST_TUns8*)[blBitmapFormatImageRGBA bitmapData];
+						if (rasterRGBA == NULL) {
+							[bitmapImage release];
+							[blBitmapFormatImageRGB release];
+							[blBitmapFormatImageRGBA release];
+							[droppedImg release];
+							return GHOST_kFailure;
+						}
+						
+						/*Copy the image to ibuf, flipping it vertically*/
+						toIBuf = (GHOST_TUns8*)ibuf->rect;
+						for (y = 0; y < imgSize.height; y++) {
+							for (x = 0; x < imgSize.width; x++) {
+								to_i = (imgSize.height-y-1)*imgSize.width + x;
+								from_i = y*imgSize.width + x;
+								
+								toIBuf[4*to_i] = rasterRGB[4*from_i]; /* R */
+								toIBuf[4*to_i+1] = rasterRGB[4*from_i+1]; /* G */
+								toIBuf[4*to_i+2] = rasterRGB[4*from_i+2]; /* B */
+								toIBuf[4*to_i+3] = rasterRGBA[4*from_i+3]; /* A */
+							}
+						}
+						
+						[blBitmapFormatImageRGB release];
+						[blBitmapFormatImageRGBA release];
+						[droppedImg release];
+					}
+					
+					eventData = (GHOST_TEventDataPtr) ibuf;
+				}
+					break;
+					
 				default:
 					return GHOST_kFailure;
 					break;

Modified: trunk/blender/intern/ghost/intern/GHOST_WindowCocoa.mm
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_WindowCocoa.mm	2010-02-01 17:17:50 UTC (rev 26518)
+++ trunk/blender/intern/ghost/intern/GHOST_WindowCocoa.mm	2010-02-01 17:33:41 UTC (rev 26519)
@@ -203,11 +203,16 @@
 {
 	NSPoint mouseLocation = [sender draggingLocation];
 	NSPasteboard *draggingPBoard = [sender draggingPasteboard];
+	NSImage *droppedImg;
 	id data;
 	
 	switch (m_draggedObjectType) {
 		case GHOST_kDragnDropTypeBitmap:
-			data = [draggingPBoard dataForType:NSTIFFPboardType];
+			if([NSImage canInitWithPasteboard:draggingPBoard]) {
+				droppedImg = [[NSImage alloc]initWithPasteboard:draggingPBoard];
+				data = droppedImg; //[draggingPBoard dataForType:NSTIFFPboardType];
+			}
+			else return NO;
 			break;
 		case GHOST_kDragnDropTypeFilenames:
 			data = [draggingPBoard propertyListForType:NSFilenamesPboardType];

Modified: trunk/blender/intern/ghost/intern/Makefile
===================================================================
--- trunk/blender/intern/ghost/intern/Makefile	2010-02-01 17:17:50 UTC (rev 26518)
+++ trunk/blender/intern/ghost/intern/Makefile	2010-02-01 17:33:41 UTC (rev 26519)
@@ -69,4 +69,6 @@
 CPPFLAGS += -I$(NAN_MEMUTIL)/include
 CPPFLAGS += -I..
 CPPFLAGS += -I$(OPENGL_HEADERS)
+CPPFLAGS += -I../../../source/blender/imbuf
+CPPFLAGS += -I../../../source/blender/makesdna
 





More information about the Bf-blender-cvs mailing list