diff options
author | dkf <donal.k.fellows@manchester.ac.uk> | 2004-10-26 13:15:07 (GMT) |
---|---|---|
committer | dkf <donal.k.fellows@manchester.ac.uk> | 2004-10-26 13:15:07 (GMT) |
commit | b646dee7570b4d082ceac3d8a05e48f45eacbfc5 (patch) | |
tree | 3ac49ba01df01ed987ab98e03f908435a0256200 /macosx/tkMacOSXRegion.c | |
parent | 36091348f8af6507a2beef8d03568d26b45bd2c8 (diff) | |
download | tk-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.c | 70 |
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; + } +} |