summaryrefslogtreecommitdiffstats
path: root/macosx/tkMacOSXRegion.c
diff options
context:
space:
mode:
authordkf <donal.k.fellows@manchester.ac.uk>2004-10-26 13:15:07 (GMT)
committerdkf <donal.k.fellows@manchester.ac.uk>2004-10-26 13:15:07 (GMT)
commitb646dee7570b4d082ceac3d8a05e48f45eacbfc5 (patch)
tree3ac49ba01df01ed987ab98e03f908435a0256200 /macosx/tkMacOSXRegion.c
parent36091348f8af6507a2beef8d03568d26b45bd2c8 (diff)
downloadtk-b646dee7570b4d082ceac3d8a05e48f45eacbfc5.zip
tk-b646dee7570b4d082ceac3d8a05e48f45eacbfc5.tar.gz
tk-b646dee7570b4d082ceac3d8a05e48f45eacbfc5.tar.bz2
Attempt to fix [Bug 919066] by allowing the code that creates the region
much more knowledge of the platform functions available to it.
Diffstat (limited to 'macosx/tkMacOSXRegion.c')
-rw-r--r--macosx/tkMacOSXRegion.c70
1 files changed, 65 insertions, 5 deletions
diff --git a/macosx/tkMacOSXRegion.c b/macosx/tkMacOSXRegion.c
index 0fce0c0..2f12798 100644
--- a/macosx/tkMacOSXRegion.c
+++ b/macosx/tkMacOSXRegion.c
@@ -9,7 +9,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkMacOSXRegion.c,v 1.2 2002/08/31 06:12:30 das Exp $
+ * RCS: @(#) $Id: tkMacOSXRegion.c,v 1.3 2004/10/26 13:15:09 dkf Exp $
*/
#include "tkInt.h"
@@ -139,7 +139,7 @@ TkUnionRectWithRegion(
tmpRgn = NewRgn();
}
SetRectRgn(tmpRgn, rectangle->x, rectangle->y,
- rectangle->x + rectangle->width, rectangle->y + rectangle->height);
+ rectangle->x + rectangle->width, rectangle->y + rectangle->height);
UnionRgn(srcRgn, tmpRgn, destRgn);
}
@@ -177,11 +177,11 @@ TkRectInRegion(
SetRectRgn(rectRgn, x, y, x + width, y + height);
SectRgn(rgn, rectRgn, destRgn);
if (EmptyRgn(destRgn)) {
- result = RectangleOut;
+ result = RectangleOut;
} else if (EqualRgn(rgn, destRgn)) {
- result = RectangleIn;
+ result = RectangleIn;
} else {
- result = RectanglePart;
+ result = RectanglePart;
}
DisposeRgn(rectRgn);
DisposeRgn(destRgn);
@@ -250,3 +250,63 @@ TkSubtractRegion(
DiffRgn(srcRgnA, srcRgnB, destRgn);
}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkpBuildRegionFromAlphaData --
+ *
+ * Set up a rectangle of the given region based on the supplied
+ * alpha data.
+ *
+ * Results:
+ * None
+ *
+ * Side effects:
+ * The region is updated, with extra pixels added to it.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkpBuildRegionFromAlphaData(
+ TkRegion region, /* Region to update. */
+ unsigned int x, /* Where in region to update. */
+ unsigned int y, /* Where in region to update. */
+ unsigned int width, /* Size of rectangle to update. */
+ unsigned int height, /* Size of rectangle to update. */
+ unsigned char *dataPtr, /* Data to read from. */
+ unsigned int pixelStride, /* num bytes from one piece of alpha
+ * data to the next in the line. */
+ unsigned int lineStride) /* num bytes from one line of alpha
+ * data to the next line. */
+{
+ unsigned char *lineDataPtr;
+ unsigned int x1, y1, end;
+ XRectangle rect;
+
+ for (y1 = 0; y1 < height; y1++) {
+ lineDataPtr = dataPtr;
+ for {x1 = 0; x1 < width; x1 = end) {
+ /* search for first non-transparent pixel */
+ while ((x1 < width) && !*lineDataPtr) {
+ x1++;
+ lineDataPtr += pixelStride;
+ }
+ end = x1;
+ /* search for first transparent pixel */
+ while ((end < width) && *lineDataPtr) {
+ end++;
+ lineDataPtr += pixelStride;
+ }
+ if (end > x1) {
+ rect.x = x + x1;
+ rect.y = y + y1;
+ rect.width = end - x1;
+ rect.height = 1;
+ TkUnionRectWithRegion(&rect, region, region);
+ }
+ }
+ dataPtr += lineStride;
+ }
+}