diff options
Diffstat (limited to 'macosx')
-rw-r--r-- | macosx/tkMacOSXDraw.c | 22 | ||||
-rw-r--r-- | macosx/tkMacOSXXStubs.c | 86 |
2 files changed, 79 insertions, 29 deletions
diff --git a/macosx/tkMacOSXDraw.c b/macosx/tkMacOSXDraw.c index 13d746c..c42e84a 100644 --- a/macosx/tkMacOSXDraw.c +++ b/macosx/tkMacOSXDraw.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacOSXDraw.c,v 1.2.2.1 2004/02/16 00:42:34 wolfsuit Exp $ + * RCS: @(#) $Id: tkMacOSXDraw.c,v 1.2.2.2 2004/02/23 10:49:29 das Exp $ */ #include "tkInt.h" @@ -347,13 +347,15 @@ TkPutImage( GDHandle saveDevice; GWorldPtr destPort; const BitMap * destBits; + MacDrawable *dstDraw = (MacDrawable *) d; int i, j; BitMap bitmap; char *newData = NULL; Rect destRect, srcRect; destPort = TkMacOSXGetDrawablePort(d); - SetRect(&destRect, dest_x, dest_y, dest_x + width, dest_y + height); + SetRect(&destRect, dstDraw->xOff + dest_x, dstDraw->yOff + dest_y, + dstDraw->xOff + dest_x + width, dstDraw->yOff + dest_y + height); SetRect(&srcRect, src_x, src_y, src_x + width, src_y + height); display->request++; @@ -362,7 +364,13 @@ TkPutImage( TkMacOSXSetUpClippingRgn(d); - if (image->depth == 1) { + if (image->obdata) { + /* Image from XGetImage, copy from containing GWorld directly */ + GWorldPtr srcPort = TkMacOSXGetDrawablePort((Drawable)image->obdata); + CopyBits(GetPortBitMapForCopyBits(srcPort), + GetPortBitMapForCopyBits (destPort), + &srcRect, &destRect, srcCopy, NULL); + } else if (image->depth == 1) { /* * This code assumes a pixel depth of 1 @@ -400,15 +408,15 @@ TkPutImage( &srcRect, &destRect, srcCopy, NULL); } else { - /* Color image */ - PixMap pixmap; + /* Color image */ + PixMap pixmap; pixmap.bounds.left = 0; pixmap.bounds.top = 0; pixmap.bounds.right = (short) image->width; pixmap.bounds.bottom = (short) image->height; pixmap.pixelType = RGBDirect; - pixmap.pmVersion = 4; /* 32bit clean */ + pixmap.pmVersion = baseAddr32; /* 32bit clean */ pixmap.packType = 0; pixmap.packSize = 0; pixmap.hRes = 0x00480000; @@ -416,7 +424,7 @@ TkPutImage( pixmap.pixelSize = 32; pixmap.cmpCount = 3; pixmap.cmpSize = 8; - pixmap.pixelFormat = 0; + pixmap.pixelFormat = k32ARGBPixelFormat; pixmap.pmTable = NULL; pixmap.pmExt = 0; pixmap.baseAddr = image->data; diff --git a/macosx/tkMacOSXXStubs.c b/macosx/tkMacOSXXStubs.c index ed635c0..3260d08 100644 --- a/macosx/tkMacOSXXStubs.c +++ b/macosx/tkMacOSXXStubs.c @@ -12,7 +12,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacOSXXStubs.c,v 1.2.2.1 2003/03/18 13:55:51 das Exp $ + * RCS: @(#) $Id: tkMacOSXXStubs.c,v 1.2.2.2 2004/02/23 10:49:29 das Exp $ */ #include "tkInt.h" @@ -142,7 +142,7 @@ TkpOpenDisplay( screen->root_visual->green_mask = 0x0000FF00; screen->root_visual->blue_mask = 0x000000FF; screen->root_visual->bits_per_rgb = 24; - screen->root_visual->map_entries = 2 ^ 8; + screen->root_visual->map_entries = 256; gMacDisplay = (TkDisplay *) ckalloc(sizeof(TkDisplay)); @@ -328,19 +328,45 @@ XGetImage(display, d, x, y, width, height, plane_mask, format) unsigned long plane_mask; int format; { - XImage * imagePtr; - Visual * visual = NULL; - int depth = 0; - int offset = 0; - char * data = NULL; - int bitmap_pad = 0; - int bytes_per_line = 0; - CGrafPtr grafPtr; - - imagePtr = XCreateImage(display,visual,depth,format, offset, data, - width, height, bitmap_pad, bytes_per_line ); - grafPtr = TkMacOSXGetDrawablePort(d); - imagePtr->data = (char *) grafPtr; + XImage * imagePtr = NULL; + Pixmap pixmap = NULL; + Tk_Window win = (Tk_Window) ((MacDrawable *) d)->winPtr; + GC gc; + int depth = 32; + int offset = 0; + int bitmap_pad = 32; + int bytes_per_line = 0; + + if (TkMacOSXGetDrawablePort(d)) { + if (format == ZPixmap) { + if (width > 0 && height > 0) { + /* Tk_GetPixmap fails for zero width or height */ + pixmap = Tk_GetPixmap(display, d, width, height, depth); + } + if (win) { + XGCValues values; + gc = Tk_GetGC(win, 0, &values); + } else { + gc = XCreateGC(display, pixmap, 0, NULL); + } + if (pixmap) { + XCopyArea(display, d, pixmap, gc, x, y, width, height, 0, 0); + } + imagePtr = XCreateImage(display, NULL, depth, format, offset, + (char*)TkMacOSXGetDrawablePort(pixmap), + width, height, bitmap_pad, bytes_per_line); + /* Track Pixmap underlying the XImage in the unused obdata field * + * so that we can treat XImages coming from XGetImage specially. */ + imagePtr->obdata = (XPointer) pixmap; + if (!win) { + XFreeGC(display, gc); + } + } else { + TkpDisplayWarning( + "XGetImage: only ZPixmap types are implemented", + "XGetImage Failure"); + } + } return imagePtr; } @@ -459,6 +485,7 @@ XCreateImage( ximage->green_mask = 0x0000FF00; ximage->blue_mask = 0x000000FF; + ximage->obdata = NULL; ximage->f.destroy_image = TkMacOSXXDestroyImage; ximage->f.get_pixel = TkMacOSXXGetPixel; ximage->f.put_pixel = TkMacOSXXPutPixel; @@ -667,7 +694,8 @@ int TkMacOSXXDestroyImage( XImage *image) { - Debugger(); + if (image->obdata) + Tk_FreePixmap((Display*)gMacDisplay,(Pixmap)image->obdata); return 0; } @@ -683,9 +711,16 @@ TkMacOSXXGetPixel( grafPtr = (CGrafPtr)image->data; SetPort(grafPtr); GetCPixel(x,y,&cPix); - r = cPix . red; - g = cPix . green; - b = cPix . blue; + if (image->obdata) { + /* Image from XGetImage, 16 bit color values */ + r = (cPix . red) >> 8; + g = (cPix . green) >> 8; + b = (cPix . blue) >> 8; + } else { + r = cPix . red; + g = cPix . green; + b = cPix . blue; + } c = (r<<16)|(g<<8)|(b); return c; } @@ -705,9 +740,16 @@ TkMacOSXXPutPixel( r = (pixel & image->red_mask)>>16; g = (pixel & image->green_mask)>>8; b = (pixel & image->blue_mask); - cPix . red = r; - cPix . green = g; - cPix . blue = b; + if (image->obdata) { + /* Image from XGetImage, 16 bit color values */ + cPix . red = r << 8; + cPix . green = g << 8; + cPix . blue = b << 8; + } else { + cPix . red = r; + cPix . green = g; + cPix . blue = b; + } SetCPixel(x,y,&cPix); return 0; } |