[8] | 1 | /****************************************************************************
|
---|
| 2 | ** $Id: qfontdatabase_pm.cpp 8 2005-11-16 19:36:46Z dmik $
|
---|
| 3 | **
|
---|
| 4 | ** Implementation of QFontDatabase class for OS/2
|
---|
| 5 | **
|
---|
| 6 | ** Copyright (C) 1997-2002 Trolltech AS. All rights reserved.
|
---|
| 7 | ** Copyright (C) 2004 Norman ASA. Initial OS/2 Port.
|
---|
| 8 | ** Copyright (C) 2005 netlabs.org. Further OS/2 Development.
|
---|
| 9 | **
|
---|
| 10 | ** This file is part of the kernel module of the Qt GUI Toolkit.
|
---|
| 11 | **
|
---|
| 12 | ** This file may be distributed under the terms of the Q Public License
|
---|
| 13 | ** as defined by Trolltech AS of Norway and appearing in the file
|
---|
| 14 | ** LICENSE.QPL included in the packaging of this file.
|
---|
| 15 | **
|
---|
| 16 | ** This file may be distributed and/or modified under the terms of the
|
---|
| 17 | ** GNU General Public License version 2 as published by the Free Software
|
---|
| 18 | ** Foundation and appearing in the file LICENSE.GPL included in the
|
---|
| 19 | ** packaging of this file.
|
---|
| 20 | **
|
---|
| 21 | ** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
|
---|
| 22 | ** licenses may use this file in accordance with the Qt Commercial License
|
---|
| 23 | ** Agreement provided with the Software.
|
---|
| 24 | **
|
---|
| 25 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
---|
| 26 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
---|
| 27 | **
|
---|
| 28 | ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
|
---|
| 29 | ** information about Qt Commercial License Agreements.
|
---|
| 30 | ** See http://www.trolltech.com/qpl/ for QPL licensing information.
|
---|
| 31 | ** See http://www.trolltech.com/gpl/ for GPL licensing information.
|
---|
| 32 | **
|
---|
| 33 | ** Contact info@trolltech.com if any conditions of this licensing are
|
---|
| 34 | ** not clear to you.
|
---|
| 35 | **
|
---|
| 36 | **********************************************************************/
|
---|
| 37 |
|
---|
| 38 | #include "qt_os2.h"
|
---|
| 39 | #include "qapplication_p.h"
|
---|
| 40 | #include "qfontdata_p.h"
|
---|
| 41 | #include "qfontengine_p.h"
|
---|
| 42 | #include "qpaintdevicemetrics.h"
|
---|
| 43 |
|
---|
| 44 | //@@TODO (dmik): remove
|
---|
| 45 | //extern HDC shared_dc; // common dc for all fonts
|
---|
| 46 | //static HFONT stock_sysfont = 0;
|
---|
| 47 |
|
---|
| 48 | //@@TODO (dmik): remove
|
---|
| 49 | //// see the Unicode subset bitfields in the MSDN docs
|
---|
| 50 | //static int requiredUnicodeBits[QFont::NScripts][2] = {
|
---|
| 51 | // //Latin,
|
---|
| 52 | // { 0, 1 },
|
---|
| 53 | // //Greek,
|
---|
| 54 | // { 7, 127 },
|
---|
| 55 | // //Cyrillic,
|
---|
| 56 | // { 9, 127 },
|
---|
| 57 | // //Armenian,
|
---|
| 58 | // { 10, 127 },
|
---|
| 59 | // //Georgian,
|
---|
| 60 | // { 26, 127 },
|
---|
| 61 | // //Runic,
|
---|
| 62 | // { 79, 127 },
|
---|
| 63 | // //Ogham,
|
---|
| 64 | // { 78, 127 },
|
---|
| 65 | // //SpacingModifiers,
|
---|
| 66 | // { 5, 127 },
|
---|
| 67 | // //CombiningMarks,
|
---|
| 68 | // { 6, 127 },
|
---|
| 69 | //
|
---|
| 70 | // // Middle Eastern Scripts
|
---|
| 71 | // //Hebrew,
|
---|
| 72 | // { 11, 127 },
|
---|
| 73 | // //Arabic,
|
---|
| 74 | // { 13, 67 },
|
---|
| 75 | // //Syriac,
|
---|
| 76 | // { 71, 127 },
|
---|
| 77 | // //Thaana,
|
---|
| 78 | // { 72, 127 },
|
---|
| 79 | //
|
---|
| 80 | // // South and Southeast Asian Scripts
|
---|
| 81 | // //Devanagari,
|
---|
| 82 | // { 15, 127 },
|
---|
| 83 | // //Bengali,
|
---|
| 84 | // { 16, 127 },
|
---|
| 85 | // //Gurmukhi,
|
---|
| 86 | // { 17, 127 },
|
---|
| 87 | // //Gujarati,
|
---|
| 88 | // { 18, 127 },
|
---|
| 89 | // //Oriya,
|
---|
| 90 | // { 19, 127 },
|
---|
| 91 | // //Tamil,
|
---|
| 92 | // { 20, 127 },
|
---|
| 93 | // //Telugu,
|
---|
| 94 | // { 21, 127 },
|
---|
| 95 | // //Kannada,
|
---|
| 96 | // { 22, 127 },
|
---|
| 97 | // //Malayalam,
|
---|
| 98 | // { 23, 127 },
|
---|
| 99 | // //Sinhala,
|
---|
| 100 | // { 73, 127 },
|
---|
| 101 | // //Thai,
|
---|
| 102 | // { 24, 127 },
|
---|
| 103 | // //Lao,
|
---|
| 104 | // { 25, 127 },
|
---|
| 105 | // //Tibetan,
|
---|
| 106 | // { 70, 127 },
|
---|
| 107 | // //Myanmar,
|
---|
| 108 | // { 74, 127 },
|
---|
| 109 | // //Khmer,
|
---|
| 110 | // { 80, 127 },
|
---|
| 111 | //
|
---|
| 112 | // // East Asian Scripts
|
---|
| 113 | // //Han,
|
---|
| 114 | // { 59, 127 },
|
---|
| 115 | // //Hiragana,
|
---|
| 116 | // { 49, 127 },
|
---|
| 117 | // //Katakana,
|
---|
| 118 | // { 50, 127 },
|
---|
| 119 | // //Hangul,
|
---|
| 120 | // { 56, 127 },
|
---|
| 121 | // //Bopomofo,
|
---|
| 122 | // { 51, 127 },
|
---|
| 123 | // //Yi,
|
---|
| 124 | // { 83, 127 },
|
---|
| 125 | //
|
---|
| 126 | // // Additional Scripts
|
---|
| 127 | // //Ethiopic,
|
---|
| 128 | // { 75, 127 },
|
---|
| 129 | // //Cherokee,
|
---|
| 130 | // { 76, 127 },
|
---|
| 131 | // //CanadianAboriginal,
|
---|
| 132 | // { 77, 127 },
|
---|
| 133 | // //Mongolian,
|
---|
| 134 | // { 81, 127 },
|
---|
| 135 | //
|
---|
| 136 | // // Symbols
|
---|
| 137 | // //CurrencySymbols,
|
---|
| 138 | // { 33, 127 },
|
---|
| 139 | // //LetterlikeSymbols,
|
---|
| 140 | // { 35, 127 },
|
---|
| 141 | // //NumberForms,
|
---|
| 142 | // { 36, 127 },
|
---|
| 143 | // //MathematicalOperators,
|
---|
| 144 | // { 38, 127 },
|
---|
| 145 | // //TechnicalSymbols,
|
---|
| 146 | // { 39, 127 },
|
---|
| 147 | // //GeometricSymbols,
|
---|
| 148 | // { 43, 127 },
|
---|
| 149 | // //MiscellaneousSymbols,
|
---|
| 150 | // { 46, 127 },
|
---|
| 151 | // //EnclosedAndSquare,
|
---|
| 152 | // { 42, 127 },
|
---|
| 153 | // //Braille,
|
---|
| 154 | // { 82, 127 },
|
---|
| 155 | //
|
---|
| 156 | // //Unicode,
|
---|
| 157 | // { 126, 126 },
|
---|
| 158 | //
|
---|
| 159 | // // some scripts added in Unicode 3.2
|
---|
| 160 | // //Tagalog,
|
---|
| 161 | // { 84, 127 },
|
---|
| 162 | // //Hanunoo,
|
---|
| 163 | // { 84, 127 },
|
---|
| 164 | // //Buhid,
|
---|
| 165 | // { 84, 127 },
|
---|
| 166 | // //Tagbanwa,
|
---|
| 167 | // { 84, 127 }
|
---|
| 168 | //};
|
---|
| 169 | //
|
---|
| 170 | //
|
---|
| 171 | //#define SimplifiedChineseCsbBit 18
|
---|
| 172 | //#define TraditionalChineseCsbBit 20
|
---|
| 173 | //#define JapaneseCsbBit 17
|
---|
| 174 | //#define KoreanCsbBit 21
|
---|
| 175 |
|
---|
| 176 | //@@TODO (dmik): remove
|
---|
| 177 | //static
|
---|
| 178 | //int CALLBACK
|
---|
| 179 | //#ifndef Q_OS_TEMP
|
---|
| 180 | //storeFont( ENUMLOGFONTEX* f, NEWTEXTMETRICEX *textmetric, int type, LPARAM /*p*/ )
|
---|
| 181 | //#else
|
---|
| 182 | //storeFont( ENUMLOGFONTEX* f, NEWTEXTMETRIC *textmetric, int type, LPARAM /*p*/ )
|
---|
| 183 | //#endif
|
---|
| 184 | //{
|
---|
| 185 | // const int script = QFont::Unicode;
|
---|
| 186 | // const QString foundryName;
|
---|
| 187 | // const bool smoothScalable = TRUE;
|
---|
| 188 | // const bool oblique = FALSE;
|
---|
| 189 | // Q_UNUSED( script );
|
---|
| 190 | // Q_UNUSED( smoothScalable );
|
---|
| 191 | //
|
---|
| 192 | // bool italic = FALSE;
|
---|
| 193 | // QString familyName;
|
---|
| 194 | // int weight;
|
---|
| 195 | // bool fixed;
|
---|
| 196 | //
|
---|
| 197 | // // ### make non scalable fonts work
|
---|
| 198 | //
|
---|
| 199 | // QT_WA( {
|
---|
| 200 | // familyName = QString::fromUcs2( (ushort*)f->elfLogFont.lfFaceName );
|
---|
| 201 | // italic = f->elfLogFont.lfItalic;
|
---|
| 202 | // weight = f->elfLogFont.lfWeight;
|
---|
| 203 | // TEXTMETRIC *tm = (TEXTMETRIC *)textmetric;
|
---|
| 204 | // fixed = !(tm->tmPitchAndFamily & TMPF_FIXED_PITCH);
|
---|
| 205 | // } , {
|
---|
| 206 | // ENUMLOGFONTEXA* fa = (ENUMLOGFONTEXA *)f;
|
---|
| 207 | // familyName = QString::fromLocal8Bit( fa->elfLogFont.lfFaceName );
|
---|
| 208 | // italic = fa->elfLogFont.lfItalic;
|
---|
| 209 | // weight = fa->elfLogFont.lfWeight;
|
---|
| 210 | // TEXTMETRICA *tm = (TEXTMETRICA *)textmetric;
|
---|
| 211 | // fixed = !(tm->tmPitchAndFamily & TMPF_FIXED_PITCH);
|
---|
| 212 | // } );
|
---|
| 213 | // // the "@family" fonts are just the same as "family". Ignore them.
|
---|
| 214 | // if ( familyName[0] != '@' ) {
|
---|
| 215 | // QtFontStyle::Key styleKey;
|
---|
| 216 | // styleKey.italic = italic;
|
---|
| 217 | // styleKey.oblique = oblique;
|
---|
| 218 | // if ( weight < 400 )
|
---|
| 219 | // styleKey.weight = QFont::Light;
|
---|
| 220 | // else if ( weight < 600 )
|
---|
| 221 | // styleKey.weight = QFont::Normal;
|
---|
| 222 | // else if ( weight < 700 )
|
---|
| 223 | // styleKey.weight = QFont::DemiBold;
|
---|
| 224 | // else if ( weight < 800 )
|
---|
| 225 | // styleKey.weight = QFont::Bold;
|
---|
| 226 | // else
|
---|
| 227 | // styleKey.weight = QFont::Black;
|
---|
| 228 | //
|
---|
| 229 | // QString rawName = familyName;
|
---|
| 230 | // familyName.replace('-', ' ');
|
---|
| 231 | // QtFontFamily *family = db->family( familyName, TRUE );
|
---|
| 232 | // family->rawName = rawName;
|
---|
| 233 | //
|
---|
| 234 | // QtFontFoundry *foundry = family->foundry( foundryName, TRUE );
|
---|
| 235 | // QtFontStyle *style = foundry->style( styleKey, TRUE );
|
---|
| 236 | // style->smoothScalable = TRUE;
|
---|
| 237 | // style->pixelSize( SMOOTH_SCALABLE, TRUE );
|
---|
| 238 | //
|
---|
| 239 | // // add fonts windows can generate for us:
|
---|
| 240 | // if ( styleKey.weight <= QFont::DemiBold ) {
|
---|
| 241 | // QtFontStyle::Key key( styleKey );
|
---|
| 242 | // key.weight = QFont::Bold;
|
---|
| 243 | // QtFontStyle *style = foundry->style( key, TRUE );
|
---|
| 244 | // style->smoothScalable = TRUE;
|
---|
| 245 | // style->pixelSize( SMOOTH_SCALABLE, TRUE );
|
---|
| 246 | // }
|
---|
| 247 | // if ( !styleKey.italic ) {
|
---|
| 248 | // QtFontStyle::Key key( styleKey );
|
---|
| 249 | // key.italic = TRUE;
|
---|
| 250 | // QtFontStyle *style = foundry->style( key, TRUE );
|
---|
| 251 | // style->smoothScalable = TRUE;
|
---|
| 252 | // style->pixelSize( SMOOTH_SCALABLE, TRUE );
|
---|
| 253 | // }
|
---|
| 254 | // if ( styleKey.weight <= QFont::DemiBold && !styleKey.italic ) {
|
---|
| 255 | // QtFontStyle::Key key( styleKey );
|
---|
| 256 | // key.weight = QFont::Bold;
|
---|
| 257 | // key.italic = TRUE;
|
---|
| 258 | // QtFontStyle *style = foundry->style( key, TRUE );
|
---|
| 259 | // style->smoothScalable = TRUE;
|
---|
| 260 | // style->pixelSize( SMOOTH_SCALABLE, TRUE );
|
---|
| 261 | // }
|
---|
| 262 | //
|
---|
| 263 | // family->fixedPitch = fixed;
|
---|
| 264 | //
|
---|
| 265 | // if ( !family->scriptCheck && type & TRUETYPE_FONTTYPE ) {
|
---|
| 266 | // bool hasScript = false;
|
---|
| 267 | // FONTSIGNATURE signature;
|
---|
| 268 | //#ifndef Q_OS_TEMP
|
---|
| 269 | // QT_WA( {
|
---|
| 270 | // signature = textmetric->ntmFontSig;
|
---|
| 271 | // }, {
|
---|
| 272 | // // the textmetric structure we get from EnumFontFamiliesEx on Win9x has
|
---|
| 273 | // // a FONTSIGNATURE, but that one is uninitialized and doesn't work. Have to go
|
---|
| 274 | // // the hard way and load the font to find out.
|
---|
| 275 | // HDC hdc = GetDC( 0 );
|
---|
| 276 | // LOGFONTA lf;
|
---|
| 277 | // memset( &lf, 0, sizeof( LOGFONTA ) );
|
---|
| 278 | // QCString lfam = familyName.local8Bit();
|
---|
| 279 | // memcpy( lf.lfFaceName, familyName.local8Bit(), QMIN( LF_FACESIZE, familyName.local8Bit().length() ) );
|
---|
| 280 | // HFONT hfont = CreateFontIndirectA( &lf );
|
---|
| 281 | // HGDIOBJ oldobj = SelectObject( hdc, hfont );
|
---|
| 282 | // GetTextCharsetInfo( hdc, &signature, 0 );
|
---|
| 283 | // SelectObject( hdc, oldobj );
|
---|
| 284 | // DeleteObject( hfont );
|
---|
| 285 | // ReleaseDC( 0, hdc );
|
---|
| 286 | // } );
|
---|
| 287 | //#else
|
---|
| 288 | // CHARSETINFO csi;
|
---|
| 289 | // DWORD charset = textmetric->tmCharSet;
|
---|
| 290 | // TranslateCharsetInfo( &charset, &csi, TCI_SRCCHARSET);
|
---|
| 291 | // signature = csi.fs;
|
---|
| 292 | //#endif
|
---|
| 293 | //
|
---|
| 294 | // int i;
|
---|
| 295 | // for( i = 0; i < QFont::Unicode; i++ ) {
|
---|
| 296 | // int bit = requiredUnicodeBits[i][0];
|
---|
| 297 | // int index = bit/32;
|
---|
| 298 | // int flag = 1 << (bit&31);
|
---|
| 299 | // if ( bit != 126 && signature.fsUsb[index] & flag ) {
|
---|
| 300 | // bit = requiredUnicodeBits[i][1];
|
---|
| 301 | // index = bit/32;
|
---|
| 302 | //
|
---|
| 303 | // flag = 1 << (bit&31);
|
---|
| 304 | // if ( bit == 127 || signature.fsUsb[index] & flag ) {
|
---|
| 305 | // family->scripts[i] = TRUE;
|
---|
| 306 | // hasScript = TRUE;
|
---|
| 307 | // // qDebug( "font %s: index=%d, flag=%8x supports script %d", familyName.latin1(), index, flag, i );
|
---|
| 308 | // }
|
---|
| 309 | // }
|
---|
| 310 | // }
|
---|
| 311 | // // ### until we do language detection, it's going to be
|
---|
| 312 | // // ### hard to figure out which Han_* variant to
|
---|
| 313 | // // ### use... simply mark all Han_* variants as supporting
|
---|
| 314 | // // ### Han (like X11)
|
---|
| 315 | // if( signature.fsCsb[0] & (1 << SimplifiedChineseCsbBit) ) {
|
---|
| 316 | // family->scripts[QFont::Han_SimplifiedChinese] = TRUE;
|
---|
| 317 | // family->scripts[QFont::Han] = TRUE;
|
---|
| 318 | // hasScript = TRUE;
|
---|
| 319 | // //qDebug("font %s supports Simplified Chinese", familyName.latin1() );
|
---|
| 320 | // }
|
---|
| 321 | // if( signature.fsCsb[0] & (1 << TraditionalChineseCsbBit) ) {
|
---|
| 322 | // family->scripts[QFont::Han_TraditionalChinese] = TRUE;
|
---|
| 323 | // family->scripts[QFont::Han] = TRUE;
|
---|
| 324 | // hasScript = TRUE;
|
---|
| 325 | // //qDebug("font %s supports Traditional Chinese", familyName.latin1() );
|
---|
| 326 | // }
|
---|
| 327 | // if( signature.fsCsb[0] & (1 << JapaneseCsbBit) ) {
|
---|
| 328 | // family->scripts[QFont::Han_Japanese] = TRUE;
|
---|
| 329 | // family->scripts[QFont::Hiragana] = TRUE;
|
---|
| 330 | // family->scripts[QFont::Katakana] = TRUE;
|
---|
| 331 | // family->scripts[QFont::Han] = TRUE;
|
---|
| 332 | // hasScript = TRUE;
|
---|
| 333 | // //qDebug("font %s supports Japanese", familyName.latin1() );
|
---|
| 334 | // }
|
---|
| 335 | // if( signature.fsCsb[0] & (1 << KoreanCsbBit) ) {
|
---|
| 336 | // family->scripts[QFont::Han_Korean] = TRUE;
|
---|
| 337 | // family->scripts[QFont::Hangul] = TRUE;
|
---|
| 338 | // family->scripts[QFont::Han] = TRUE;
|
---|
| 339 | // hasScript = TRUE;
|
---|
| 340 | // //qDebug("font %s supports Korean", familyName.latin1() );
|
---|
| 341 | // }
|
---|
| 342 | //
|
---|
| 343 | //#ifdef Q_OS_TEMP
|
---|
| 344 | // // ##### FIXME
|
---|
| 345 | // family->scripts[QFont::Latin] = TRUE;
|
---|
| 346 | //#endif
|
---|
| 347 | // family->scripts[QFont::Unicode] = !hasScript;
|
---|
| 348 | // family->scriptCheck = true;
|
---|
| 349 | // // qDebug( "usb=%08x %08x csb=%08x for %s", signature.fsUsb[0], signature.fsUsb[1], signature.fsCsb[0], familyName.latin1() );
|
---|
| 350 | // } else if (!family->scriptCheck) {
|
---|
| 351 | // family->scripts[QFont::Unicode] = TRUE;
|
---|
| 352 | // }
|
---|
| 353 | // }
|
---|
| 354 | //
|
---|
| 355 | // // keep on enumerating
|
---|
| 356 | // return 1;
|
---|
| 357 | //}
|
---|
| 358 |
|
---|
| 359 | //@@TODO (dmik): remove
|
---|
| 360 | //static
|
---|
| 361 | //void populate_database(const QString& fam)
|
---|
| 362 | //{
|
---|
| 363 | // HDC dummy = GetDC(0);
|
---|
| 364 | //
|
---|
| 365 | //#ifndef Q_OS_TEMP
|
---|
| 366 | // QT_WA( {
|
---|
| 367 | // LOGFONT lf;
|
---|
| 368 | // lf.lfCharSet = DEFAULT_CHARSET;
|
---|
| 369 | // if ( fam.isNull() ) {
|
---|
| 370 | // lf.lfFaceName[0] = 0;
|
---|
| 371 | // } else {
|
---|
| 372 | // memcpy( lf.lfFaceName, fam.ucs2(), sizeof(TCHAR)*QMIN(fam.length()+1,32)); // 32 = Windows hard-coded
|
---|
| 373 | // }
|
---|
| 374 | // lf.lfPitchAndFamily = 0;
|
---|
| 375 | //
|
---|
| 376 | // EnumFontFamiliesEx( dummy, &lf,
|
---|
| 377 | // (FONTENUMPROC)storeFont, (LPARAM)db, 0 );
|
---|
| 378 | // } , {
|
---|
| 379 | // LOGFONTA lf;
|
---|
| 380 | // lf.lfCharSet = DEFAULT_CHARSET;
|
---|
| 381 | // if ( fam.isNull() ) {
|
---|
| 382 | // lf.lfFaceName[0] = 0;
|
---|
| 383 | // } else {
|
---|
| 384 | // QCString lname = fam.local8Bit();
|
---|
| 385 | // memcpy(lf.lfFaceName,lname.data(),
|
---|
| 386 | // QMIN(lname.length()+1,32)); // 32 = Windows hard-coded
|
---|
| 387 | // }
|
---|
| 388 | // lf.lfPitchAndFamily = 0;
|
---|
| 389 | //
|
---|
| 390 | // EnumFontFamiliesExA( dummy, &lf,
|
---|
| 391 | // (FONTENUMPROCA)storeFont, (LPARAM)db, 0 );
|
---|
| 392 | // } );
|
---|
| 393 | //#else
|
---|
| 394 | // LOGFONT lf;
|
---|
| 395 | // lf.lfCharSet = DEFAULT_CHARSET;
|
---|
| 396 | // if ( fam.isNull() ) {
|
---|
| 397 | // lf.lfFaceName[0] = 0;
|
---|
| 398 | // } else {
|
---|
| 399 | // memcpy( lf.lfFaceName, fam.ucs2(), sizeof(TCHAR)*QMIN(fam.length()+1,32)); // 32 = Windows hard-coded
|
---|
| 400 | // }
|
---|
| 401 | // lf.lfPitchAndFamily = 0;
|
---|
| 402 | //
|
---|
| 403 | // EnumFontFamilies( dummy, lf.lfFaceName,
|
---|
| 404 | // (FONTENUMPROC)storeFont, (LPARAM)db );
|
---|
| 405 | //#endif
|
---|
| 406 | //
|
---|
| 407 | //
|
---|
| 408 | // ReleaseDC(0, dummy);
|
---|
| 409 | //}
|
---|
| 410 |
|
---|
| 411 | //@@TODO (dmik): remove
|
---|
| 412 | //static void initializeDb()
|
---|
| 413 | //{
|
---|
| 414 | // if ( db ) return;
|
---|
| 415 | //
|
---|
| 416 | // db = new QFontDatabasePrivate;
|
---|
| 417 | // qfontdatabase_cleanup.set(&db);
|
---|
| 418 | //
|
---|
| 419 | ////@@TODO (dmik): remove
|
---|
| 420 | //// populate_database( QString::null );
|
---|
| 421 | //
|
---|
| 422 | //#ifdef QFONTDATABASE_DEBUG
|
---|
| 423 | // // print the database
|
---|
| 424 | // for ( int f = 0; f < db->count; f++ ) {
|
---|
| 425 | // QtFontFamily *family = db->families[f];
|
---|
| 426 | // qDebug(" %s: %p", family->name.latin1(), family );
|
---|
| 427 | // populate_database( family->name );
|
---|
| 428 | //
|
---|
| 429 | // qDebug(" scripts supported:");
|
---|
| 430 | // for ( int i = 0; i < QFont::NScripts; i++ )
|
---|
| 431 | // if(family->scripts[i] & QtFontFamily::Supported)
|
---|
| 432 | // qDebug(" %d", i );
|
---|
| 433 | // for ( int fd = 0; fd < family->count; fd++ ) {
|
---|
| 434 | // QtFontFoundry *foundry = family->foundries[fd];
|
---|
| 435 | // qDebug(" %s", foundry->name.latin1() );
|
---|
| 436 | // for ( int s = 0; s < foundry->count; s++ ) {
|
---|
| 437 | // QtFontStyle *style = foundry->styles[s];
|
---|
| 438 | // qDebug(" style: italic=%d oblique=%d weight=%d", style->key.italic,
|
---|
| 439 | // style->key.oblique, style->key.weight );
|
---|
| 440 | // }
|
---|
| 441 | // }
|
---|
| 442 | // }
|
---|
| 443 | //#endif // QFONTDATABASE_DEBUG
|
---|
| 444 | //
|
---|
| 445 | //}
|
---|
| 446 | //
|
---|
| 447 | //void QFontDatabase::createDatabase()
|
---|
| 448 | //{
|
---|
| 449 | // initializeDb();
|
---|
| 450 | //}
|
---|
| 451 |
|
---|
| 452 | //@@TODO (dmik): remove
|
---|
| 453 | //static inline void load(const QString &/*family*/ = QString::null, int = -1 )
|
---|
| 454 | //{
|
---|
| 455 | // populate_database( family );
|
---|
| 456 | //}
|
---|
| 457 |
|
---|
| 458 | void QFontDatabasePrivate::reload() {
|
---|
| 459 | cleanup();
|
---|
| 460 |
|
---|
| 461 | // empty foundry
|
---|
| 462 | const QString foundryName;
|
---|
| 463 |
|
---|
| 464 | int hps = qt_display_ps();
|
---|
| 465 |
|
---|
| 466 | LONG cFonts = 0;
|
---|
| 467 | cFonts = GpiQueryFonts( hps, QF_PUBLIC, NULL, &cFonts, 0, NULL );
|
---|
| 468 | PFONTMETRICS afm = new FONTMETRICS [cFonts];
|
---|
| 469 | GpiQueryFonts( hps, QF_PUBLIC, NULL, &cFonts, sizeof(FONTMETRICS), afm );
|
---|
| 470 |
|
---|
| 471 | LONG info [2];
|
---|
| 472 | DevQueryCaps( GpiQueryDevice( hps ), CAPS_HORIZONTAL_FONT_RES, 2, info );
|
---|
| 473 | LONG xRes = info [0], yRes = info [1];
|
---|
| 474 |
|
---|
| 475 | for ( PFONTMETRICS fm = afm ; cFonts ; cFonts--, fm++ ) {
|
---|
| 476 |
|
---|
| 477 | // ignore the default (lMatch = 0) GPI font, since it is always
|
---|
| 478 | // present with non-zero lMatch in the list
|
---|
| 479 | if ( !fm->lMatch )
|
---|
| 480 | continue;
|
---|
| 481 |
|
---|
| 482 | QString familyName = QString::fromLocal8Bit( fm->szFamilyname );
|
---|
| 483 | bool italic = fm->fsSelection & FM_SEL_ITALIC;
|
---|
| 484 | bool fixed = fm->fsType & FM_TYPE_FIXED;
|
---|
| 485 | bool scalable = fm->fsDefn & FM_DEFN_OUTLINE;
|
---|
| 486 | USHORT weight = fm->usWeightClass;
|
---|
| 487 | USHORT width = fm->usWidthClass;
|
---|
| 488 |
|
---|
| 489 | // ignore bitmap fonts that do not match the current device resolution
|
---|
| 490 | if ( !scalable && (fm->sXDeviceRes != xRes || fm->sYDeviceRes != yRes) )
|
---|
| 491 | continue;
|
---|
| 492 |
|
---|
| 493 | //@@TODO (dmik): is the below correct?
|
---|
| 494 | // the "@family" fonts are the same as "family", but for some Bidi
|
---|
| 495 | // purposes (?) (and normally used by PM automatically as required).
|
---|
| 496 | // Ignore them.
|
---|
| 497 | if ( familyName[0] == '@' )
|
---|
| 498 | continue;
|
---|
| 499 |
|
---|
| 500 | QtFontStyle::Key styleKey;
|
---|
| 501 | styleKey.italic = italic;
|
---|
| 502 | styleKey.oblique = FALSE;
|
---|
| 503 |
|
---|
| 504 | if ( weight < 4 )
|
---|
| 505 | styleKey.weight = QFont::Light;
|
---|
| 506 | else if ( weight < 6 )
|
---|
| 507 | styleKey.weight = QFont::Normal;
|
---|
| 508 | else if ( weight < 7 )
|
---|
| 509 | styleKey.weight = QFont::DemiBold;
|
---|
| 510 | else if ( weight < 8 )
|
---|
| 511 | styleKey.weight = QFont::Bold;
|
---|
| 512 | else
|
---|
| 513 | styleKey.weight = QFont::Black;
|
---|
| 514 |
|
---|
| 515 | switch ( width ) {
|
---|
| 516 | case 1: styleKey.stretch = QFont::UltraCondensed; break;
|
---|
| 517 | case 2: styleKey.stretch = QFont::ExtraCondensed; break;
|
---|
| 518 | case 3: styleKey.stretch = QFont::Condensed; break;
|
---|
| 519 | case 4: styleKey.stretch = QFont::SemiCondensed; break;
|
---|
| 520 | case 5: styleKey.stretch = QFont::Unstretched; break;
|
---|
| 521 | case 6: styleKey.stretch = QFont::SemiExpanded; break;
|
---|
| 522 | case 7: styleKey.stretch = QFont::Expanded; break;
|
---|
| 523 | case 8: styleKey.stretch = QFont::ExtraExpanded; break;
|
---|
| 524 | case 9: styleKey.stretch = QFont::UltraExpanded; break;
|
---|
| 525 | default: styleKey.stretch = QFont::Unstretched; break;
|
---|
| 526 | }
|
---|
| 527 |
|
---|
| 528 | familyName.replace( '-', ' ' );
|
---|
| 529 | QtFontFamily *family = this->family( familyName, TRUE );
|
---|
| 530 | //@@TODO (dmik): is it possible that the same family is both fixed and not?
|
---|
| 531 | family->fixedPitch = fixed;
|
---|
| 532 |
|
---|
| 533 | QtFontFoundry *foundry = family->foundry( foundryName, TRUE );
|
---|
| 534 | QtFontStyle *style = foundry->style( styleKey, TRUE );
|
---|
| 535 |
|
---|
| 536 | // add new scalable style only if it hasn't been already added --
|
---|
| 537 | // the first one of two duplicate (in Qt terms) non-bitmap font
|
---|
| 538 | // styles wins.
|
---|
| 539 | if ( scalable && style->smoothScalable )
|
---|
| 540 | continue;
|
---|
| 541 |
|
---|
| 542 | if ( style->szFacename[0] ) {
|
---|
| 543 | // if a duplicate (having the same style in Qt terms) bitmap
|
---|
| 544 | // font is encountered but it has the different facename, ignore
|
---|
| 545 | // it (we have only one facename field per style -- it should be
|
---|
| 546 | // the same for all sizes otherwise we will not be able to create
|
---|
| 547 | // a font with some sizes later).
|
---|
| 548 | if ( strcmp( style->szFacename, fm->szFacename ) )
|
---|
| 549 | continue;
|
---|
| 550 | } else {
|
---|
| 551 | strcpy( style->szFacename, fm->szFacename );
|
---|
| 552 | }
|
---|
| 553 |
|
---|
| 554 | if ( scalable ) {
|
---|
| 555 | style->smoothScalable = TRUE;
|
---|
| 556 | QtFontSize *size =
|
---|
| 557 | style->pixelSize( SMOOTH_SCALABLE, TRUE, fm->sNominalPointSize );
|
---|
| 558 | size->lMatch = fm->lMatch;
|
---|
| 559 | } else {
|
---|
| 560 | QtFontSize *size =
|
---|
| 561 | style->pixelSize( fm->lEmHeight, TRUE, fm->sNominalPointSize );
|
---|
| 562 | // the first bitmap style with a given pixel and point size wins
|
---|
| 563 | if ( size->lMatch )
|
---|
| 564 | continue;
|
---|
| 565 | size->lMatch = fm->lMatch;
|
---|
| 566 | }
|
---|
| 567 |
|
---|
| 568 | }
|
---|
| 569 |
|
---|
| 570 | delete [] afm;
|
---|
| 571 |
|
---|
| 572 | #ifdef QFONTDATABASE_DEBUG
|
---|
| 573 | // print the database
|
---|
| 574 | for ( int f = 0; f < count; f++ ) {
|
---|
| 575 | QtFontFamily *family = families[f];
|
---|
| 576 | qDebug(" %s: %p", family->name.latin1(), family );
|
---|
| 577 | for ( int fd = 0; fd < family->count; fd++ ) {
|
---|
| 578 | QtFontFoundry *foundry = family->foundries[fd];
|
---|
| 579 | qDebug(" %s", foundry->name.latin1() );
|
---|
| 580 | for ( int s = 0; s < foundry->count; s++ ) {
|
---|
| 581 | QtFontStyle *style = foundry->styles[s];
|
---|
| 582 | qDebug(" style: italic=%d oblique=%d weight=%d face=%s",
|
---|
| 583 | style->key.italic,
|
---|
| 584 | style->key.oblique, style->key.weight,
|
---|
| 585 | style->szFacename
|
---|
| 586 | );
|
---|
| 587 | for ( int sz = 0; sz < style->count; sz++ ) {
|
---|
| 588 | QtFontSize size = style->pixelSizes[sz];
|
---|
| 589 | qDebug(" size: px=%d, pt=%d, lMatch=%ld",
|
---|
| 590 | size.pixelSize, size.pointSize,
|
---|
| 591 | size.lMatch
|
---|
| 592 | );
|
---|
| 593 | }
|
---|
| 594 | }
|
---|
| 595 | }
|
---|
| 596 | }
|
---|
| 597 | #endif // QFONTDATABASE_DEBUG
|
---|
| 598 | }
|
---|
| 599 |
|
---|
| 600 |
|
---|
| 601 |
|
---|
| 602 | // --------------------------------------------------------------------------------------
|
---|
| 603 | // font loader
|
---|
| 604 | // --------------------------------------------------------------------------------------
|
---|
| 605 |
|
---|
| 606 |
|
---|
| 607 | //@@TODO (dmik): remove
|
---|
| 608 | //#if 0
|
---|
| 609 | //void QFontPrivate::initFontInfo()
|
---|
| 610 | //{
|
---|
| 611 | // lineWidth = 1;
|
---|
| 612 | // actual = request; // most settings are equal
|
---|
| 613 | // QT_WA( {
|
---|
| 614 | // TCHAR n[64];
|
---|
| 615 | // GetTextFaceW( fin->dc(), 64, n );
|
---|
| 616 | // actual.family = QString::fromUcs2((ushort*)n);
|
---|
| 617 | // actual.fixedPitch = !(fin->tm.w.tmPitchAndFamily & TMPF_FIXED_PITCH);
|
---|
| 618 | // } , {
|
---|
| 619 | // char an[64];
|
---|
| 620 | // GetTextFaceA( fin->dc(), 64, an );
|
---|
| 621 | // actual.family = QString::fromLocal8Bit(an);
|
---|
| 622 | // actual.fixedPitch = !(fin->tm.a.tmPitchAndFamily & TMPF_FIXED_PITCH);
|
---|
| 623 | // } );
|
---|
| 624 | // if ( actual.pointSize == -1 ) {
|
---|
| 625 | // if ( paintdevice )
|
---|
| 626 | // actual.pointSize = actual.pixelSize * 720 / QPaintDeviceMetrics( paintdevice ).logicalDpiY();
|
---|
| 627 | // else {
|
---|
| 628 | // actual.pointSize = actual.pixelSize * 720 / GetDeviceCaps( fin->dc(), LOGPIXELSY );
|
---|
| 629 | // }
|
---|
| 630 | // } else if ( actual.pixelSize == -1 ) {
|
---|
| 631 | // if ( paintdevice )
|
---|
| 632 | // actual.pixelSize = actual.pointSize * QPaintDeviceMetrics( paintdevice ).logicalDpiY() / 720;
|
---|
| 633 | // else
|
---|
| 634 | // actual.pixelSize = actual.pointSize * GetDeviceCaps( fin->dc(), LOGPIXELSY ) / 720;
|
---|
| 635 | // }
|
---|
| 636 | //
|
---|
| 637 | // actual.dirty = FALSE;
|
---|
| 638 | // exactMatch = ( actual.family == request.family &&
|
---|
| 639 | // ( request.pointSize == -1 || ( actual.pointSize == request.pointSize ) ) &&
|
---|
| 640 | // ( request.pixelSize == -1 || ( actual.pixelSize == request.pixelSize ) ) &&
|
---|
| 641 | // actual.fixedPitch == request.fixedPitch );
|
---|
| 642 | //}
|
---|
| 643 | //
|
---|
| 644 | //#endif
|
---|
| 645 |
|
---|
| 646 |
|
---|
| 647 | //@@TODO (dmik): remove
|
---|
| 648 | //static inline HFONT systemFont()
|
---|
| 649 | //{
|
---|
| 650 | // if ( stock_sysfont == 0 )
|
---|
| 651 | // stock_sysfont = (HFONT)GetStockObject(SYSTEM_FONT);
|
---|
| 652 | // return stock_sysfont;
|
---|
| 653 | //}
|
---|
| 654 | //
|
---|
| 655 | //#if !defined(DEFAULT_GUI_FONT)
|
---|
| 656 | //#define DEFAULT_GUI_FONT 17
|
---|
| 657 | //#endif
|
---|
| 658 |
|
---|
| 659 |
|
---|
| 660 | QFontEngine *loadEngine(
|
---|
| 661 | QFont::Script script, const QFontPrivate *fp, const QFontDef &request,
|
---|
| 662 | QtFontFamily *family, QtFontFoundry *foundry, QtFontStyle *style,
|
---|
| 663 | QtFontSize *size
|
---|
| 664 | ) {
|
---|
| 665 | Q_UNUSED( script );
|
---|
| 666 | Q_UNUSED( request );
|
---|
| 667 | Q_UNUSED( family );
|
---|
| 668 | Q_UNUSED( foundry );
|
---|
| 669 |
|
---|
| 670 | FATTRS fa;
|
---|
| 671 | memset( &fa, 0, sizeof(FATTRS) );
|
---|
| 672 |
|
---|
| 673 | QPaintDevice *paintdevice = fp->paintdevice;
|
---|
| 674 |
|
---|
| 675 | HPS hps = 0;
|
---|
| 676 | if ( paintdevice )
|
---|
| 677 | hps = paintdevice->handle();
|
---|
| 678 |
|
---|
| 679 | fa.usRecordLength = sizeof(FATTRS);
|
---|
| 680 | strcpy( fa.szFacename, style->szFacename );
|
---|
| 681 | fa.lMatch = size->lMatch;
|
---|
| 682 |
|
---|
| 683 | int pixelSize = size->pixelSize;
|
---|
| 684 | int pointSize = size->pointSize;
|
---|
| 685 | if ( pixelSize == SMOOTH_SCALABLE ) {
|
---|
| 686 | fa.fsFontUse = FATTR_FONTUSE_OUTLINE;
|
---|
| 687 | int dpi;
|
---|
| 688 | if ( fp->paintdevice ) {
|
---|
| 689 | dpi = QPaintDeviceMetrics( fp->paintdevice ).logicalDpiY();
|
---|
| 690 | } else {
|
---|
| 691 | DevQueryCaps( GpiQueryDevice( qt_display_ps() ),
|
---|
| 692 | CAPS_VERTICAL_FONT_RES, 1, (PLONG) &dpi );
|
---|
| 693 | }
|
---|
| 694 | if (request.pointSize) {
|
---|
| 695 | pixelSize = (request.pointSize * dpi + 360) / 720;
|
---|
| 696 | pointSize = request.pointSize;
|
---|
| 697 | } else {
|
---|
| 698 | // if pointSize is zero, then the user has specified the font size
|
---|
| 699 | // in pixels (see QFontPrivate::load())
|
---|
| 700 | pixelSize = request.pixelSize;
|
---|
| 701 | pointSize = (request.pixelSize * 720 + dpi / 2) / dpi;
|
---|
| 702 | }
|
---|
| 703 | }
|
---|
| 704 |
|
---|
| 705 | return new QFontEnginePM( hps, &fa, pixelSize, pointSize );
|
---|
| 706 | }
|
---|
| 707 |
|
---|
| 708 | //@@TODO (dmik): remove
|
---|
| 709 | //static
|
---|
| 710 | //QFontEngine *loadEngine( QFont::Script script, const QFontPrivate *fp,
|
---|
| 711 | // const QFontDef &request,
|
---|
| 712 | // QtFontFamily *family, QtFontFoundry *foundry,
|
---|
| 713 | // QtFontStyle *style )
|
---|
| 714 | //{
|
---|
| 715 | // Q_UNUSED( script );
|
---|
| 716 | // Q_UNUSED( foundry );
|
---|
| 717 | // Q_UNUSED( style );
|
---|
| 718 | //
|
---|
| 719 | // LOGFONT lf;
|
---|
| 720 | // memset( &lf, 0, sizeof(LOGFONT) );
|
---|
| 721 | //
|
---|
| 722 | // QPaintDevice *paintdevice = fp->paintdevice;
|
---|
| 723 | //
|
---|
| 724 | // HDC hdc;
|
---|
| 725 | // if ( paintdevice ) {
|
---|
| 726 | // hdc = paintdevice->handle();
|
---|
| 727 | // } else if ( qt_winver & Qt::WV_NT_based ) {
|
---|
| 728 | // hdc = GetDC( 0 );
|
---|
| 729 | // } else {
|
---|
| 730 | // hdc = shared_dc;
|
---|
| 731 | // }
|
---|
| 732 | //
|
---|
| 733 | // bool stockFont = FALSE;
|
---|
| 734 | //
|
---|
| 735 | // HFONT hfont = 0;
|
---|
| 736 | //
|
---|
| 737 | // if ( fp->rawMode ) { // will choose a stock font
|
---|
| 738 | // int f, deffnt;
|
---|
| 739 | // // ### why different?
|
---|
| 740 | // if ( (qt_winver & Qt::WV_NT_based) || qt_winver == Qt::WV_32s )
|
---|
| 741 | // deffnt = SYSTEM_FONT;
|
---|
| 742 | // else
|
---|
| 743 | // deffnt = DEFAULT_GUI_FONT;
|
---|
| 744 | // QString fam = family->rawName.lower();
|
---|
| 745 | // if ( fam == "default" )
|
---|
| 746 | // f = deffnt;
|
---|
| 747 | // else if ( fam == "system" )
|
---|
| 748 | // f = SYSTEM_FONT;
|
---|
| 749 | //#ifndef Q_OS_TEMP
|
---|
| 750 | // else if ( fam == "system_fixed" )
|
---|
| 751 | // f = SYSTEM_FIXED_FONT;
|
---|
| 752 | // else if ( fam == "ansi_fixed" )
|
---|
| 753 | // f = ANSI_FIXED_FONT;
|
---|
| 754 | // else if ( fam == "ansi_var" )
|
---|
| 755 | // f = ANSI_VAR_FONT;
|
---|
| 756 | // else if ( fam == "device_default" )
|
---|
| 757 | // f = DEVICE_DEFAULT_FONT;
|
---|
| 758 | // else if ( fam == "oem_fixed" )
|
---|
| 759 | // f = OEM_FIXED_FONT;
|
---|
| 760 | //#endif
|
---|
| 761 | // else if ( fam[0] == '#' )
|
---|
| 762 | // f = fam.right(fam.length()-1).toInt();
|
---|
| 763 | // else
|
---|
| 764 | // f = deffnt;
|
---|
| 765 | // hfont = (HFONT)GetStockObject( f );
|
---|
| 766 | // if ( !hfont ) {
|
---|
| 767 | //#ifndef QT_NO_DEBUG
|
---|
| 768 | // qSystemWarning( "GetStockObject failed" );
|
---|
| 769 | //#endif
|
---|
| 770 | // hfont = systemFont();
|
---|
| 771 | // }
|
---|
| 772 | // stockFont = TRUE;
|
---|
| 773 | // } else {
|
---|
| 774 | //
|
---|
| 775 | // int hint = FF_DONTCARE;
|
---|
| 776 | // switch ( request.styleHint ) {
|
---|
| 777 | // case QFont::Helvetica:
|
---|
| 778 | // hint = FF_SWISS;
|
---|
| 779 | // break;
|
---|
| 780 | // case QFont::Times:
|
---|
| 781 | // hint = FF_ROMAN;
|
---|
| 782 | // break;
|
---|
| 783 | // case QFont::Courier:
|
---|
| 784 | // hint = FF_MODERN;
|
---|
| 785 | // break;
|
---|
| 786 | // case QFont::OldEnglish:
|
---|
| 787 | // hint = FF_DECORATIVE;
|
---|
| 788 | // break;
|
---|
| 789 | // case QFont::System:
|
---|
| 790 | // hint = FF_MODERN;
|
---|
| 791 | // break;
|
---|
| 792 | // default:
|
---|
| 793 | // break;
|
---|
| 794 | // }
|
---|
| 795 | //
|
---|
| 796 | // lf.lfHeight = -request.pixelSize;
|
---|
| 797 | //#ifdef Q_OS_TEMP
|
---|
| 798 | // lf.lfHeight += 3;
|
---|
| 799 | //#endif
|
---|
| 800 | // lf.lfWidth = 0;
|
---|
| 801 | // lf.lfEscapement = 0;
|
---|
| 802 | // lf.lfOrientation = 0;
|
---|
| 803 | // if ( style->key.weight == 50 )
|
---|
| 804 | // lf.lfWeight = FW_DONTCARE;
|
---|
| 805 | // else
|
---|
| 806 | // lf.lfWeight = (style->key.weight*900)/99;
|
---|
| 807 | // lf.lfItalic = (style->key.italic || style->key.oblique);
|
---|
| 808 | // lf.lfCharSet = DEFAULT_CHARSET;
|
---|
| 809 | //
|
---|
| 810 | // int strat = OUT_DEFAULT_PRECIS;
|
---|
| 811 | // if ( request.styleStrategy & QFont::PreferBitmap ) {
|
---|
| 812 | // strat = OUT_RASTER_PRECIS;
|
---|
| 813 | //#ifndef Q_OS_TEMP
|
---|
| 814 | // } else if ( request.styleStrategy & QFont::PreferDevice ) {
|
---|
| 815 | // strat = OUT_DEVICE_PRECIS;
|
---|
| 816 | // } else if ( request.styleStrategy & QFont::PreferOutline ) {
|
---|
| 817 | // QT_WA( {
|
---|
| 818 | // strat = OUT_OUTLINE_PRECIS;
|
---|
| 819 | // } , {
|
---|
| 820 | // strat = OUT_TT_PRECIS;
|
---|
| 821 | // } );
|
---|
| 822 | // } else if ( request.styleStrategy & QFont::ForceOutline ) {
|
---|
| 823 | // strat = OUT_TT_ONLY_PRECIS;
|
---|
| 824 | //#endif
|
---|
| 825 | // }
|
---|
| 826 | //
|
---|
| 827 | // lf.lfOutPrecision = strat;
|
---|
| 828 | //
|
---|
| 829 | // int qual = DEFAULT_QUALITY;
|
---|
| 830 | //
|
---|
| 831 | // if ( request.styleStrategy & QFont::PreferMatch )
|
---|
| 832 | // qual = DRAFT_QUALITY;
|
---|
| 833 | //#ifndef Q_OS_TEMP
|
---|
| 834 | // else if ( request.styleStrategy & QFont::PreferQuality )
|
---|
| 835 | // qual = PROOF_QUALITY;
|
---|
| 836 | //#endif
|
---|
| 837 | //
|
---|
| 838 | // if ( request.styleStrategy & QFont::PreferAntialias ) {
|
---|
| 839 | // if ( qt_winver >= Qt::WV_XP )
|
---|
| 840 | // qual = 5; // == CLEARTYPE_QUALITY;
|
---|
| 841 | // else
|
---|
| 842 | // qual = ANTIALIASED_QUALITY;
|
---|
| 843 | // } else if ( request.styleStrategy & QFont::NoAntialias ) {
|
---|
| 844 | // qual = NONANTIALIASED_QUALITY;
|
---|
| 845 | // }
|
---|
| 846 | //
|
---|
| 847 | // lf.lfQuality = qual;
|
---|
| 848 | //
|
---|
| 849 | // lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
|
---|
| 850 | // lf.lfPitchAndFamily = DEFAULT_PITCH | hint;
|
---|
| 851 | //
|
---|
| 852 | // QString fam = family->rawName;
|
---|
| 853 | // if ( (fam == "MS Sans Serif") && (request.italic || (-lf.lfHeight > 18 && -lf.lfHeight != 24)) )
|
---|
| 854 | // fam = "Arial"; // MS Sans Serif has bearing problems in italic, and does not scale
|
---|
| 855 | //
|
---|
| 856 | // QT_WA( {
|
---|
| 857 | // memcpy(lf.lfFaceName, fam.ucs2(), sizeof(TCHAR)*QMIN(fam.length()+1,32)); // 32 = Windows hard-coded
|
---|
| 858 | // hfont = CreateFontIndirect( &lf );
|
---|
| 859 | // } , {
|
---|
| 860 | // // LOGFONTA and LOGFONTW are binary compatible
|
---|
| 861 | // QCString lname = fam.local8Bit();
|
---|
| 862 | // memcpy(lf.lfFaceName,lname.data(),
|
---|
| 863 | // QMIN(lname.length()+1,32)); // 32 = Windows hard-coded
|
---|
| 864 | // hfont = CreateFontIndirectA( (LOGFONTA*)&lf );
|
---|
| 865 | // } );
|
---|
| 866 | //#ifndef QT_NO_DEBUG
|
---|
| 867 | // if ( !hfont )
|
---|
| 868 | // qSystemWarning( "CreateFontIndirect failed" );
|
---|
| 869 | //#endif
|
---|
| 870 | //
|
---|
| 871 | // stockFont = (hfont == 0);
|
---|
| 872 | //
|
---|
| 873 | // if ( hfont && request.stretch != 100 ) {
|
---|
| 874 | // HGDIOBJ oldObj = SelectObject( hdc, hfont );
|
---|
| 875 | // BOOL res;
|
---|
| 876 | // int avWidth = 0;
|
---|
| 877 | // QT_WA( {
|
---|
| 878 | // TEXTMETRICW tm;
|
---|
| 879 | // res = GetTextMetricsW( hdc, &tm );
|
---|
| 880 | // avWidth = tm.tmAveCharWidth;
|
---|
| 881 | // } , {
|
---|
| 882 | // TEXTMETRICA tm;
|
---|
| 883 | // res = GetTextMetricsA( hdc, &tm);
|
---|
| 884 | // avWidth = tm.tmAveCharWidth;
|
---|
| 885 | // } );
|
---|
| 886 | //#ifndef QT_NO_DEBUG
|
---|
| 887 | // if ( !res )
|
---|
| 888 | // qSystemWarning( "QFontPrivate: GetTextMetrics failed" );
|
---|
| 889 | //#endif
|
---|
| 890 | //
|
---|
| 891 | // SelectObject( hdc, oldObj );
|
---|
| 892 | // DeleteObject( hfont );
|
---|
| 893 | //
|
---|
| 894 | // lf.lfWidth = avWidth * request.stretch/100;
|
---|
| 895 | // QT_WA( {
|
---|
| 896 | // hfont = CreateFontIndirect( &lf );
|
---|
| 897 | // } , {
|
---|
| 898 | // hfont = CreateFontIndirectA( (LOGFONTA*)&lf );
|
---|
| 899 | // } );
|
---|
| 900 | //#ifndef QT_NO_DEBUG
|
---|
| 901 | // if ( !hfont )
|
---|
| 902 | // qSystemWarning( "CreateFontIndirect with stretch failed" );
|
---|
| 903 | //#endif
|
---|
| 904 | // }
|
---|
| 905 | //
|
---|
| 906 | //#ifndef Q_OS_TEMP
|
---|
| 907 | // if ( hfont == 0 ) {
|
---|
| 908 | // hfont = (HFONT)GetStockObject( ANSI_VAR_FONT );
|
---|
| 909 | // stockFont = TRUE;
|
---|
| 910 | // }
|
---|
| 911 | //#endif
|
---|
| 912 | //
|
---|
| 913 | // }
|
---|
| 914 | // if( !paintdevice && (qt_winver & Qt::WV_DOS_based) )
|
---|
| 915 | // hdc = 0;
|
---|
| 916 | // QFontEngine *fe = new QFontEngineWin( family->name, hdc, hfont, stockFont, lf );
|
---|
| 917 | // if ( paintdevice )
|
---|
| 918 | // fe->paintDevice = TRUE;
|
---|
| 919 | // return fe;
|
---|
| 920 | //}
|
---|