XFT: Forbid XFT rendering on bitmaps (depth-1 pixmaps)
In theory it could work if XFT would just turn gray into
either black or white. But XFT doesn't do it and simply draw
nothing without failing in any way.
To prevent this silent failures, forbid drawing XFT onto bitmaps
(depth-1 pixmaps). After all, the while point of XFT is to use
anti-aliased fonts.
--- a/XftFontDescription.st Thu Nov 24 23:50:51 2016 +0000
+++ b/XftFontDescription.st Sat Nov 26 21:09:32 2016 +0000
@@ -464,6 +464,22 @@
fg fgR fgG fgB fgA fgPixel bg bgR bgG bgB bgA bgPixel
drawX drawY drawPnt displayId screen drawableId error stringLen drawId drawIdIsShared
newXftDrawId newDrawableAssociation pixmapDepth|
+
+ aGC isPixmap ifTrue:[
+ pixmapDepth := aGC depth.
+ pixmapDepth == 1 ifTrue:[
+ "/ Using XFT font to draw in bitmap is not allowed. In theory it could
+ "/ work if XFT would just turn gray into either black or white. But XFT
+ "/ doesn't do it and simply draw nothing without failing in any way.
+ "/
+ "/ To prevent this silent failures, forbid drawing XFT onto bitmaps
+ "/ (depth-1 pixmaps). After all, the while point of XFT is to use
+ "/ anti-aliased fonts.
+ self error: 'XFT font cannot be used with bitmaps'.
+ ^self
+ ].
+ ].
+
"limit the string len, otherwise bad output is generated"
stringLen := index2Arg - index1 + 1.
@@ -537,9 +553,6 @@
].
screen := device screen.
drawableId := aGC drawableId.
- aGC isForm ifTrue:[
- pixmapDepth := aGC depth.
- ].
((aGC class == XGraphicsContext) or:[aGC isKindOf: XGraphicsContext]) ifTrue:[
"/ TODO: Following should be done atomically together with drawing...
@@ -547,21 +560,10 @@
drawIdIsShared := false.
drawId isNil ifTrue:[
%{ /* STACK: 64000 */
- if (pixmapDepth != nil) {
- int __pixmapDepth = __intVal(pixmapDepth);
- if (__pixmapDepth == 1) {
- drawId = XFT_DRAW_HANDLE_NEW ( XftDrawCreateBitmap ( DISPLAY( displayId ) ,
- DRAWABLE( drawableId ) ) );
- } else {
- drawId = XFT_DRAW_HANDLE_NEW ( XftDrawCreateAlpha ( DISPLAY( displayId ) ,
- DRAWABLE( drawableId ), __pixmapDepth) );
- }
- } else {
- drawId = XFT_DRAW_HANDLE_NEW ( XftDrawCreate ( DISPLAY( displayId ) ,
- DRAWABLE( drawableId ) ,
- DefaultVisual( DISPLAY( displayId), SCREEN (screen) ) ,
- DefaultColormap( DISPLAY( displayId), SCREEN (screen) ) ) );
- }
+ drawId = XFT_DRAW_HANDLE_NEW ( XftDrawCreate ( DISPLAY( displayId ) ,
+ DRAWABLE( drawableId ) ,
+ DefaultVisual( DISPLAY( displayId), SCREEN (screen) ) ,
+ DefaultColormap( DISPLAY( displayId), SCREEN (screen) ) ) );
%}.
aGC xftDrawId: drawId.
].