And getFCWeight maps them as follows:
0 ÷ 75 => Light
76 ÷ 140 => Normal
141 ÷ 190 => DemiBold
191 ÷ 205 => Bold
206 ÷ ∞ => Black
Because of that both Ubuntu Regular and Medium fall into the same Qt weight - QFont::Normal. Since that operation loses the granularity, there's probably no easy way to distinguish between Normal and Medium later in the process.
Possible solutions:
a) introduce QFont::Medium
b) make FC_WEIGHT_MEDIUM mapped to QFont::DemiBold
c) drop seemingly duplicate fonts
I myself would lean towards solution a), but neither that or b) really fixes anything - if there's duplicates, it becomes non-deterministic in which font will be selected (the last one added? a random one?). Solution c) seems to be the most complete, but then also quite intrusive. We'd have to only leave the one whose fontconfig weight is closest to the respective weight. So from each of the getFCWeight ranges only one font would be selected, closest to what fontconfig says that weight should be.
I managed to track down the culprit:
http:// qt.gitorious. org/qt/ qt/blobs/ 4.8/src/ gui/text/ qfontdatabase_ x11.cpp# line729
The problem is that Qt only supports 5 weights: qt.gitorious. org/qt/ qt/blobs/ 4.8/src/ gui/text/ qfont.h# line103
http://
Light = 25,
Normal = 50,
DemiBold = 63,
Bold = 75,
Black = 87
FontConfig has 11 weights defined: cgit.freedeskto p.org/fontconfi g/tree/ fontconfig/ fontconfig. h#n126 EXTRALIGHT 40 ULTRALIGHT FC_WEIGHT_ EXTRALIGHT EXTRABLACK 215 ULTRABLACK FC_WEIGHT_ EXTRABLACK
http://
#define FC_WEIGHT_THIN 0
#define FC_WEIGHT_
#define FC_WEIGHT_
#define FC_WEIGHT_LIGHT 50
#define FC_WEIGHT_BOOK 75
#define FC_WEIGHT_REGULAR 80
#define FC_WEIGHT_NORMAL FC_WEIGHT_REGULAR
#define FC_WEIGHT_MEDIUM 100
#define FC_WEIGHT_DEMIBOLD 180
#define FC_WEIGHT_SEMIBOLD FC_WEIGHT_DEMIBOLD
#define FC_WEIGHT_BOLD 200
#define FC_WEIGHT_EXTRABOLD 205
#define FC_WEIGHT_ULTRABOLD FC_WEIGHT_EXTRABOLD
#define FC_WEIGHT_BLACK 210
#define FC_WEIGHT_HEAVY FC_WEIGHT_BLACK
#define FC_WEIGHT_
#define FC_WEIGHT_
And getFCWeight maps them as follows:
0 ÷ 75 => Light
76 ÷ 140 => Normal
141 ÷ 190 => DemiBold
191 ÷ 205 => Bold
206 ÷ ∞ => Black
Because of that both Ubuntu Regular and Medium fall into the same Qt weight - QFont::Normal. Since that operation loses the granularity, there's probably no easy way to distinguish between Normal and Medium later in the process.
Possible solutions:
a) introduce QFont::Medium
b) make FC_WEIGHT_MEDIUM mapped to QFont::DemiBold
c) drop seemingly duplicate fonts
I myself would lean towards solution a), but neither that or b) really fixes anything - if there's duplicates, it becomes non-deterministic in which font will be selected (the last one added? a random one?). Solution c) seems to be the most complete, but then also quite intrusive. We'd have to only leave the one whose fontconfig weight is closest to the respective weight. So from each of the getFCWeight ranges only one font would be selected, closest to what fontconfig says that weight should be.