--- a/XftFontDescription.st Sun Jan 05 22:00:30 2014 +0100
+++ b/XftFontDescription.st Mon Jan 06 16:16:40 2014 +0100
@@ -344,10 +344,12 @@
displayString:aString from:index1 to:index2 x:x y:y in:aGC opaque:opaque
"display a partial string at some position in aGC."
- | clipR clipX clipY clipW clipH fg fgR fgG fgB fgA fgPixel bg bgR bgG bgB bgA bgPixel displayId screen drawableId error |
+ | bitsPerCharacter clipR clipX clipY clipW clipH fg fgR fgG fgB fgA fgPixel bg bgR bgG bgB bgA bgPixel displayId screen drawableId error |
self primitiveFailedIfNoXft.
+ bitsPerCharacter := aString bitsPerCharacter.
+
clipR := aGC clippingBounds.
clipR notNil ifTrue:[
clipX := clipR left.
@@ -381,8 +383,11 @@
XGlyphInfo extents;
XRectangle clipRX;
char* string;
+ int len;
+ int bytesPerCharacter;
- int len;
+ bytesPerCharacter = __intVal(bitsPerCharacter) / 8;
+
if ( __INST(drawId) == nil ) {
__INST(drawId) = XFT_DRAW_HANDLE_NEW ( XftDrawCreate ( DISPLAY( displayId ) ,
DRAWABLE( drawableId ) ,
@@ -395,13 +400,8 @@
XftDrawChange( XFT_DRAW( __INST(drawId) ) , DRAWABLE( drawableId ) );
}
- if ( __isStringLike( aString ) ) {
- string = __stringVal( aString ) + ( __intVal(index1) - 1 );
- len = __intVal(index2) - __intVal(index1) + 1;
- } else {
- error = @symbol(BadArg1);
- goto err;
- }
+ string = __stringVal( aString ) + (( __intVal(index1) - 1 ) * bytesPerCharacter);
+ len = __intVal(index2) - __intVal(index1) + 1;
if (clipR != nil) {
clipRX.x = __intVal(clipX);
@@ -419,7 +419,17 @@
color.color.green = __intVal(bgG);
color.color.blue = __intVal(bgB);
color.color.alpha = __intVal(bgA);
- XftTextExtents8( DISPLAY( displayId ), XFT_FONT( __INST( fontId ) ), string, len, &extents);
+ 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(x) - extents.x, __intVal(y) - XFT_FONT( __INST( fontId ) )->ascent, extents.width, XFT_FONT(__INST (fontId ) )->height);
}
color.pixel = (unsigned long)__intVal(fgPixel);
@@ -427,13 +437,31 @@
color.color.green = __intVal(fgG);
color.color.blue = __intVal(fgB);
color.color.alpha = __intVal(fgA);
- if ( __isStringLike( aString ) ) {
+ switch (bytesPerCharacter) {
+ case 1:
XftDrawString8( XFT_DRAW ( __INST( drawId ) ), &color, XFT_FONT( __INST( fontId ) ),
__intVal(x),
__intVal(y),
(FcChar8*)string,
len);
RETURN ( self );
+ break;
+ case 2:
+ XftDrawString16( XFT_DRAW ( __INST( drawId ) ), &color, XFT_FONT( __INST( fontId ) ),
+ __intVal(x),
+ __intVal(y),
+ (FcChar16*)string,
+ len);
+ RETURN ( self );
+ break;
+ case 4:
+ XftDrawString32( XFT_DRAW ( __INST( drawId ) ), &color, XFT_FONT( __INST( fontId ) ),
+ __intVal(x),
+ __intVal(y),
+ (FcChar32*)string,
+ len);
+ RETURN ( self );
+ break;
}
err:;
#endif
@@ -1207,14 +1235,20 @@
xftTextExtents: displayIdArg font: fontIdArg string: text from: start to: stop
- | error extents |
+ | error extents bitsPerCharacter |
self primitiveFailedIfNoXft.
extents := Array new: 6.
+ bitsPerCharacter := text bitsPerCharacter.
%{
#ifdef XFT
XGlyphInfo info;
- int _start, _stop;
+ int bytesPerCharacter;
+ char *string;
+ int len;
+
+ bytesPerCharacter = __intVal(bitsPerCharacter) / 8;
+
if ( ! __isExternalAddressLike(displayIdArg) ) {
error = @symbol(BadArg1);
goto err;
@@ -1227,18 +1261,25 @@
error = @symbol(BadArg4);
goto err;
}
- _start = __intVal(start);
if ( ! __isSmallInteger(stop) ) {
error = @symbol(BadArg5);
goto err;
}
- _stop = __intVal(stop);
- if ( __isStringLike(text) ) {
- XftTextExtents8(DISPLAY(displayIdArg), XFT_FONT(fontIdArg),
- __stringVal(text) + (_start - 1), _stop - _start + 1, &info);
- } else {
- error = @symbol(BadArg3);
- goto err;
+
+ string = __stringVal( text ) + (( __intVal(start) - 1 ) * bytesPerCharacter);
+ len = __intVal(stop) - __intVal(start) + 1;
+
+
+ switch (bytesPerCharacter) {
+ case 1:
+ XftTextExtents8(DISPLAY(displayIdArg), XFT_FONT(fontIdArg), (FcChar8*)string, len, &info);
+ break;
+ case 2:
+ XftTextExtents16(DISPLAY(displayIdArg), XFT_FONT(fontIdArg), (FcChar16*)string, len, &info);
+ break;
+ case 4:
+ XftTextExtents32(DISPLAY(displayIdArg), XFT_FONT(fontIdArg), (FcChar32*)string, len, &info);
+ break;
}
__ArrayInstPtr(extents)->a_element[0] = __MKSMALLINT(info.width);
__ArrayInstPtr(extents)->a_element[1] = __MKSMALLINT(info.height);
@@ -1339,11 +1380,11 @@
!XftFontDescription class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libview/XftFontDescription.st,v 1.16 2014-01-05 21:00:30 vrany Exp $'
+ ^ '$Header: /cvs/stx/stx/libview/XftFontDescription.st,v 1.17 2014-01-06 15:16:40 vrany Exp $'
!
version_CVS
- ^ '$Header: /cvs/stx/stx/libview/XftFontDescription.st,v 1.16 2014-01-05 21:00:30 vrany Exp $'
+ ^ '$Header: /cvs/stx/stx/libview/XftFontDescription.st,v 1.17 2014-01-06 15:16:40 vrany Exp $'
! !