diff options
author | pspjuth <peter.spjuth@gmail.com> | 2012-08-26 17:07:19 (GMT) |
---|---|---|
committer | pspjuth <peter.spjuth@gmail.com> | 2012-08-26 17:07:19 (GMT) |
commit | 2c2a2e6522dcfc11aaa8017b47bc14485313349b (patch) | |
tree | d0cf2a1e6e56525333957dd5fe2aab36bf174a4c /unix/tkUnixRFont.c | |
parent | fc0e57edc8cb5ad99ea9540032237367f8b0a777 (diff) | |
parent | e4c7ef5bdf6375e1860418b1ec92c07f88660cc8 (diff) | |
download | tk-pspjuth_canvas.zip tk-pspjuth_canvas.tar.gz tk-pspjuth_canvas.tar.bz2 |
merge trunkpspjuth_canvas
Diffstat (limited to 'unix/tkUnixRFont.c')
-rw-r--r-- | unix/tkUnixRFont.c | 45 |
1 files changed, 41 insertions, 4 deletions
diff --git a/unix/tkUnixRFont.c b/unix/tkUnixRFont.c index ba19303..ab2ed4a 100644 --- a/unix/tkUnixRFont.c +++ b/unix/tkUnixRFont.c @@ -7,8 +7,6 @@ * * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkUnixRFont.c,v 1.37 2011/01/06 05:58:16 stwo Exp $ */ #include "tkUnixInt.h" @@ -37,6 +35,16 @@ typedef struct { XftDraw *ftDraw; XftColor color; } UnixFtFont; + +/* + * Used to describe the current clipping box. Can't be passed normally because + * the information isn't retrievable from the GC. + */ + +typedef struct ThreadSpecificData { + Region clipRegion; /* The clipping region, or None. */ +} ThreadSpecificData; +static Tcl_ThreadDataKey dataKey; /* * Package initialization: @@ -115,7 +123,7 @@ GetFont( FC_FAMILY, FcTypeString, "sans", FC_SIZE, FcTypeDouble, 12.0, FC_MATRIX, FcTypeMatrix, &mat, - (void *) NULL); + NULL); } if (!ftFont) { /* @@ -756,6 +764,8 @@ Tk_DrawChars( int clen, nspec, xStart = x; XftGlyphFontSpec specs[NUM_SPEC]; XGlyphInfo metrics; + ThreadSpecificData *tsdPtr = (ThreadSpecificData *) + Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData)); if (fontPtr->ftDraw == 0) { #if DEBUG_FONTSEL @@ -782,6 +792,9 @@ Tk_DrawChars( fontPtr->color.color.alpha = 0xffff; fontPtr->color.pixel = values.foreground; } + if (tsdPtr->clipRegion != None) { + XftDrawSetClip(fontPtr->ftDraw, tsdPtr->clipRegion); + } nspec = 0; while (numBytes > 0 && x <= maxCoord && y <= maxCoord) { XftFont *ftFont; @@ -821,6 +834,9 @@ Tk_DrawChars( } doUnderlineStrikeout: + if (tsdPtr->clipRegion != None) { + XftDrawSetClip(fontPtr->ftDraw, None); + } if (fontPtr->font.fa.underline != 0) { XFillRectangle(display, drawable, gc, xStart, y + fontPtr->font.underlinePos, (unsigned) (x - xStart), @@ -878,6 +894,8 @@ TkDrawAngledChars( XGCValues values; XColor xcolor; int xStart = x, yStart = y; + ThreadSpecificData *tsdPtr = (ThreadSpecificData *) + Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData)); #ifdef XFT_HAS_FIXED_ROTATED_PLACEMENT int clen, nglyph; FT_UInt glyphs[NUM_SPEC]; @@ -911,11 +929,14 @@ TkDrawAngledChars( fontPtr->color.color.alpha = 0xffff; fontPtr->color.pixel = values.foreground; } + if (tsdPtr->clipRegion != None) { + XftDrawSetClip(fontPtr->ftDraw, tsdPtr->clipRegion); + } nglyph = 0; currentFtFont = NULL; originX = originY = 0; /* lint */ - + while (numBytes > 0 && x <= maxCoord && x >= minCoord && y <= maxCoord && y >= minCoord) { XftFont *ftFont; @@ -997,6 +1018,9 @@ TkDrawAngledChars( fontPtr->color.color.alpha = 0xffff; fontPtr->color.pixel = values.foreground; } + if (tsdPtr->clipRegion != None) { + XftDrawSetClip(fontPtr->ftDraw, tsdPtr->clipRegion); + } nspec = 0; while (numBytes > 0 && x <= maxCoord && x >= minCoord && y <= maxCoord && y >= minCoord) { @@ -1039,6 +1063,9 @@ TkDrawAngledChars( #endif /* XFT_HAS_FIXED_ROTATED_PLACEMENT */ doUnderlineStrikeout: + if (tsdPtr->clipRegion != None) { + XftDrawSetClip(fontPtr->ftDraw, None); + } if (fontPtr->font.fa.underline || fontPtr->font.fa.overstrike) { XPoint points[5]; double width = (x - xStart) * cosA + (yStart - y) * sinA; @@ -1095,6 +1122,16 @@ TkDrawAngledChars( } } +void +TkUnixSetXftClipRegion( + TkRegion clipRegion) /* The clipping region to install. */ +{ + ThreadSpecificData *tsdPtr = (ThreadSpecificData *) + Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData)); + + tsdPtr->clipRegion = (Region) clipRegion; +} + /* * Local Variables: * c-basic-offset: 4 |