summaryrefslogtreecommitdiffstats
path: root/macosx/tkMacOSXDraw.c
diff options
context:
space:
mode:
Diffstat (limited to 'macosx/tkMacOSXDraw.c')
-rw-r--r--macosx/tkMacOSXDraw.c54
1 files changed, 42 insertions, 12 deletions
diff --git a/macosx/tkMacOSXDraw.c b/macosx/tkMacOSXDraw.c
index edf3817..5d254f1 100644
--- a/macosx/tkMacOSXDraw.c
+++ b/macosx/tkMacOSXDraw.c
@@ -7,16 +7,23 @@
*
* Copyright (c) 1995-1997 Sun Microsystems, Inc.
* Copyright 2001, Apple Computer, Inc.
+ * Copyright (c) 2006 Daniel A. Steffen <das@users.sourceforge.net>
*
* 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.14 2006/04/11 10:20:33 das Exp $
+ * RCS: @(#) $Id: tkMacOSXDraw.c,v 1.15 2006/05/12 18:17:48 das Exp $
*/
#include "tkMacOSXInt.h"
#include "tkMacOSXDebug.h"
+/*
+#ifdef TK_MAC_DEBUG
+#define TK_MAC_DEBUG_DRAWING
+#endif
+*/
+
#ifndef PI
# define PI 3.14159265358979323846
#endif
@@ -272,16 +279,12 @@ XCopyPlane(
srcPort = TkMacOSXGetDrawablePort(src);
dstPort = TkMacOSXGetDrawablePort(dst);
- if (tmpRgn == NULL) {
- tmpRgn = NewRgn();
- }
display->request++;
GetGWorld(&saveWorld, &saveDevice);
SetGWorld(dstPort, NULL);
TkMacOSXSetUpClippingRgn(dst);
-
srcBit = GetPortBitMapForCopyBits(srcPort);
dstBit = GetPortBitMapForCopyBits(dstPort);
SetRect(&srcRect, (short) (srcDraw->xOff + src_x),
@@ -395,12 +398,9 @@ TkPutImage(
int i, j;
BitMap bitmap;
char *newData = NULL;
- Rect destRect, srcRect;
+ Rect destRect, srcRect, *destPtr, *srcPtr;
destPort = TkMacOSXGetDrawablePort(d);
- 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++;
GetGWorld(&saveWorld, &saveDevice);
@@ -408,12 +408,32 @@ TkPutImage(
TkMacOSXSetUpClippingRgn(d);
+ srcPtr = &srcRect;
+ SetRect(srcPtr, src_x, src_y, src_x + width, src_y + height);
+ if (tkPictureIsOpen) {
+ /*
+ * When rendering into a picture, after a call to "OpenCPicture"
+ * the clipping is seriously WRONG and also INCONSISTENT with the
+ * clipping for single plane bitmaps.
+ * To circumvent this problem, we clip to the whole window
+ */
+
+ Rect clpRect;
+ GetPortBounds(destPort,&clpRect);
+ ClipRect(&clpRect);
+ destPtr = srcPtr;
+ } else {
+ destPtr = &destRect;
+ SetRect(destPtr, dstDraw->xOff + dest_x, dstDraw->yOff + dest_y,
+ dstDraw->xOff + dest_x + width, dstDraw->yOff + dest_y + height);
+ }
+
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);
+ srcPtr, destPtr, srcCopy, NULL);
} else if (image->depth == 1) {
/*
* This code assumes a pixel depth of 1
@@ -448,7 +468,7 @@ TkPutImage(
bitmap.rowBytes = image->bytes_per_line;
}
destBits = GetPortBitMapForCopyBits(destPort);
- CopyBits(&bitmap, destBits, &srcRect, &destRect, srcCopy, NULL);
+ CopyBits(&bitmap, destBits, srcPtr, destPtr, srcCopy, NULL);
} else {
/*
* Color image
@@ -479,7 +499,7 @@ TkPutImage(
pixmap.rowBytes = image->bytes_per_line | 0x8000;
CopyBits((BitMap *) &pixmap, GetPortBitMapForCopyBits(destPort),
- &srcRect, &destRect, srcCopy, NULL);
+ srcPtr, destPtr, srcCopy, NULL);
}
if (newData != NULL) {
@@ -1895,6 +1915,16 @@ TkMacOSXSetUpClippingRgn(
TkMacOSXUpdateClipRgn(macDraw->winPtr);
}
+#if defined(TK_MAC_DEBUG) && defined(TK_MAC_DEBUG_DRAWING)
+ TkMacOSXInitNamedDebugSymbol(HIToolbox, int, QDDebugFlashRegion,
+ CGrafPtr port, RgnHandle region);
+ if (QDDebugFlashRegion) {
+ CGrafPtr grafPtr = TkMacOSXGetDrawablePort(drawable);
+ /* Carbon-internal region flashing SPI (c.f. Technote 2124) */
+ QDDebugFlashRegion(grafPtr, macDraw->clipRgn);
+ }
+#endif /* TK_MAC_DEBUG_DRAWING */
+
/*
* When a menu is up, the Mac does not expect drawing to occur and
* does not clip out the menu. We have to do it ourselves. This