From 424068d0e8dd6fcb04ef498c011262dd8466f3b5 Mon Sep 17 00:00:00 2001 From: das Date: Mon, 23 Feb 2004 10:48:09 +0000 Subject: * macosx/tkMacOSXDraw.c: * macosx/tkMacOSXXStubs.c: * xlib/ximage.c: fixed MacOSX XGetImage/XPutImage and related functions to deal properly with XImages copied from screen. * generic/tkCanvPs.c (TkImageGetColor): MacOSX fix. [Bug 809157] --- ChangeLog | 9 ++++++ changes | 5 ++- generic/tkCanvPs.c | 14 +++++--- macosx/tkMacOSXDraw.c | 22 +++++++++---- macosx/tkMacOSXXStubs.c | 86 ++++++++++++++++++++++++++++++++++++------------- xlib/ximage.c | 5 ++- 6 files changed, 106 insertions(+), 35 deletions(-) diff --git a/ChangeLog b/ChangeLog index 062a4e2..1c74037 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2004-02-23 Daniel Steffen + + * macosx/tkMacOSXDraw.c: + * macosx/tkMacOSXXStubs.c: + * xlib/ximage.c: fixed MacOSX XGetImage/XPutImage and related + functions to deal properly with XImages copied from screen. + * generic/tkCanvPs.c (TkImageGetColor): MacOSX fix. + [Bug 809157] + 2004-02-18 Peter Spjuth * tests/grid.test: diff --git a/changes b/changes index 5bc52bd..a9d001e 100644 --- a/changes +++ b/changes @@ -2,7 +2,7 @@ This file summarizes all changes made to Tk since version 1.0 was released on March 13, 1991. Changes that aren't backward compatible are marked specially. -RCS: @(#) $Id: changes,v 1.65 2004/02/20 19:54:48 dgp Exp $ +RCS: @(#) $Id: changes,v 1.66 2004/02/23 10:48:10 das Exp $ 3/16/91 (bug fix) Modified tkWindow.c to remove Tk's Tcl commands from the interpreter when the main window is deleted (otherwise there will @@ -5616,4 +5616,7 @@ with spaces in their names. 2004-02-18 (bug fix)[899246] fix shrinking grid geometry calculations +2003-02-23 (platform support)[809157] Mac OS X: Add alpha blending for +images with partial transparency. + --- Released 8.4.6, February 27, 2004 --- See ChangeLog for details --- diff --git a/generic/tkCanvPs.c b/generic/tkCanvPs.c index e786a14..866433f 100644 --- a/generic/tkCanvPs.c +++ b/generic/tkCanvPs.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: tkCanvPs.c,v 1.14 2003/08/20 10:26:38 dkf Exp $ + * RCS: @(#) $Id: tkCanvPs.c,v 1.15 2004/02/23 10:48:11 das Exp $ */ #include "tkInt.h" @@ -1134,7 +1134,13 @@ GetPostscriptPoints(interp, string, doublePtr) #define GetGValue(rgb) ((BYTE)(((WORD)(rgb)) >> 8)) #define GetBValue(rgb) ((BYTE)((rgb)>>16)) */ +#else +#define GetRValue(rgb) ((rgb & cdata->red_mask) >> cdata->red_shift) +#define GetGValue(rgb) ((rgb & cdata->green_mask) >> cdata->green_shift) +#define GetBValue(rgb) ((rgb & cdata->blue_mask) >> cdata->blue_shift) +#endif +#if defined(WIN32) || defined(MAC_OSX_TK) static void TkImageGetColor(cdata, pixel, red, green, blue) TkColormapData *cdata; /* Colormap data */ @@ -1153,9 +1159,9 @@ TkImageGetColor(cdata, pixel, red, green, blue) double *red, *green, *blue; /* Color data to return */ { if (cdata->separated) { - int r = (pixel & cdata->red_mask) >> cdata->red_shift; - int g = (pixel & cdata->green_mask) >> cdata->green_shift; - int b = (pixel & cdata->blue_mask) >> cdata->blue_shift; + int r = GetRValue(pixel); + int g = GetGValue(pixel); + int b = GetBValue(pixel); *red = cdata->colors[r].red / 65535.0; *green = cdata->colors[g].green / 65535.0; *blue = cdata->colors[b].blue / 65535.0; diff --git a/macosx/tkMacOSXDraw.c b/macosx/tkMacOSXDraw.c index 144b04c..d76b362 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.3 2004/02/16 00:19:42 wolfsuit Exp $ + * RCS: @(#) $Id: tkMacOSXDraw.c,v 1.4 2004/02/23 10:48:10 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 8d9aee7..fa21bce 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.4 2004/01/13 02:06:01 davygrvy Exp $ + * RCS: @(#) $Id: tkMacOSXXStubs.c,v 1.5 2004/02/23 10:48:11 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; } diff --git a/xlib/ximage.c b/xlib/ximage.c index d2214ba..97a79c1 100644 --- a/xlib/ximage.c +++ b/xlib/ximage.c @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: ximage.c,v 1.4 2000/07/06 03:17:45 mo Exp $ + * RCS: @(#) $Id: ximage.c,v 1.5 2004/02/23 10:48:11 das Exp $ */ #include "tkInt.h" @@ -64,6 +64,9 @@ XCreateBitmapFromData(display, d, data, width, height) ximage.bitmap_bit_order = LSBFirst; ximage.bitmap_pad = 8; ximage.bytes_per_line = (width+7)/8; +#ifdef MAC_OSX_TK + ximage.obdata = NULL; +#endif TkPutImage(NULL, 0, display, pix, gc, &ximage, 0, 0, 0, 0, width, height); XFreeGC(display, gc); -- cgit v0.12