XftFontDescription.st
changeset 6195 9a14f8e6c10c
parent 6194 00776088da01
child 6196 8de3a2bb27e7
--- 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 $'
 ! !