summaryrefslogtreecommitdiffstats
path: root/macosx
diff options
context:
space:
mode:
Diffstat (limited to 'macosx')
-rw-r--r--macosx/tkMacOSXDraw.c22
-rw-r--r--macosx/tkMacOSXXStubs.c86
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;
}