--- a/XftFontDescription.st Fri Jan 24 15:51:26 2014 +0100
+++ b/XftFontDescription.st Mon Jan 27 22:54:38 2014 +0100
@@ -342,52 +342,53 @@
displayString:aString from:index1 to:index2 x:xArg y:yArg in:aGC opaque:opaque
"display a partial string at some position in aGC."
- | bitsPerCharacter transformation clipR clipX clipY clipW clipH fg fgR fgG fgB fgA fgPixel bg bgR bgG bgB bgA bgPixel drawX drawY displayId screen drawableId error |
+ |bytesPerCharacter transformation clipR clipX clipY clipW clipH fg fgR fgG fgB fgA fgPixel bg bgR bgG bgB bgA bgPixel drawX drawY displayId screen drawableId error |
- bitsPerCharacter := aString bitsPerCharacter.
+ bytesPerCharacter := aString bitsPerCharacter // 8.
transformation := aGC transformation.
transformation isNil ifTrue:[
- drawX := xArg.
- drawY := yArg.
+ drawX := xArg.
+ drawY := yArg.
] ifFalse:[
- drawX := transformation applyToX: xArg.
- drawY := transformation applyToY: yArg.
+ drawX := transformation applyToX: xArg.
+ drawY := transformation applyToY: yArg.
].
clipR := aGC clippingBounds.
clipR notNil ifTrue:[
- | t |
- clipX := clipR left.
- clipY := clipR top.
- clipW := clipR width.
- clipH := clipR height.
- transformation notNil ifTrue:[
- clipX := transformation applyToX: clipX.
- clipY := transformation applyToY: clipY.
- clipW := transformation applyScaleX: clipW.
- clipH := transformation applyScaleY: clipH.
- ].
+
+ clipX := clipR left.
+ clipY := clipR top.
+ clipW := clipR width.
+ clipH := clipR height.
+ transformation notNil ifTrue:[
+ clipX := transformation applyToX: clipX.
+ clipY := transformation applyToY: clipY.
+ clipW := transformation applyScaleX: clipW.
+ clipH := transformation applyScaleY: clipH.
+ ].
].
fg := aGC paint.
fgR := fg scaledRed.
fgG := fg scaledGreen.
fgB := fg scaledBlue.
- fgA := fg alpha * 65535.
+ fgA := (fg alpha * 65535) asInteger.
fgPixel := fg colorId.
opaque ifTrue:[
- bg := aGC backgroundPaint.
- bgR := bg scaledRed.
- bgG := bg scaledGreen.
- bgB := bg scaledBlue.
- bgA := bg alpha * 65535.
- bgPixel := bg colorId.
+ bg := aGC backgroundPaint.
+ bgR := bg scaledRed.
+ bgG := bg scaledGreen.
+ bgB := bg scaledBlue.
+ bgA := (bg alpha * 65535) asInteger.
+ bgPixel := bg colorId.
].
displayId := device displayId.
screen := device screen.
drawableId := aGC id.
+
%{
#ifdef XFT
XftFont *font;
@@ -397,84 +398,93 @@
XRectangle clipRX;
char* string;
int len;
- int bytesPerCharacter;
+ int __bytesPerCharacter;
- bytesPerCharacter = __intVal(bitsPerCharacter) / 8;
+ if (!(__bothSmallInteger(drawX, drawY)
+ && __bothSmallInteger(index1, index2)
+ && __bothSmallInteger(bytesPerCharacter, fgR)
+ && __isNonNilObject(aString)
+ )) {
+// printf("drawX/Y: %d %d\n", __intVal(drawX), __intVal(drawY));
+ goto err;
+ }
+
+ __bytesPerCharacter = __intVal(bytesPerCharacter);
if ( __INST(drawId) == nil ) {
- __INST(drawId) = XFT_DRAW_HANDLE_NEW ( XftDrawCreate ( DISPLAY( displayId ) ,
- DRAWABLE( drawableId ) ,
- DefaultVisual( DISPLAY( displayId), SCREEN (screen) ) ,
- DefaultColormap( DISPLAY( displayId), SCREEN (screen) ) ) );
- __STORE(self, __INST(drawId));
+ __INST(drawId) = XFT_DRAW_HANDLE_NEW ( XftDrawCreate ( DISPLAY( displayId ) ,
+ DRAWABLE( drawableId ) ,
+ DefaultVisual( DISPLAY( displayId), SCREEN (screen) ) ,
+ DefaultColormap( DISPLAY( displayId), SCREEN (screen) ) ) );
+ __STORE(self, __INST(drawId));
}
if ( XftDrawDrawable ( XFT_DRAW ( __INST(drawId) ) ) != DRAWABLE( drawableId ) ) {
- XftDrawChange( XFT_DRAW( __INST(drawId) ) , DRAWABLE( drawableId ) );
+ XftDrawChange( XFT_DRAW( __INST(drawId) ) , DRAWABLE( drawableId ) );
}
- string = __stringVal( aString ) + (( __intVal(index1) - 1 ) * bytesPerCharacter);
+ string = __stringVal( aString ) + (( __intVal(index1) - 1 ) * __bytesPerCharacter);
len = __intVal(index2) - __intVal(index1) + 1;
if (clipR != nil) {
- clipRX.x = __intVal(clipX);
- clipRX.y = __intVal(clipY);
- clipRX.width = __intVal(clipW);
- clipRX.height = __intVal(clipH);
- XftDrawSetClipRectangles( XFT_DRAW( __INST( drawId ) ) , 0, 0, &clipRX, 1);
+ clipRX.x = __intVal(clipX);
+ clipRX.y = __intVal(clipY);
+ clipRX.width = __intVal(clipW);
+ clipRX.height = __intVal(clipH);
+ XftDrawSetClipRectangles( XFT_DRAW( __INST( drawId ) ) , 0, 0, &clipRX, 1);
} else {
- XftDrawSetClipRectangles( XFT_DRAW( __INST( drawId ) ) , 0, 0, (XRectangle*)NULL, 0);
+ XftDrawSetClipRectangles( XFT_DRAW( __INST( drawId ) ) , 0, 0, (XRectangle*)NULL, 0);
}
if ( opaque == true ) {
- color.pixel = (unsigned long)__intVal(bgPixel);
- color.color.red = __intVal(bgR);
- color.color.green = __intVal(bgG);
- color.color.blue = __intVal(bgB);
- color.color.alpha = __intVal(bgA);
- switch (bytesPerCharacter) {
- case 1:
- XftTextExtents8( DISPLAY( displayId ), XFT_FONT( __INST( fontId ) ), (FcChar8*)string, len, &extents);
- break;
- case 2:
- XftTextExtents16( DISPLAY( displayId ), XFT_FONT( __INST( fontId ) ), (FcChar16*)string, len, &extents);
- break;
- case 4:
- XftTextExtents32( DISPLAY( displayId ), XFT_FONT( __INST( fontId ) ), (FcChar32*)string, len, &extents);
- break;
- }
- XftDrawRect( XFT_DRAW ( __INST( drawId ) ), &color, __intVal(drawX) - extents.x, __intVal(drawY) - XFT_FONT( __INST( fontId ) )->ascent, extents.width, XFT_FONT(__INST (fontId ) )->height);
+ color.pixel = (unsigned long)__intVal(bgPixel);
+ color.color.red = __intVal(bgR);
+ color.color.green = __intVal(bgG);
+ color.color.blue = __intVal(bgB);
+ color.color.alpha = __intVal(bgA);
+ switch (__bytesPerCharacter) {
+ case 1:
+ XftTextExtents8( DISPLAY( displayId ), XFT_FONT( __INST( fontId ) ), (FcChar8*)string, len, &extents);
+ break;
+ case 2:
+ XftTextExtents16( DISPLAY( displayId ), XFT_FONT( __INST( fontId ) ), (FcChar16*)string, len, &extents);
+ break;
+ case 4:
+ XftTextExtents32( DISPLAY( displayId ), XFT_FONT( __INST( fontId ) ), (FcChar32*)string, len, &extents);
+ break;
+ }
+ XftDrawRect( XFT_DRAW ( __INST( drawId ) ), &color, __intVal(drawX) - extents.x, __intVal(drawY) - XFT_FONT( __INST( fontId ) )->ascent, extents.width, XFT_FONT(__INST (fontId ) )->height);
}
color.pixel = (unsigned long)__intVal(fgPixel);
color.color.red = __intVal(fgR);
color.color.green = __intVal(fgG);
color.color.blue = __intVal(fgB);
color.color.alpha = __intVal(fgA);
- switch (bytesPerCharacter) {
+ switch (__bytesPerCharacter) {
case 1:
- XftDrawString8( XFT_DRAW ( __INST( drawId ) ), &color, XFT_FONT( __INST( fontId ) ),
- __intVal(drawX),
- __intVal(drawY),
- (FcChar8*)string,
- len);
- RETURN ( self );
- break;
+ XftDrawString8( XFT_DRAW ( __INST( drawId ) ), &color, XFT_FONT( __INST( fontId ) ),
+ __intVal(drawX),
+ __intVal(drawY),
+ (FcChar8*)string,
+ len);
+ RETURN ( self );
+ break;
case 2:
- XftDrawString16( XFT_DRAW ( __INST( drawId ) ), &color, XFT_FONT( __INST( fontId ) ),
- __intVal(drawX),
- __intVal(drawY),
- (FcChar16*)string,
- len);
- RETURN ( self );
- break;
+ XftDrawString16( XFT_DRAW ( __INST( drawId ) ), &color, XFT_FONT( __INST( fontId ) ),
+ __intVal(drawX),
+ __intVal(drawY),
+ (FcChar16*)string,
+ len);
+ RETURN ( self );
+ break;
case 4:
- XftDrawString32( XFT_DRAW ( __INST( drawId ) ), &color, XFT_FONT( __INST( fontId ) ),
- __intVal(drawX),
- __intVal(drawY),
- (FcChar32*)string,
- len);
- RETURN ( self );
- break;
+ XftDrawString32( XFT_DRAW ( __INST( drawId ) ), &color, XFT_FONT( __INST( fontId ) ),
+ __intVal(drawX),
+ __intVal(drawY),
+ (FcChar32*)string,
+ len);
+ RETURN ( self );
+ break;
}
err:;
#endif
@@ -1412,11 +1422,11 @@
!XftFontDescription class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libview/XftFontDescription.st,v 1.22 2014-01-15 12:13:45 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libview/XftFontDescription.st,v 1.23 2014-01-27 21:54:38 stefan Exp $'
!
version_CVS
- ^ '$Header: /cvs/stx/stx/libview/XftFontDescription.st,v 1.22 2014-01-15 12:13:45 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libview/XftFontDescription.st,v 1.23 2014-01-27 21:54:38 stefan Exp $'
! !