summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--changes5
-rw-r--r--generic/tkCanvPs.c14
-rw-r--r--macosx/tkMacOSXDraw.c22
-rw-r--r--macosx/tkMacOSXXStubs.c86
-rw-r--r--xlib/ximage.c5
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 <das@users.sourceforge.net>
+
+ * 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 <peter.spjuth@space.se>
* 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);