Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 33069 | Differences between
and this patch

Collapse All | Expand All

(-)qt-x11-free-3.2.3-fix/src-orig/kernel/qfont.cpp (-32 / +40 lines)
Lines 208-213 Link Here
208
#ifndef Q_WS_MAC
208
#ifndef Q_WS_MAC
209
    memset( widthCache, 0, widthCacheSize*sizeof( uchar ) );
209
    memset( widthCache, 0, widthCacheSize*sizeof( uchar ) );
210
#endif
210
#endif
211
#ifdef Q_WS_X11
212
    memset( scripts_uniEngine, 0, QFont::LastPrivateScript * sizeof( uchar ) );
213
    uniEngine = 0;
214
#endif
211
}
215
}
212
216
213
QFontEngineData::~QFontEngineData()
217
QFontEngineData::~QFontEngineData()
Lines 223-228 Link Here
223
	engine->deref();
227
	engine->deref();
224
    engine = 0;
228
    engine = 0;
225
#endif // Q_WS_X11 || Q_WS_WIN
229
#endif // Q_WS_X11 || Q_WS_WIN
230
#ifdef Q_WS_X11
231
    memset( scripts_uniEngine, 0, QFont::LastPrivateScript * sizeof( uchar ) );
232
    uniEngine = 0;
233
#endif
226
}
234
}
227
235
228
236
Lines 1244-1250 Link Here
1244
*/
1252
*/
1245
bool QFont::exactMatch() const
1253
bool QFont::exactMatch() const
1246
{
1254
{
1247
    QFontEngine *engine = d->engineForScript( QFont::NoScript );
1255
    QFontEngine *engine = d->m_engineForScript( QFont::NoScript );
1248
#ifdef QT_CHECK_STATE
1256
#ifdef QT_CHECK_STATE
1249
    Q_ASSERT( engine != 0 );
1257
    Q_ASSERT( engine != 0 );
1250
#endif // QT_CHECK_STATE
1258
#endif // QT_CHECK_STATE
Lines 1976-1983 Link Here
1976
*/
1984
*/
1977
int QFontMetrics::ascent() const
1985
int QFontMetrics::ascent() const
1978
{
1986
{
1979
    QFontEngine *engine = d->engineForScript( (QFont::Script) fscript );
1987
    QFontEngine *engine = d->m_engineForScript( (QFont::Script) fscript );
1980
    QFontEngine *latin_engine = d->engineForScript( QFont::Latin );
1988
    QFontEngine *latin_engine = d->m_engineForScript( QFont::Latin );
1981
#ifdef QT_CHECK_STATE
1989
#ifdef QT_CHECK_STATE
1982
    Q_ASSERT( engine != 0 );
1990
    Q_ASSERT( engine != 0 );
1983
    Q_ASSERT( latin_engine != 0 );
1991
    Q_ASSERT( latin_engine != 0 );
Lines 2000-2007 Link Here
2000
*/
2008
*/
2001
int QFontMetrics::descent() const
2009
int QFontMetrics::descent() const
2002
{
2010
{
2003
    QFontEngine *engine = d->engineForScript( (QFont::Script) fscript );
2011
    QFontEngine *engine = d->m_engineForScript( (QFont::Script) fscript );
2004
    QFontEngine *latin_engine = d->engineForScript( QFont::Latin );
2012
    QFontEngine *latin_engine = d->m_engineForScript( QFont::Latin );
2005
#ifdef QT_CHECK_STATE
2013
#ifdef QT_CHECK_STATE
2006
    Q_ASSERT( engine != 0 );
2014
    Q_ASSERT( engine != 0 );
2007
    Q_ASSERT( latin_engine != 0 );
2015
    Q_ASSERT( latin_engine != 0 );
Lines 2020-2027 Link Here
2020
*/
2028
*/
2021
int QFontMetrics::height() const
2029
int QFontMetrics::height() const
2022
{
2030
{
2023
    QFontEngine *engine = d->engineForScript( (QFont::Script) fscript );
2031
    QFontEngine *engine = d->m_engineForScript( (QFont::Script) fscript );
2024
    QFontEngine *latin_engine = d->engineForScript( QFont::Latin );
2032
    QFontEngine *latin_engine = d->m_engineForScript( QFont::Latin );
2025
#ifdef QT_CHECK_STATE
2033
#ifdef QT_CHECK_STATE
2026
    Q_ASSERT( engine != 0 );
2034
    Q_ASSERT( engine != 0 );
2027
    Q_ASSERT( latin_engine != 0 );
2035
    Q_ASSERT( latin_engine != 0 );
Lines 2040-2047 Link Here
2040
*/
2048
*/
2041
int QFontMetrics::leading() const
2049
int QFontMetrics::leading() const
2042
{
2050
{
2043
    QFontEngine *engine = d->engineForScript( (QFont::Script) fscript );
2051
    QFontEngine *engine = d->m_engineForScript( (QFont::Script) fscript );
2044
    QFontEngine *latin_engine = d->engineForScript( QFont::Latin );
2052
    QFontEngine *latin_engine = d->m_engineForScript( QFont::Latin );
2045
#ifdef QT_CHECK_STATE
2053
#ifdef QT_CHECK_STATE
2046
    Q_ASSERT( engine != 0 );
2054
    Q_ASSERT( engine != 0 );
2047
    Q_ASSERT( latin_engine != 0 );
2055
    Q_ASSERT( latin_engine != 0 );
Lines 2059-2066 Link Here
2059
*/
2067
*/
2060
int QFontMetrics::lineSpacing() const
2068
int QFontMetrics::lineSpacing() const
2061
{
2069
{
2062
    QFontEngine *engine = d->engineForScript( (QFont::Script) fscript );
2070
    QFontEngine *engine = d->m_engineForScript( (QFont::Script) fscript );
2063
    QFontEngine *latin_engine = d->engineForScript( QFont::Latin );
2071
    QFontEngine *latin_engine = d->m_engineForScript( QFont::Latin );
2064
#ifdef QT_CHECK_STATE
2072
#ifdef QT_CHECK_STATE
2065
    Q_ASSERT( engine != 0 );
2073
    Q_ASSERT( engine != 0 );
2066
    Q_ASSERT( latin_engine != 0 );
2074
    Q_ASSERT( latin_engine != 0 );
Lines 2083-2090 Link Here
2083
*/
2091
*/
2084
int QFontMetrics::minLeftBearing() const
2092
int QFontMetrics::minLeftBearing() const
2085
{
2093
{
2086
    QFontEngine *engine = d->engineForScript( (QFont::Script) fscript );
2094
    QFontEngine *engine = d->m_engineForScript( (QFont::Script) fscript );
2087
    QFontEngine *latin_engine = d->engineForScript( QFont::Latin );
2095
    QFontEngine *latin_engine = d->m_engineForScript( QFont::Latin );
2088
#ifdef QT_CHECK_STATE
2096
#ifdef QT_CHECK_STATE
2089
    Q_ASSERT( engine != 0 );
2097
    Q_ASSERT( engine != 0 );
2090
    Q_ASSERT( latin_engine != 0 );
2098
    Q_ASSERT( latin_engine != 0 );
Lines 2105-2112 Link Here
2105
*/
2113
*/
2106
int QFontMetrics::minRightBearing() const
2114
int QFontMetrics::minRightBearing() const
2107
{
2115
{
2108
    QFontEngine *engine = d->engineForScript( (QFont::Script) fscript );
2116
    QFontEngine *engine = d->m_engineForScript( (QFont::Script) fscript );
2109
    QFontEngine *latin_engine = d->engineForScript( QFont::Latin );
2117
    QFontEngine *latin_engine = d->m_engineForScript( QFont::Latin );
2110
#ifdef QT_CHECK_STATE
2118
#ifdef QT_CHECK_STATE
2111
    Q_ASSERT( engine != 0 );
2119
    Q_ASSERT( engine != 0 );
2112
    Q_ASSERT( latin_engine != 0 );
2120
    Q_ASSERT( latin_engine != 0 );
Lines 2120-2127 Link Here
2120
*/
2128
*/
2121
int QFontMetrics::maxWidth() const
2129
int QFontMetrics::maxWidth() const
2122
{
2130
{
2123
    QFontEngine *engine = d->engineForScript( (QFont::Script) fscript );
2131
    QFontEngine *engine = d->m_engineForScript( (QFont::Script) fscript );
2124
    QFontEngine *lengine = d->engineForScript( QFont::Latin );
2132
    QFontEngine *lengine = d->m_engineForScript( QFont::Latin );
2125
#ifdef QT_CHECK_STATE
2133
#ifdef QT_CHECK_STATE
2126
    Q_ASSERT( engine != 0 );
2134
    Q_ASSERT( engine != 0 );
2127
    Q_ASSERT( lengine != 0 );
2135
    Q_ASSERT( lengine != 0 );
Lines 2137-2143 Link Here
2137
bool QFontMetrics::inFont(QChar ch) const
2145
bool QFontMetrics::inFont(QChar ch) const
2138
{
2146
{
2139
    QFont::Script script;
2147
    QFont::Script script;
2140
    SCRIPT_FOR_CHAR( script, ch );
2148
    SCRIPT_FOR_CHAR( script, ch, d );
2141
2149
2142
    QFontEngine *engine = d->engineForScript( script );
2150
    QFontEngine *engine = d->engineForScript( script );
2143
#ifdef QT_CHECK_STATE
2151
#ifdef QT_CHECK_STATE
Lines 2164-2170 Link Here
2164
int QFontMetrics::leftBearing(QChar ch) const
2172
int QFontMetrics::leftBearing(QChar ch) const
2165
{
2173
{
2166
    QFont::Script script;
2174
    QFont::Script script;
2167
    SCRIPT_FOR_CHAR( script, ch );
2175
    SCRIPT_FOR_CHAR( script, ch, d );
2168
2176
2169
    QFontEngine *engine = d->engineForScript( script );
2177
    QFontEngine *engine = d->engineForScript( script );
2170
#ifdef QT_CHECK_STATE
2178
#ifdef QT_CHECK_STATE
Lines 2198-2204 Link Here
2198
int QFontMetrics::rightBearing(QChar ch) const
2206
int QFontMetrics::rightBearing(QChar ch) const
2199
{
2207
{
2200
    QFont::Script script;
2208
    QFont::Script script;
2201
    SCRIPT_FOR_CHAR( script, ch );
2209
    SCRIPT_FOR_CHAR( script, ch, d );
2202
2210
2203
    QFontEngine *engine = d->engineForScript( script );
2211
    QFontEngine *engine = d->engineForScript( script );
2204
#ifdef QT_CHECK_STATE
2212
#ifdef QT_CHECK_STATE
Lines 2248-2254 Link Here
2248
	    width += d->engineData->widthCache[uc];
2256
	    width += d->engineData->widthCache[uc];
2249
	else if ( ::category( *ch ) != QChar::Mark_NonSpacing ) {
2257
	else if ( ::category( *ch ) != QChar::Mark_NonSpacing ) {
2250
	    QFont::Script script;
2258
	    QFont::Script script;
2251
	    SCRIPT_FOR_CHAR( script, *ch );
2259
	    SCRIPT_FOR_CHAR( script, *ch, d );
2252
2260
2253
	    if (script >= QFont::Arabic && script <= QFont::Khmer)
2261
	    if (script >= QFont::Arabic && script <= QFont::Khmer)
2254
		break;
2262
		break;
Lines 2378-2384 Link Here
2378
QRect QFontMetrics::boundingRect( QChar ch ) const
2386
QRect QFontMetrics::boundingRect( QChar ch ) const
2379
{
2387
{
2380
    QFont::Script script;
2388
    QFont::Script script;
2381
    SCRIPT_FOR_CHAR( script, ch );
2389
    SCRIPT_FOR_CHAR( script, ch, d );
2382
2390
2383
    QFontEngine *engine = d->engineForScript( script );
2391
    QFontEngine *engine = d->engineForScript( script );
2384
#ifdef QT_CHECK_STATE
2392
#ifdef QT_CHECK_STATE
Lines 2519-2525 Link Here
2519
*/
2527
*/
2520
int QFontMetrics::underlinePos() const
2528
int QFontMetrics::underlinePos() const
2521
{
2529
{
2522
    QFontEngine *engine = d->engineForScript( (QFont::Script) fscript );
2530
    QFontEngine *engine = d->m_engineForScript( (QFont::Script) fscript );
2523
#ifdef QT_CHECK_STATE
2531
#ifdef QT_CHECK_STATE
2524
    Q_ASSERT( engine != 0 );
2532
    Q_ASSERT( engine != 0 );
2525
#endif // QT_CHECK_STATE
2533
#endif // QT_CHECK_STATE
Lines 2559-2565 Link Here
2559
*/
2567
*/
2560
int QFontMetrics::lineWidth() const
2568
int QFontMetrics::lineWidth() const
2561
{
2569
{
2562
    QFontEngine *engine = d->engineForScript( (QFont::Script) fscript );
2570
    QFontEngine *engine = d->m_engineForScript( (QFont::Script) fscript );
2563
#ifdef QT_CHECK_STATE
2571
#ifdef QT_CHECK_STATE
2564
    Q_ASSERT( engine != 0 );
2572
    Q_ASSERT( engine != 0 );
2565
#endif // QT_CHECK_STATE
2573
#endif // QT_CHECK_STATE
Lines 2715-2721 Link Here
2715
*/
2723
*/
2716
QString QFontInfo::family() const
2724
QString QFontInfo::family() const
2717
{
2725
{
2718
    QFontEngine *engine = d->engineForScript( (QFont::Script) fscript );
2726
    QFontEngine *engine = d->m_engineForScript( (QFont::Script) fscript );
2719
#ifdef QT_CHECK_STATE
2727
#ifdef QT_CHECK_STATE
2720
    Q_ASSERT( engine != 0 );
2728
    Q_ASSERT( engine != 0 );
2721
#endif // QT_CHECK_STATE
2729
#endif // QT_CHECK_STATE
Lines 2729-2735 Link Here
2729
*/
2737
*/
2730
int QFontInfo::pointSize() const
2738
int QFontInfo::pointSize() const
2731
{
2739
{
2732
    QFontEngine *engine = d->engineForScript( (QFont::Script) fscript );
2740
    QFontEngine *engine = d->m_engineForScript( (QFont::Script) fscript );
2733
#ifdef QT_CHECK_STATE
2741
#ifdef QT_CHECK_STATE
2734
    Q_ASSERT( engine != 0 );
2742
    Q_ASSERT( engine != 0 );
2735
#endif // QT_CHECK_STATE
2743
#endif // QT_CHECK_STATE
Lines 2743-2749 Link Here
2743
*/
2751
*/
2744
int QFontInfo::pixelSize() const
2752
int QFontInfo::pixelSize() const
2745
{
2753
{
2746
    QFontEngine *engine = d->engineForScript( (QFont::Script) fscript );
2754
    QFontEngine *engine = d->m_engineForScript( (QFont::Script) fscript );
2747
#ifdef QT_CHECK_STATE
2755
#ifdef QT_CHECK_STATE
2748
    Q_ASSERT( engine != 0 );
2756
    Q_ASSERT( engine != 0 );
2749
#endif // QT_CHECK_STATE
2757
#endif // QT_CHECK_STATE
Lines 2757-2763 Link Here
2757
*/
2765
*/
2758
bool QFontInfo::italic() const
2766
bool QFontInfo::italic() const
2759
{
2767
{
2760
    QFontEngine *engine = d->engineForScript( (QFont::Script) fscript );
2768
    QFontEngine *engine = d->m_engineForScript( (QFont::Script) fscript );
2761
#ifdef QT_CHECK_STATE
2769
#ifdef QT_CHECK_STATE
2762
    Q_ASSERT( engine != 0 );
2770
    Q_ASSERT( engine != 0 );
2763
#endif // QT_CHECK_STATE
2771
#endif // QT_CHECK_STATE
Lines 2771-2777 Link Here
2771
*/
2779
*/
2772
int QFontInfo::weight() const
2780
int QFontInfo::weight() const
2773
{
2781
{
2774
    QFontEngine *engine = d->engineForScript( (QFont::Script) fscript );
2782
    QFontEngine *engine = d->m_engineForScript( (QFont::Script) fscript );
2775
#ifdef QT_CHECK_STATE
2783
#ifdef QT_CHECK_STATE
2776
    Q_ASSERT( engine != 0 );
2784
    Q_ASSERT( engine != 0 );
2777
#endif // QT_CHECK_STATE
2785
#endif // QT_CHECK_STATE
Lines 2838-2844 Link Here
2838
*/
2846
*/
2839
bool QFontInfo::fixedPitch() const
2847
bool QFontInfo::fixedPitch() const
2840
{
2848
{
2841
    QFontEngine *engine = d->engineForScript( (QFont::Script) fscript );
2849
    QFontEngine *engine = d->m_engineForScript( (QFont::Script) fscript );
2842
#ifdef QT_CHECK_STATE
2850
#ifdef QT_CHECK_STATE
2843
    Q_ASSERT( engine != 0 );
2851
    Q_ASSERT( engine != 0 );
2844
#endif // QT_CHECK_STATE
2852
#endif // QT_CHECK_STATE
Lines 2865-2871 Link Here
2865
*/
2873
*/
2866
QFont::StyleHint QFontInfo::styleHint() const
2874
QFont::StyleHint QFontInfo::styleHint() const
2867
{
2875
{
2868
    QFontEngine *engine = d->engineForScript( (QFont::Script) fscript );
2876
    QFontEngine *engine = d->m_engineForScript( (QFont::Script) fscript );
2869
#ifdef QT_CHECK_STATE
2877
#ifdef QT_CHECK_STATE
2870
    Q_ASSERT( engine != 0 );
2878
    Q_ASSERT( engine != 0 );
2871
#endif // QT_CHECK_STATE
2879
#endif // QT_CHECK_STATE
Lines 2895-2901 Link Here
2895
*/
2903
*/
2896
bool QFontInfo::exactMatch() const
2904
bool QFontInfo::exactMatch() const
2897
{
2905
{
2898
    QFontEngine *engine = d->engineForScript( (QFont::Script) fscript );
2906
    QFontEngine *engine = d->m_engineForScript( (QFont::Script) fscript );
2899
#ifdef QT_CHECK_STATE
2907
#ifdef QT_CHECK_STATE
2900
    Q_ASSERT( engine != 0 );
2908
    Q_ASSERT( engine != 0 );
2901
#endif // QT_CHECK_STATE
2909
#endif // QT_CHECK_STATE
(-)qt-x11-free-3.2.3-fix/src-orig/kernel/qfont_x11.cpp (-8 / +67 lines)
Lines 56-61 Link Here
56
#include "qfontdata_p.h"
56
#include "qfontdata_p.h"
57
#include "qfontengine_p.h"
57
#include "qfontengine_p.h"
58
#include "qtextengine_p.h"
58
#include "qtextengine_p.h"
59
#include "qscriptengine_p.h"
59
60
60
#include "qt_x11_p.h"
61
#include "qt_x11_p.h"
61
62
Lines 277-283 Link Here
277
	QFontPrivate *priv = new QFontPrivate;
278
	QFontPrivate *priv = new QFontPrivate;
278
279
279
	for ( uint i = 0; i < sample.length(); i++ ) {
280
	for ( uint i = 0; i < sample.length(); i++ ) {
280
	    SCRIPT_FOR_CHAR( tmp, *uc );
281
	    SCRIPT_FOR_CHAR( tmp, *uc, 0 );
281
	    uc++;
282
	    uc++;
282
	    if ( tmp != cs && tmp != QFont::UnknownScript ) {
283
	    if ( tmp != cs && tmp != QFont::UnknownScript ) {
283
		cs = tmp;
284
		cs = tmp;
Lines 364-375 Link Here
364
    // the cached engineData could have already loaded the engine we want
365
    // the cached engineData could have already loaded the engine we want
365
    if ( engineData->engines[script] ) return;
366
    if ( engineData->engines[script] ) return;
366
367
368
    static ShapeFunction basic_shape = scriptEngines[QFont::Latin].shape;
369
    QFontEngine *uniEngine = 0;
370
371
    if ( script != QFont::Unicode &&
372
	 scriptEngines[script].shape == basic_shape ) {
373
	if ( !engineData->engines[QFont::Unicode] )
374
	    load( QFont::Unicode );
375
	uniEngine = engineData->uniEngine;
376
    }
377
367
    // load the font
378
    // load the font
368
    QFontEngine *engine = 0;
379
    QFontEngine *engine = 0;
369
    //    double scale = 1.0; // ### TODO: fix the scale calculations
380
    //    double scale = 1.0; // ### TODO: fix the scale calculations
370
381
371
    // list of families to try
382
    // list of families to try
372
    QStringList family_list = QStringList::split( ',', req.family );
383
    QStringList family_list = QStringList::split( ',', req.family );
384
    int count = family_list.count();
373
385
374
    // append the substitute list for each family in family_list
386
    // append the substitute list for each family in family_list
375
    QStringList subs_list;
387
    QStringList subs_list;
Lines 399-411 Link Here
399
    family_list << QString::null;
411
    family_list << QString::null;
400
412
401
    it = family_list.begin(), end = family_list.end();
413
    it = family_list.begin(), end = family_list.end();
402
    for ( ; ! engine && it != end; ++it ) {
414
    for ( ; ! engine && it != end; ++it, --count ) {
403
	req.family = *it;
415
	req.family = *it;
404
416
405
	engine = QFontDatabase::findFont( script, this, req );
417
	engine = QFontDatabase::findFont( script, this, req );
406
	if ( engine ) {
418
	if ( engine ) {
407
	    if ( engine->type() != QFontEngine::Box )
419
	    if ( engine->type() != QFontEngine::Box ) {
408
		break;
420
		if ( script != QFont::Unicode && engine == uniEngine )
421
		    engineData->scripts_uniEngine[script] = 1;
422
		if ( engine != uniEngine )
423
		    break;
424
	    }
409
425
410
	    if ( ! req.family.isEmpty() )
426
	    if ( ! req.family.isEmpty() )
411
		engine = 0;
427
		engine = 0;
Lines 416-421 Link Here
416
432
417
    engine->ref();
433
    engine->ref();
418
    engineData->engines[script] = engine;
434
    engineData->engines[script] = engine;
435
436
    if ( script == QFont::Unicode && count > 0 ) {
437
	QString req_family, req_foundry, font_family, font_foundry;
438
439
	QFontDatabase::parseFontName(req.family, req_foundry, req_family);
440
	QFontDatabase::parseFontName(engine->fontDef.family,
441
				     font_foundry, font_family);
442
443
	if ( req_family == font_family  &&
444
	     ( req_foundry.isEmpty()  ||
445
	       font_foundry.isEmpty() ||
446
	       req_foundry == font_foundry ) )
447
	    engineData->uniEngine = engine;
448
    }
449
}
450
451
QFont::Script QFontPrivate::checkSpecialScript( QFont::Script script,
452
						const QChar &ch )
453
{
454
    static ShapeFunction basic_shape = scriptEngines[QFont::Latin].shape;
455
456
    if ( scriptEngines[script].shape != basic_shape )
457
	return script;
458
459
    if ( !engineData || !engineData->engines[QFont::Unicode] )
460
	load( QFont::Unicode );
461
462
    if ( engineData->uniEngine ) {
463
	if ( engineData->uniEngine->canRender( &ch, 1 ) )
464
	    return QFont::Unicode;
465
466
    } else {
467
	if ( script != QFontPrivate::defaultScript &&
468
	     QFontPrivate::defaultScript != QFont::Unicode &&
469
	     QFontPrivate::defaultScript != QFont::UnknownScript ) {
470
	    QFontEngine *fe = engineForScript( QFontPrivate::defaultScript );
471
472
	    if ( fe->type() == QFontEngine::XLFD && fe->canRender( &ch, 1 ) )
473
		return QFontPrivate::defaultScript;
474
	}
475
    }
476
477
    return script;
419
}
478
}
420
479
421
/*!
480
/*!
Lines 433-439 Link Here
433
*/
492
*/
434
Qt::HANDLE QFont::handle() const
493
Qt::HANDLE QFont::handle() const
435
{
494
{
436
    QFontEngine *engine = d->engineForScript( QFontPrivate::defaultScript );
495
    QFontEngine *engine = d->m_engineForScript( QFontPrivate::defaultScript );
437
#ifdef QT_CHECK_STATE
496
#ifdef QT_CHECK_STATE
438
    Q_ASSERT( engine != 0 );
497
    Q_ASSERT( engine != 0 );
439
#endif // QT_CHECK_STATE
498
#endif // QT_CHECK_STATE
Lines 466-472 Link Here
466
*/
525
*/
467
QString QFont::rawName() const
526
QString QFont::rawName() const
468
{
527
{
469
    QFontEngine *engine = d->engineForScript( QFontPrivate::defaultScript );
528
    QFontEngine *engine = d->m_engineForScript( QFontPrivate::defaultScript );
470
#ifdef QT_CHECK_STATE
529
#ifdef QT_CHECK_STATE
471
    Q_ASSERT( engine != 0 );
530
    Q_ASSERT( engine != 0 );
472
#endif // QT_CHECK_STATE
531
#endif // QT_CHECK_STATE
Lines 656-662 Link Here
656
	return 0;
715
	return 0;
657
716
658
    QFont::Script script;
717
    QFont::Script script;
659
    SCRIPT_FOR_CHAR( script, ch );
718
    SCRIPT_FOR_CHAR( script, ch, d );
660
719
661
    QFontEngine *engine = d->engineForScript( script );
720
    QFontEngine *engine = d->engineForScript( script );
662
#ifdef QT_CHECK_STATE
721
#ifdef QT_CHECK_STATE
Lines 690-696 Link Here
690
	return 0;
749
	return 0;
691
750
692
    QFont::Script script;
751
    QFont::Script script;
693
    SCRIPT_FOR_CHAR( script, ch );
752
    SCRIPT_FOR_CHAR( script, ch, d );
694
753
695
    int width;
754
    int width;
696
755
(-)qt-x11-free-3.2.3-fix/src-orig/kernel/qfontdata_p.h (+19 lines)
Lines 125-130 Link Here
125
    enum { widthCacheSize = 0x500 };
125
    enum { widthCacheSize = 0x500 };
126
    uchar widthCache[widthCacheSize];
126
    uchar widthCache[widthCacheSize];
127
#endif
127
#endif
128
#ifdef Q_WS_X11
129
    uchar scripts_uniEngine[QFont::LastPrivateScript];
130
    QFontEngine *uniEngine;
131
#endif // Q_WS_X11
128
};
132
};
129
133
130
134
Lines 154-159 Link Here
154
        return engineData->engine;
158
        return engineData->engine;
155
#endif // Q_WS_X11 || Q_WS_WIN
159
#endif // Q_WS_X11 || Q_WS_WIN
156
    }
160
    }
161
162
    QFontEngine *m_engineForScript( QFont::Script script ) const {
163
	if ( script == QFont::NoScript )
164
	    script = QFontPrivate::defaultScript;
165
	QFontEngine *engine = engineForScript( script );
166
#ifdef Q_WS_X11
167
	if ( engineData->scripts_uniEngine[script] )
168
	    return engineData->uniEngine;
169
#endif
170
	return engine;
171
    }
172
173
#ifdef Q_WS_X11
174
    QFont::Script checkSpecialScript( QFont::Script script, const QChar &ch );
175
#endif // Q_WS_X11
157
176
158
    QFontDef request;
177
    QFontDef request;
159
    QFontEngineData *engineData;
178
    QFontEngineData *engineData;
(-)qt-x11-free-3.2.3-fix/src-orig/kernel/qfontdatabase_x11.cpp (+1 lines)
Lines 852-857 Link Here
852
	    }
852
	    }
853
	}
853
	}
854
#endif // QT_XFT2
854
#endif // QT_XFT2
855
	family->scripts[QFont::Unicode] = QtFontFamily::Supported;
855
856
856
	QCString file = file_value;
857
	QCString file = file_value;
857
	family->fontFilename = file;
858
	family->fontFilename = file;
(-)qt-x11-free-3.2.3-fix/src-orig/kernel/qtextengine.cpp (-5 / +4 lines)
Lines 186-193 Link Here
186
    if ( control.singleLine ) {
186
    if ( control.singleLine ) {
187
	for ( int i = start; i <= stop; i++ ) {
187
	for ( int i = start; i <= stop; i++ ) {
188
188
189
	    unsigned short uc = text[i].unicode();
189
	    QFont::Script s = (QFont::Script)scriptForChar( text[i], engine->fnt );
190
	    QFont::Script s = (QFont::Script)scriptForChar( uc );
191
	    if (s == QFont::UnknownScript)
190
	    if (s == QFont::UnknownScript)
192
		s = script;
191
		s = script;
193
192
Lines 203-221 Link Here
203
	for ( int i = start; i <= stop; i++ ) {
202
	for ( int i = start; i <= stop; i++ ) {
204
203
205
	    unsigned short uc = text[i].unicode();
204
	    unsigned short uc = text[i].unicode();
206
	    QFont::Script s = (QFont::Script)scriptForChar( uc );
205
	    QFont::Script s = (QFont::Script)scriptForChar( text[i], engine->fnt );
207
	    if (s == QFont::UnknownScript)
206
	    if (s == QFont::UnknownScript)
208
		s = script;
207
		s = script;
209
208
210
	    QChar::Category category = ::category( uc );
209
	    QChar::Category category = ::category( uc );
211
	    if ( uc == 0xfffcU || uc == 0x2028U ) {
210
	    if ( uc == 0xfffcU || uc == 0x2028U ) {
212
		item.analysis.bidiLevel = level % 2 ? level-1 : level;
211
		item.analysis.bidiLevel = level % 2 ? level-1 : level;
213
		item.analysis.script = QFont::Latin;
212
		item.analysis.script = s;
214
		item.isObject = TRUE;
213
		item.isObject = TRUE;
215
		s = QFont::NoScript;
214
		s = QFont::NoScript;
216
	    } else if ((uc >= 9 && uc <=13) ||
215
	    } else if ((uc >= 9 && uc <=13) ||
217
		       (category >= QChar::Separator_Space && category <= QChar::Separator_Paragraph)) {
216
		       (category >= QChar::Separator_Space && category <= QChar::Separator_Paragraph)) {
218
		item.analysis.script = QFont::Latin;
217
		item.analysis.script = s;
219
		item.isSpace = TRUE;
218
		item.isSpace = TRUE;
220
		item.isTab = ( uc == '\t' );
219
		item.isTab = ( uc == '\t' );
221
		item.analysis.bidiLevel = item.isTab ? control.baseLevel() : level;
220
		item.analysis.bidiLevel = item.isTab ? control.baseLevel() : level;
(-)qt-x11-free-3.2.3-fix/src-orig/tools/qunicodetables_p.h (-15 / +13 lines)
Lines 37-42 Link Here
37
#define QUNICODETABLES_P_H
37
#define QUNICODETABLES_P_H
38
38
39
#include "qstring.h"
39
#include "qstring.h"
40
#include "private/qfontdata_p.h"
40
41
41
#ifdef QT_NO_UNICODETABLES
42
#ifdef QT_NO_UNICODETABLES
42
# include <ctype.h>
43
# include <ctype.h>
Lines 206-213 Link Here
206
    return QUnicodeTables::line_break_info[pos];
207
    return QUnicodeTables::line_break_info[pos];
207
}
208
}
208
209
209
inline int scriptForChar( ushort uc )
210
inline int scriptForChar( const QChar &ch, QFontPrivate *fnt = 0 )
210
{
211
{
212
    unsigned short uc = ch.unicode();
211
    unsigned char script = QUnicodeTables::scriptTable[(uc>>8)];
213
    unsigned char script = QUnicodeTables::scriptTable[(uc>>8)];
212
    if ( script >= QUnicodeTables::SCRIPTS_INDIC ) {
214
    if ( script >= QUnicodeTables::SCRIPTS_INDIC ) {
213
	if ( script == QUnicodeTables::SCRIPTS_INDIC ) {
215
	if ( script == QUnicodeTables::SCRIPTS_INDIC ) {
Lines 221-242 Link Here
221
	    script = QUnicodeTables::otherScripts[index];
223
	    script = QUnicodeTables::otherScripts[index];
222
	}
224
	}
223
    }
225
    }
224
    return script;
225
}
226
226
227
#ifdef Q_WS_X11
227
#ifdef Q_WS_X11
228
#define SCRIPT_FOR_CHAR( script, c ) 	\
228
    if ( fnt )
229
do { 						\
229
      script = fnt->checkSpecialScript( (QFont::Script)script, ch );
230
    unsigned short _uc = (c).unicode(); 		\
231
    if ( _uc < 0x100 ) {				\
232
	script = QFont::Latin;		\
233
    } else { 					\
234
        script = (QFont::Script)scriptForChar( _uc ); 	\
235
    } 						\
236
} while( FALSE )
237
#else
230
#else
238
#define SCRIPT_FOR_CHAR( script, c ) \
231
    Q_UNUSED( fnt );
239
    script = (QFont::Script)scriptForChar( (c).unicode() )
232
#endif // Q_WS_X11
240
#endif
233
234
    return script;
235
}
236
237
#define SCRIPT_FOR_CHAR( script, c, fnt ) \
238
    script = (QFont::Script)scriptForChar( c, fnt )
241
239
242
#endif
240
#endif

Return to bug 33069