看一下7.04里libqt3-mt新加的这个patch

KDE桌面环境
回复
f0rrest
帖子: 133
注册时间: 2006-09-27 20:49
送出感谢: 0
接收感谢: 4 次

看一下7.04里libqt3-mt新加的这个patch

#1

帖子 f0rrest » 2007-03-07 9:12

最新的libqt3-mt-3.3.7里多了这么个patch,按照changelog:
* debian/patches/61_fcfontmatch_fontwidth_fix.dpatch
Fix font matching with fontconfig. This resolves inconsistency with
determining font width (e.g. Dejavu Sans "Condensed" may get selected
instead of "Book" for Sans Serif font) for default fonts (Sans Serif,
Serif and Monospace). This bug is very important because it makes
default KDE fonts look ugly in most cases.
大概意思是qt在选择缺省字体时(如Sans Serif)会出现偏差,错误计算字体的宽度,这个补丁则修正了这个错误。
但实际上我升级到libqt3-mt-3.3.7后,qt反而无法正确选择Sans Serif字体(我在fontconfig里配置的是所有sans-serif字体的第一选择都是Bitstream Vera Sans,但在qt里选Sans Serif出来的却是一个很难看的字体,与此同时gtk+的程序没问题,证明fontconfig的配置没错)
我把libqt3-mt-3.3.7重新打包,去掉了这个patch后,qt的Sans Serif字体选择就和fontconfig一致了。
我想请教各位qt/KDE高手,这个patch在这里究竟起什么作用,我对qt和fontconfig的字体选择还不是很清楚。

补丁如下:

代码: 全选

--- qt-x11-free-3.3.7/src/kernel/qfontdatabase_x11.cpp	2006-12-28 21:40:34.000000000 +0200
+++ qt-x11-free-3.3.7/src/kernel/qfontdatabase_x11.cpp	2006-12-28 21:43:44.000000000 +0200
@@ -1,4 +1,4 @@
-/****************************************************************************
+/***************************
 ** $Id: qt/qfontdatabase_x11.cpp   3.3.7   edited Feb 13 2006 $
 **
 ** Implementation of platform specific QFontDatabase
@@ -1504,13 +1504,24 @@
       convert the pixel size to a point size and request that.
     */
     double size_value = request.pixelSize;
+    double dpi = QPaintDevice::x11AppDpiY(fp->screen);
     double scale = 1.;
     if ( size_value > MAXFONTSIZE_XFT ) {
 	scale = (double)size_value/(double)MAXFONTSIZE_XFT;
 	size_value = MAXFONTSIZE_XFT;
     }
-
-    size_value = size_value*72./QPaintDevice::x11AppDpiY(fp->screen);
+#ifdef QT_XFT2
+    /*
+     2006-12-28 If QT is not compiled against xft1, there is no need
+     for the workaround above (confirmed). Thus, in addition, add
+     font pixelsize to the pattern to avoid fontconfig making wrong
+     guesses. Also provide a DPI value for fontconfig so it never
+     attempts to fallback to its default.
+    */
+    XftPatternAddDouble(pattern, XFT_PIXEL_SIZE, size_value);
+    XftPatternAddDouble(pattern, XFT_DPI, dpi);
+#endif
+    size_value = size_value*72./dpi;
     XftPatternAddDouble( pattern, XFT_SIZE, size_value );
 
 #ifdef XFT_MATRIX
@@ -1875,6 +1886,11 @@
     FcResult result;
         FcFontSet *fs = 0;
         FcPattern *fsp = 0;
+
+	// Properly conform to fontconfig API. We need to call FcDefaultSubstitute()
+	// before FcFontSort()/FcFontMatch().
+	FcDefaultSubstitute(pattern);
+
         if( use_fontsort ) {
             fs = FcFontSort(0, pattern, FcFalse, 0, &result);
     if (!fs)
f0rrest
帖子: 133
注册时间: 2006-09-27 20:49
送出感谢: 0
接收感谢: 4 次

#2

帖子 f0rrest » 2007-03-08 23:51

google了一下,发现自己火星了。
我碰到的这个问题只发生在非英语locale上,如LANG=zh_CN.UTF-8,这时qt会用一个中文字体里的英文字作为Sans Serif的候选字。当用英语locale时(如LANG=en_US.UTF-8 LC_CTYPE=zh_CN.UTF-8 这种情况),Sans Serif的候选字和fontconfig是一致的。
应该理解为qt对于fontconfig的配置还有自己的考虑。
回复

回到 “Kubuntu”