From 1e7b2415bf1bc853655e0a85a8cb21ecd24b149e Mon Sep 17 00:00:00 2001 From: Aaron McCarthy Date: Thu, 4 Mar 2010 15:22:31 +1000 Subject: Updating polling mechanism for bearer management engines. Improves the polling mechanism by sharing a single timer for all poll based engines. Updates are only performed for a poll based engine iff a QNetworkConfigurationManager object has been constructed or a QNetworkConfiguration is held externally from the engine. --- src/network/bearer/qbearerengine.cpp | 38 +++++++++ src/network/bearer/qbearerengine_p.h | 3 + src/network/bearer/qnetworkconfigmanager.cpp | 8 +- src/network/bearer/qnetworkconfigmanager_p.cpp | 90 ++++++++++++++++++++-- src/network/bearer/qnetworkconfigmanager_p.h | 15 +++- src/plugins/bearer/corewlan/qcorewlanengine.h | 3 +- src/plugins/bearer/corewlan/qcorewlanengine.mm | 10 ++- src/plugins/bearer/generic/qgenericengine.cpp | 14 ++-- src/plugins/bearer/generic/qgenericengine.h | 3 +- .../bearer/nativewifi/qnativewifiengine.cpp | 13 ++-- src/plugins/bearer/nativewifi/qnativewifiengine.h | 4 +- 11 files changed, 173 insertions(+), 28 deletions(-) diff --git a/src/network/bearer/qbearerengine.cpp b/src/network/bearer/qbearerengine.cpp index eb851cc..c42e2d2 100644 --- a/src/network/bearer/qbearerengine.cpp +++ b/src/network/bearer/qbearerengine.cpp @@ -70,6 +70,44 @@ QBearerEngine::~QBearerEngine() } } +bool QBearerEngine::requiresPolling() const +{ + return false; +} + +/* + Returns true if configurations are in use; otherwise returns false. + + If configurations are in use and requiresPolling() returns true, polling will be enabled for + this engine. +*/ +bool QBearerEngine::configurationsInUse() const +{ + QHash::ConstIterator it; + QHash::ConstIterator end; + + QMutexLocker locker(&mutex); + + for (it = accessPointConfigurations.begin(), + end = accessPointConfigurations.end(); it != end; ++it) { + if (it.value()->ref > 1) + return true; + } + + for (it = snapConfigurations.begin(), end = snapConfigurations.end(); it != end; ++it) { + if (it.value()->ref > 1) + return true; + } + + for (it = userChoiceConfigurations.begin(), + end = userChoiceConfigurations.end(); it != end; ++it) { + if (it.value()->ref > 1) + return true; + } + + return false; +} + #include "moc_qbearerengine_p.cpp" QT_END_NAMESPACE diff --git a/src/network/bearer/qbearerengine_p.h b/src/network/bearer/qbearerengine_p.h index 5e12b0f..028c174 100644 --- a/src/network/bearer/qbearerengine_p.h +++ b/src/network/bearer/qbearerengine_p.h @@ -89,6 +89,9 @@ public: virtual QNetworkConfigurationPrivatePointer defaultConfiguration() = 0; + virtual bool requiresPolling() const; + bool configurationsInUse() const; + Q_SIGNALS: void configurationAdded(QNetworkConfigurationPrivatePointer config); void configurationRemoved(QNetworkConfigurationPrivatePointer config); diff --git a/src/network/bearer/qnetworkconfigmanager.cpp b/src/network/bearer/qnetworkconfigmanager.cpp index 9ff197b..0eb9c63 100644 --- a/src/network/bearer/qnetworkconfigmanager.cpp +++ b/src/network/bearer/qnetworkconfigmanager.cpp @@ -174,7 +174,8 @@ QNetworkConfigurationManagerPrivate *qNetworkConfigurationManagerPrivate() QNetworkConfigurationManager::QNetworkConfigurationManager( QObject* parent ) : QObject(parent) { - QNetworkConfigurationManagerPrivate* priv = connManager(); + QNetworkConfigurationManagerPrivate *priv = connManager(); + connect(priv, SIGNAL(configurationAdded(QNetworkConfiguration)), this, SIGNAL(configurationAdded(QNetworkConfiguration))); connect(priv, SIGNAL(configurationRemoved(QNetworkConfiguration)), @@ -185,6 +186,8 @@ QNetworkConfigurationManager::QNetworkConfigurationManager( QObject* parent ) this, SIGNAL(onlineStateChanged(bool))); connect(priv, SIGNAL(configurationChanged(QNetworkConfiguration)), this, SIGNAL(configurationChanged(QNetworkConfiguration))); + + priv->enablePolling(); } /*! @@ -192,6 +195,9 @@ QNetworkConfigurationManager::QNetworkConfigurationManager( QObject* parent ) */ QNetworkConfigurationManager::~QNetworkConfigurationManager() { + QNetworkConfigurationManagerPrivate *priv = connManager(); + + priv->disablePolling(); } diff --git a/src/network/bearer/qnetworkconfigmanager_p.cpp b/src/network/bearer/qnetworkconfigmanager_p.cpp index 1ac10c5..9740424 100644 --- a/src/network/bearer/qnetworkconfigmanager_p.cpp +++ b/src/network/bearer/qnetworkconfigmanager_p.cpp @@ -55,7 +55,7 @@ Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, loader, (QBearerEngineFactoryInterface_iid, QLatin1String("/bearer"))) QNetworkConfigurationManagerPrivate::QNetworkConfigurationManagerPrivate() -: capFlags(0), mutex(QMutex::Recursive), firstUpdate(true) +: capFlags(0), mutex(QMutex::Recursive), pollTimer(0), forcedPolling(0), firstUpdate(true) { updateConfigurations(); @@ -82,7 +82,7 @@ void QNetworkConfigurationManagerPrivate::configurationAdded(QNetworkConfigurati } if (ptr->state == QNetworkConfiguration::Active) { - onlineConfigurations.insert(ptr); + onlineConfigurations.insert(ptr->id); if (!firstUpdate && onlineConfigurations.count() == 1) emit onlineStateChanged(true); } @@ -100,7 +100,7 @@ void QNetworkConfigurationManagerPrivate::configurationRemoved(QNetworkConfigura emit configurationRemoved(item); } - onlineConfigurations.remove(ptr); + onlineConfigurations.remove(ptr->id); if (!firstUpdate && onlineConfigurations.isEmpty()) emit onlineStateChanged(false); } @@ -118,9 +118,9 @@ void QNetworkConfigurationManagerPrivate::configurationChanged(QNetworkConfigura bool previous = !onlineConfigurations.isEmpty(); if (ptr->state == QNetworkConfiguration::Active) - onlineConfigurations.insert(ptr); + onlineConfigurations.insert(ptr->id); else - onlineConfigurations.remove(ptr); + onlineConfigurations.remove(ptr->id); bool online = !onlineConfigurations.isEmpty(); @@ -133,6 +133,9 @@ void QNetworkConfigurationManagerPrivate::updateConfigurations() QMutexLocker locker(&mutex); if (firstUpdate) { + if (sender()) + return; + updating = false; QFactoryLoader *l = loader(); @@ -161,6 +164,8 @@ void QNetworkConfigurationManagerPrivate::updateConfigurations() this, SLOT(configurationChanged(QNetworkConfigurationPrivatePointer))); capFlags |= engine->capabilities(); + + engine->requestUpdate(); } } @@ -180,6 +185,15 @@ void QNetworkConfigurationManagerPrivate::updateConfigurations() emit configurationUpdateComplete(); } + if (engine && !pollingEngines.isEmpty()) { + int index = sessionEngines.indexOf(engine); + if (index >= 0) + pollingEngines.remove(index); + + if (pollingEngines.isEmpty()) + startPolling(); + } + if (firstUpdate) firstUpdate = false; } @@ -208,4 +222,70 @@ QList QNetworkConfigurationManagerPrivate::engines() return sessionEngines; } +void QNetworkConfigurationManagerPrivate::startPolling() +{ + QMutexLocker locker(&mutex); + + bool pollingRequired = false; + + if (forcedPolling > 0) { + foreach (QBearerEngine *engine, sessionEngines) { + if (engine->requiresPolling()) { + pollingRequired = true; + break; + } + } + } + + if (!pollingRequired) { + foreach (QBearerEngine *engine, sessionEngines) { + if (engine->configurationsInUse()) { + pollingRequired = true; + break; + } + } + } + + if (pollingRequired) { + if (!pollTimer) { + pollTimer = new QTimer(this); + pollTimer->setInterval(10000); + pollTimer->setSingleShot(true); + connect(pollTimer, SIGNAL(timeout()), this, SLOT(pollEngines())); + } + + pollTimer->start(); + } +} + +void QNetworkConfigurationManagerPrivate::pollEngines() +{ + QMutexLocker locker(&mutex); + + for (int i = 0; i < sessionEngines.count(); ++i) { + if ((forcedPolling && sessionEngines.at(i)->requiresPolling()) || + sessionEngines.at(i)->configurationsInUse()) { + pollingEngines.insert(i); + sessionEngines.at(i)->requestUpdate(); + } + } +} + +void QNetworkConfigurationManagerPrivate::enablePolling() +{ + QMutexLocker locker(&mutex); + + ++forcedPolling; + + if (forcedPolling == 1) + startPolling(); +} + +void QNetworkConfigurationManagerPrivate::disablePolling() +{ + QMutexLocker locker(&mutex); + + --forcedPolling; +} + QT_END_NAMESPACE diff --git a/src/network/bearer/qnetworkconfigmanager_p.h b/src/network/bearer/qnetworkconfigmanager_p.h index c7e988e..ac8518c 100644 --- a/src/network/bearer/qnetworkconfigmanager_p.h +++ b/src/network/bearer/qnetworkconfigmanager_p.h @@ -61,6 +61,7 @@ QT_BEGIN_NAMESPACE class QBearerEngine; +class QTimer; class Q_NETWORK_EXPORT QNetworkConfigurationManagerPrivate : public QObject { @@ -77,6 +78,11 @@ public: QList engines(); + void startPolling(); + + void enablePolling(); + void disablePolling(); + public slots: void updateConfigurations(); @@ -92,19 +98,26 @@ Q_SIGNALS: private: QMutex mutex; + QTimer *pollTimer; + QList sessionEngines; - QSet onlineConfigurations; + QSet onlineConfigurations; QSet updatingEngines; bool updating; + QSet pollingEngines; + int forcedPolling; + bool firstUpdate; private Q_SLOTS: void configurationAdded(QNetworkConfigurationPrivatePointer ptr); void configurationRemoved(QNetworkConfigurationPrivatePointer ptr); void configurationChanged(QNetworkConfigurationPrivatePointer ptr); + + void pollEngines(); }; Q_NETWORK_EXPORT QNetworkConfigurationManagerPrivate *qNetworkConfigurationManagerPrivate(); diff --git a/src/plugins/bearer/corewlan/qcorewlanengine.h b/src/plugins/bearer/corewlan/qcorewlanengine.h index cfd89e4..3289ffb 100644 --- a/src/plugins/bearer/corewlan/qcorewlanengine.h +++ b/src/plugins/bearer/corewlan/qcorewlanengine.h @@ -80,13 +80,14 @@ public: bool getAllScInterfaces(); + bool requiresPolling() const; + private Q_SLOTS: void doRequestUpdate(); private: bool isWifiReady(const QString &dev); QMap configurationInterface; - QTimer pollTimer; QStringList scanForSsids(const QString &interfaceName); bool isKnownSsid(const QString &interfaceName, const QString &ssid); diff --git a/src/plugins/bearer/corewlan/qcorewlanengine.mm b/src/plugins/bearer/corewlan/qcorewlanengine.mm index 598d2f0..5870b01 100644 --- a/src/plugins/bearer/corewlan/qcorewlanengine.mm +++ b/src/plugins/bearer/corewlan/qcorewlanengine.mm @@ -243,8 +243,7 @@ void QCoreWlanEngine::requestUpdate() { QMutexLocker locker(&mutex); - pollTimer.stop(); - QTimer::singleShot(0, this, SLOT(doRequestUpdate())); + doRequestUpdate(); } void QCoreWlanEngine::doRequestUpdate() @@ -343,8 +342,6 @@ void QCoreWlanEngine::doRequestUpdate() emit configurationRemoved(ptr); } - pollTimer.start(); - emit updateCompleted(); } @@ -610,4 +607,9 @@ QNetworkConfigurationPrivatePointer QCoreWlanEngine::defaultConfiguration() return QNetworkConfigurationPrivatePointer(); } +bool QCoreWlanEngine::requiresPolling() const +{ + return true; +} + QT_END_NAMESPACE diff --git a/src/plugins/bearer/generic/qgenericengine.cpp b/src/plugins/bearer/generic/qgenericengine.cpp index e6c871d..a9e78b2 100644 --- a/src/plugins/bearer/generic/qgenericengine.cpp +++ b/src/plugins/bearer/generic/qgenericengine.cpp @@ -142,9 +142,6 @@ static QString qGetInterfaceType(const QString &interface) QGenericEngine::QGenericEngine(QObject *parent) : QBearerEngineImpl(parent) { - connect(&pollTimer, SIGNAL(timeout()), this, SLOT(doRequestUpdate())); - pollTimer.setInterval(10000); - doRequestUpdate(); } QGenericEngine::~QGenericEngine() @@ -179,8 +176,7 @@ void QGenericEngine::requestUpdate() { QMutexLocker locker(&mutex); - pollTimer.stop(); - QTimer::singleShot(0, this, SLOT(doRequestUpdate())); + doRequestUpdate(); } void QGenericEngine::doRequestUpdate() @@ -282,8 +278,6 @@ void QGenericEngine::doRequestUpdate() emit configurationRemoved(ptr); } - pollTimer.start(); - emit updateCompleted(); } @@ -328,5 +322,11 @@ QNetworkConfigurationPrivatePointer QGenericEngine::defaultConfiguration() return QNetworkConfigurationPrivatePointer(); } + +bool QGenericEngine::requiresPolling() const +{ + return true; +} + QT_END_NAMESPACE diff --git a/src/plugins/bearer/generic/qgenericengine.h b/src/plugins/bearer/generic/qgenericengine.h index cd9a976..a1b9167 100644 --- a/src/plugins/bearer/generic/qgenericengine.h +++ b/src/plugins/bearer/generic/qgenericengine.h @@ -78,12 +78,13 @@ public: QNetworkConfigurationPrivatePointer defaultConfiguration(); + bool requiresPolling() const; + private Q_SLOTS: void doRequestUpdate(); private: QMap configurationInterface; - QTimer pollTimer; }; QT_END_NAMESPACE diff --git a/src/plugins/bearer/nativewifi/qnativewifiengine.cpp b/src/plugins/bearer/nativewifi/qnativewifiengine.cpp index c8015d8..ec2da00 100644 --- a/src/plugins/bearer/nativewifi/qnativewifiengine.cpp +++ b/src/plugins/bearer/nativewifi/qnativewifiengine.cpp @@ -95,10 +95,6 @@ QNativeWifiEngine::QNativeWifiEngine(QObject *parent) if (result != ERROR_SUCCESS) qWarning("%s: WlanRegisterNotification failed with error %ld\n", __FUNCTION__, result); - // On Windows XP SP2 and SP3 only connection and disconnection notifications are available. - // We need to poll for changes in available wireless networks. - connect(&pollTimer, SIGNAL(timeout()), this, SLOT(scanComplete())); - pollTimer.setInterval(10000); scanComplete(); } @@ -222,8 +218,6 @@ void QNativeWifiEngine::scanComplete() emit configurationRemoved(ptr); } - pollTimer.start(); - emit updateCompleted(); } @@ -492,4 +486,11 @@ QNetworkConfigurationPrivatePointer QNativeWifiEngine::defaultConfiguration() return QNetworkConfigurationPrivatePointer(); } +bool QNativeWifiEngine::requiresPolling() const +{ + // On Windows XP SP2 and SP3 only connection and disconnection notifications are available. + // We need to poll for changes in available wireless networks. + return true; +} + QT_END_NAMESPACE diff --git a/src/plugins/bearer/nativewifi/qnativewifiengine.h b/src/plugins/bearer/nativewifi/qnativewifiengine.h index a9a9375..56489b6 100644 --- a/src/plugins/bearer/nativewifi/qnativewifiengine.h +++ b/src/plugins/bearer/nativewifi/qnativewifiengine.h @@ -90,12 +90,12 @@ public: inline bool available() const { return handle != 0; } + bool requiresPolling() const; + public Q_SLOTS: void scanComplete(); private: - QTimer pollTimer; - Qt::HANDLE handle; }; -- cgit v0.12 From 445ae84fbd7d5ef04a426f8c32a79a369fed70eb Mon Sep 17 00:00:00 2001 From: Aaron McCarthy Date: Thu, 4 Mar 2010 17:33:43 +1000 Subject: Prefer ethernet over wlan. Change how the defaultConfiguration is calculated when one is not provided by an engine. --- src/network/bearer/qnetworkconfigmanager.cpp | 69 ++++++++++++++++++++-------- 1 file changed, 51 insertions(+), 18 deletions(-) diff --git a/src/network/bearer/qnetworkconfigmanager.cpp b/src/network/bearer/qnetworkconfigmanager.cpp index 0eb9c63..b631cf1 100644 --- a/src/network/bearer/qnetworkconfigmanager.cpp +++ b/src/network/bearer/qnetworkconfigmanager.cpp @@ -227,7 +227,7 @@ QNetworkConfiguration QNetworkConfigurationManager::defaultConfiguration() const // Engines don't have a default configuration. // Return first active snap - QNetworkConfigurationPrivatePointer firstDiscovered; + QNetworkConfigurationPrivatePointer defaultConfiguration; foreach (QBearerEngine *engine, conPriv->engines()) { QHash::Iterator it; @@ -242,22 +242,35 @@ QNetworkConfiguration QNetworkConfigurationManager::defaultConfiguration() const QNetworkConfiguration config; config.d = it.value(); return config; - } else if ((it.value()->state & QNetworkConfiguration::Discovered) == - QNetworkConfiguration::Discovered) { - firstDiscovered = it.value(); + } else if (!defaultConfiguration) { + if ((it.value()->state & QNetworkConfiguration::Discovered) == + QNetworkConfiguration::Discovered) { + defaultConfiguration = it.value(); + } } } } // No Active SNAPs return first Discovered SNAP. - if (firstDiscovered) { + if (defaultConfiguration) { QNetworkConfiguration config; - config.d = firstDiscovered; + config.d = defaultConfiguration; return config; } - // No Active or Discovered SNAPs, do same for InternetAccessPoints. - firstDiscovered.reset(); + /* + No Active or Discovered SNAPs, find the perferred access point. + The following priority order is used: + + 1. Active Ethernet + 2. Active WLAN + 3. Active Other + 4. Discovered Ethernet + 5. Discovered WLAN + 6. Discovered Other + */ + + defaultConfiguration.reset(); foreach (QBearerEngine *engine, conPriv->engines()) { QHash::Iterator it; @@ -267,22 +280,42 @@ QNetworkConfiguration QNetworkConfigurationManager::defaultConfiguration() const for (it = engine->accessPointConfigurations.begin(), end = engine->accessPointConfigurations.end(); it != end; ++it) { - if ((it.value()->state & QNetworkConfiguration::Active) == - QNetworkConfiguration::Active) { - QNetworkConfiguration config; - config.d = it.value(); - return config; - } else if ((it.value()->state & QNetworkConfiguration::Discovered) == - QNetworkConfiguration::Discovered) { - firstDiscovered = it.value(); + + if ((it.value()->state & QNetworkConfiguration::Discovered) == + QNetworkConfiguration::Discovered) { + if (!defaultConfiguration) { + defaultConfiguration = it.value(); + } else { + if (defaultConfiguration->state == it.value()->state) { + if (defaultConfiguration->bearerName() == QLatin1String("Ethernet")) { + // do nothing + } else if (defaultConfiguration->bearerName() == QLatin1String("WLAN")) { + // ethernet beats wlan + if (it.value()->bearerName() == QLatin1String("Ethernet")) + defaultConfiguration = it.value(); + } else { + // ethernet and wlan beats other + if (it.value()->bearerName() == QLatin1String("Ethernet") || + it.value()->bearerName() == QLatin1String("WLAN")) { + defaultConfiguration = it.value(); + } + } + } else { + // active beats discovered + if ((defaultConfiguration->state & QNetworkConfiguration::Active) != + QNetworkConfiguration::Active) { + defaultConfiguration = it.value(); + } + } + } } } } // No Active InternetAccessPoint return first Discovered InternetAccessPoint. - if (firstDiscovered) { + if (defaultConfiguration) { QNetworkConfiguration config; - config.d = firstDiscovered; + config.d = defaultConfiguration; return config; } -- cgit v0.12 From 92c624b6e26cf950ca651cee59be8ab53ada9a7d Mon Sep 17 00:00:00 2001 From: Aaron McCarthy Date: Fri, 5 Mar 2010 12:10:19 +1000 Subject: Don't keep polling network sessions open indefinitely. --- src/network/access/qnetworkaccessmanager.cpp | 21 +++++++- src/network/access/qnetworkaccessmanager.h | 1 + src/network/access/qnetworkaccessmanager_p.h | 2 + src/network/bearer/qnetworksession.cpp | 14 +++++ src/plugins/bearer/qnetworksession_impl.cpp | 52 +++++++++++++++--- src/plugins/bearer/qnetworksession_impl.h | 9 ++-- .../qnetworksession/test/tst_qnetworksession.cpp | 63 ++++++++++++++++++++++ 7 files changed, 148 insertions(+), 14 deletions(-) diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp index 5876ee2..7bb1399 100644 --- a/src/network/access/qnetworkaccessmanager.cpp +++ b/src/network/access/qnetworkaccessmanager.cpp @@ -880,11 +880,16 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera return new QDisabledNetworkReply(this, req, op); } - if (d->initializeSession && !d->networkSession) { + if (!d->networkSession && (d->initializeSession || !d->networkConfiguration.isEmpty())) { QNetworkConfigurationManager manager; - d->createSession(manager.defaultConfiguration()); + if (d->networkConfiguration.isEmpty()) + d->createSession(manager.defaultConfiguration()); + else + d->createSession(manager.configurationFromIdentifier(d->networkConfiguration)); d->initializeSession = false; + } else if (d->networkSession) { + d->networkSession->setSessionProperty(QLatin1String("AutoCloseSessionTimeout"), -1); } QNetworkRequest request = req; @@ -943,6 +948,9 @@ void QNetworkAccessManagerPrivate::_q_replyFinished() QNetworkReply *reply = qobject_cast(q->sender()); if (reply) emit q->finished(reply); + + if (networkSession && q->findChildren().count() == 1) + networkSession->setSessionProperty(QLatin1String("AutoCloseSessionTimeout"), 120000); } void QNetworkAccessManagerPrivate::_q_replySslErrors(const QList &errors) @@ -1210,6 +1218,7 @@ void QNetworkAccessManagerPrivate::createSession(const QNetworkConfiguration &co networkSession = new QNetworkSession(config, q); QObject::connect(networkSession, SIGNAL(opened()), q, SIGNAL(networkSessionOnline())); + QObject::connect(networkSession, SIGNAL(closed()), q, SLOT(_q_networkSessionClosed())); QObject::connect(networkSession, SIGNAL(newConfigurationActivated()), q, SLOT(_q_networkSessionNewConfigurationActivated())); QObject::connect(networkSession, @@ -1218,6 +1227,14 @@ void QNetworkAccessManagerPrivate::createSession(const QNetworkConfiguration &co SLOT(_q_networkSessionPreferredConfigurationChanged(QNetworkConfiguration,bool))); } +void QNetworkAccessManagerPrivate::_q_networkSessionClosed() +{ + networkConfiguration = networkSession->configuration().identifier(); + + delete networkSession; + networkSession = 0; +} + void QNetworkAccessManagerPrivate::_q_networkSessionNewConfigurationActivated() { Q_Q(QNetworkAccessManager); diff --git a/src/network/access/qnetworkaccessmanager.h b/src/network/access/qnetworkaccessmanager.h index 252dfd0..694a54f 100644 --- a/src/network/access/qnetworkaccessmanager.h +++ b/src/network/access/qnetworkaccessmanager.h @@ -139,6 +139,7 @@ private: Q_DECLARE_PRIVATE(QNetworkAccessManager) Q_PRIVATE_SLOT(d_func(), void _q_replyFinished()) Q_PRIVATE_SLOT(d_func(), void _q_replySslErrors(QList)) + Q_PRIVATE_SLOT(d_func(), void _q_networkSessionClosed()) Q_PRIVATE_SLOT(d_func(), void _q_networkSessionNewConfigurationActivated()) Q_PRIVATE_SLOT(d_func(), void _q_networkSessionPreferredConfigurationChanged(QNetworkConfiguration,bool)) }; diff --git a/src/network/access/qnetworkaccessmanager_p.h b/src/network/access/qnetworkaccessmanager_p.h index 8d772f0..0140268 100644 --- a/src/network/access/qnetworkaccessmanager_p.h +++ b/src/network/access/qnetworkaccessmanager_p.h @@ -105,6 +105,7 @@ public: void createSession(const QNetworkConfiguration &config); + void _q_networkSessionClosed(); void _q_networkSessionNewConfigurationActivated(); void _q_networkSessionPreferredConfigurationChanged(const QNetworkConfiguration &config, bool isSeamless); @@ -121,6 +122,7 @@ public: #endif QNetworkSession *networkSession; + QString networkConfiguration; bool networkAccessEnabled; bool initializeSession; diff --git a/src/network/bearer/qnetworksession.cpp b/src/network/bearer/qnetworksession.cpp index f0d7ede..27922af 100644 --- a/src/network/bearer/qnetworksession.cpp +++ b/src/network/bearer/qnetworksession.cpp @@ -492,6 +492,20 @@ QString QNetworkSession::errorString() const \o Setting this property to \i true before calling \l open() implies that the connection attempt is made but if no connection can be established, the user is not connsulted and asked to select a suitable connection. This property is not set by default and support for it depends on the platform. + + \row + \o AutoCloseSessionTimeout + \o If the session requires polling to keep its state up to date, this property holds + the timeout in milliseconds before the session will automatically close. If the + value of this property is -1 the session will not automatically close. This property + is set to -1 by default. + + The purpose of this property is to minimize resource use on platforms that use + polling to update the state of the session. Applications can set the value of this + property to the desired timeout before the session is closed. In response to the + closed() signal the network session should be deleted to ensure that all polling is + stopped. The session can then be recreated once it is required again. This property + has no effect for sessions that do not require polling. \endtable */ QVariant QNetworkSession::sessionProperty(const QString& key) const diff --git a/src/plugins/bearer/qnetworksession_impl.cpp b/src/plugins/bearer/qnetworksession_impl.cpp index 11585ef..0ba1237 100644 --- a/src/plugins/bearer/qnetworksession_impl.cpp +++ b/src/plugins/bearer/qnetworksession_impl.cpp @@ -100,9 +100,6 @@ void QNetworkSessionManagerPrivate::forceSessionClose(const QNetworkConfiguratio void QNetworkSessionPrivateImpl::syncStateWithInterface() { - connect(&manager, SIGNAL(updateCompleted()), this, SLOT(networkConfigurationsChanged())); - connect(&manager, SIGNAL(configurationChanged(QNetworkConfiguration)), - this, SLOT(configurationChanged(QNetworkConfiguration))); connect(sessionManager(), SIGNAL(forcedSessionClose(QNetworkConfiguration)), this, SLOT(forcedSessionClose(QNetworkConfiguration))); @@ -119,6 +116,10 @@ void QNetworkSessionPrivateImpl::syncStateWithInterface() activeConfig = publicConfig; engine = getEngineFromId(activeConfig.identifier()); if (engine) { + qRegisterMetaType("QNetworkConfigurationPrivatePointer"); + connect(engine, SIGNAL(configurationChanged(QNetworkConfigurationPrivatePointer)), + this, SLOT(configurationChanged(QNetworkConfigurationPrivatePointer)), + Qt::QueuedConnection); connect(engine, SIGNAL(connectionError(QString,QBearerEngineImpl::ConnectionError)), this, SLOT(connectionError(QString,QBearerEngineImpl::ConnectionError)), Qt::QueuedConnection); @@ -233,13 +234,37 @@ QNetworkInterface QNetworkSessionPrivateImpl::currentInterface() const return QNetworkInterface::interfaceFromName(interface); } -QVariant QNetworkSessionPrivateImpl::sessionProperty(const QString& /*key*/) const +QVariant QNetworkSessionPrivateImpl::sessionProperty(const QString &key) const { + if (key == QLatin1String("AutoCloseSessionTimeout")) { + if (engine && engine->requiresPolling() && + !(engine->capabilities() & QNetworkConfigurationManager::CanStartAndStopInterfaces)) { + if (sessionTimeout >= 0) + return sessionTimeout * 10000; + else + return -1; + } + } + return QVariant(); } -void QNetworkSessionPrivateImpl::setSessionProperty(const QString& /*key*/, const QVariant& /*value*/) +void QNetworkSessionPrivateImpl::setSessionProperty(const QString &key, const QVariant &value) { + if (key == QLatin1String("AutoCloseSessionTimeout")) { + if (engine && engine->requiresPolling() && + !(engine->capabilities() & QNetworkConfigurationManager::CanStartAndStopInterfaces)) { + int timeout = value.toInt(); + if (timeout >= 0) { + connect(engine, SIGNAL(updateCompleted()), + this, SLOT(decrementTimeout()), Qt::UniqueConnection); + sessionTimeout = timeout / 10000; // convert to poll intervals + } else { + disconnect(engine, SIGNAL(updateCompleted()), this, SLOT(decrementTimeout())); + sessionTimeout = -1; + } + } + } } QString QNetworkSessionPrivateImpl::errorString() const @@ -364,12 +389,14 @@ void QNetworkSessionPrivateImpl::networkConfigurationsChanged() startTime = engine->startTime(activeConfig.identifier()); } -void QNetworkSessionPrivateImpl::configurationChanged(const QNetworkConfiguration &config) +void QNetworkSessionPrivateImpl::configurationChanged(QNetworkConfigurationPrivatePointer config) { - if (serviceConfig.isValid() && (config == serviceConfig || config == activeConfig)) + if (serviceConfig.isValid() && + (config->id == serviceConfig.identifier() || config->id == activeConfig.identifier())) { updateStateFromServiceNetwork(); - else if (config == activeConfig) + } else if (config->id == activeConfig.identifier()) { updateStateFromActiveConfig(); + } } void QNetworkSessionPrivateImpl::forcedSessionClose(const QNetworkConfiguration &config) @@ -406,4 +433,13 @@ void QNetworkSessionPrivateImpl::connectionError(const QString &id, } } +void QNetworkSessionPrivateImpl::decrementTimeout() +{ + if (--sessionTimeout <= 0) { + disconnect(engine, SIGNAL(updateCompleted()), this, SLOT(decrementTimeout())); + sessionTimeout = -1; + close(); + } +} + QT_END_NAMESPACE diff --git a/src/plugins/bearer/qnetworksession_impl.h b/src/plugins/bearer/qnetworksession_impl.h index 7349e77..c644174 100644 --- a/src/plugins/bearer/qnetworksession_impl.h +++ b/src/plugins/bearer/qnetworksession_impl.h @@ -69,7 +69,7 @@ class QNetworkSessionPrivateImpl : public QNetworkSessionPrivate Q_OBJECT public: QNetworkSessionPrivateImpl() - : startTime(0) + : startTime(0), sessionTimeout(-1) { } @@ -108,13 +108,12 @@ private: private Q_SLOTS: void networkConfigurationsChanged(); - void configurationChanged(const QNetworkConfiguration &config); + void configurationChanged(QNetworkConfigurationPrivatePointer config); void forcedSessionClose(const QNetworkConfiguration &config); void connectionError(const QString &id, QBearerEngineImpl::ConnectionError error); + void decrementTimeout(); private: - QNetworkConfigurationManager manager; - bool opened; QBearerEngineImpl *engine; @@ -122,6 +121,8 @@ private: QNetworkSession::SessionError lastError; quint64 startTime; + + int sessionTimeout; }; QT_END_NAMESPACE diff --git a/tests/auto/qnetworksession/test/tst_qnetworksession.cpp b/tests/auto/qnetworksession/test/tst_qnetworksession.cpp index 58b1a48..4b56f77 100644 --- a/tests/auto/qnetworksession/test/tst_qnetworksession.cpp +++ b/tests/auto/qnetworksession/test/tst_qnetworksession.cpp @@ -85,6 +85,9 @@ private slots: void sessionOpenCloseStop_data(); void sessionOpenCloseStop(); + void sessionAutoClose_data(); + void sessionAutoClose(); + private: QNetworkConfigurationManager manager; @@ -1202,7 +1205,67 @@ bool closeSession(QNetworkSession *session, bool lastSessionOnConfiguration) { return true; } +void tst_QNetworkSession::sessionAutoClose_data() +{ + QTest::addColumn("configuration"); + + bool testData = false; + foreach (const QNetworkConfiguration &config, + manager.allConfigurations(QNetworkConfiguration::Discovered)) { + QNetworkSession session(config); + if (!session.sessionProperty(QLatin1String("AutoCloseSessionTimeout")).isValid()) + continue; + + testData = true; + + const QString name = config.name().isEmpty() ? QString("") : config.name(); + QTest::newRow(name.toLocal8Bit().constData()) << config; + } + + if (!testData) + QSKIP("No applicable configurations to test", SkipAll); +} + +void tst_QNetworkSession::sessionAutoClose() +{ + QFETCH(QNetworkConfiguration, configuration); + + QNetworkSession session(configuration); + + QVERIFY(session.configuration() == configuration); + QVariant autoCloseSession = session.sessionProperty(QLatin1String("AutoCloseSessionTimeout")); + + QVERIFY(autoCloseSession.isValid()); + + // property defaults to false + QCOMPARE(autoCloseSession.toInt(), -1); + + QSignalSpy closeSpy(&session, SIGNAL(closed())); + + session.open(); + session.waitForOpened(); + + if (!session.isOpen()) + QSKIP("Session not open", SkipSingle); + + // set session to auto close at next polling interval. + session.setSessionProperty(QLatin1String("AutoCloseSessionTimeout"), 0); + + QTRY_VERIFY(!closeSpy.isEmpty()); + + QCOMPARE(session.state(), QNetworkSession::Connected); + + QVERIFY(!session.isOpen()); + + QVERIFY(session.configuration() == configuration); + + autoCloseSession = session.sessionProperty(QLatin1String("AutoCloseSessionTimeout")); + + QVERIFY(autoCloseSession.isValid()); + + QCOMPARE(autoCloseSession.toInt(), -1); +} QTEST_MAIN(tst_QNetworkSession) -- cgit v0.12 From 9b7e3943b0e67af48fdbb993c5c4cc93dac81304 Mon Sep 17 00:00:00 2001 From: Aaron McCarthy Date: Thu, 4 Mar 2010 18:04:40 +1000 Subject: Remove unnecessary qWarnings from bearer management code. --- src/plugins/bearer/icd/qicdengine.cpp | 23 +++----- src/plugins/bearer/icd/qnetworksession_impl.cpp | 13 ++--- .../bearer/nativewifi/qnativewifiengine.cpp | 62 ++++++++++++++++------ .../networkmanager/qnetworkmanagerservice.cpp | 8 --- src/plugins/bearer/nla/qnlaengine.cpp | 56 ++++++++----------- src/plugins/bearer/qnetworksession_impl.cpp | 4 -- 6 files changed, 77 insertions(+), 89 deletions(-) diff --git a/src/plugins/bearer/icd/qicdengine.cpp b/src/plugins/bearer/icd/qicdengine.cpp index 206a6fd..5e506ef 100644 --- a/src/plugins/bearer/icd/qicdengine.cpp +++ b/src/plugins/bearer/icd/qicdengine.cpp @@ -206,14 +206,11 @@ void QIcdEngine::doRequestUpdate() QString iap_type = saved_ap.value("type").toString(); if (iap_type.startsWith("WLAN")) { ssid = saved_ap.value("wlan_ssid").toByteArray(); - if (ssid.isEmpty()) { - qWarning() << "Cannot get ssid for" << iap_id; + if (ssid.isEmpty()) continue; - } QString security_method = saved_ap.value("wlan_security").toString(); } else if (iap_type.isEmpty()) { - qWarning() << "IAP" << iap_id << "network type is not set! Skipping it"; continue; } else { #ifdef BEARER_MANAGEMENT_DEBUG @@ -270,7 +267,9 @@ void QIcdEngine::doRequestUpdate() scanned, error); if (!error.isEmpty()) { - qWarning() << "Network scanning failed" << error; +#ifdef BEARER_MANAGEMENT_DEBUG + qDebug() << "Network scanning failed" << error; +#endif } else { #ifdef BEARER_MANAGEMENT_DEBUG if (!scanned.isEmpty()) @@ -379,19 +378,13 @@ void QIcdEngine::deleteConfiguration(const QString &iap_id) * or read all the IAPs from db because it might take too much power * (multiple applications would need to scan and read all IAPs from db) */ - if (accessPointConfigurations.contains(iap_id)) { - QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.take(iap_id); - - if (ptr) { - ptr->isValid = false; + QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.take(iap_id); + if (ptr) { #ifdef BEARER_MANAGEMENT_DEBUG - qDebug() << "IAP" << iap_id << "was removed from storage."; + qDebug() << "IAP" << iap_id << "was removed from storage."; #endif - emit configurationRemoved(ptr); - } else { - qWarning("Configuration not found for IAP %s", iap_id.toAscii().data()); - } + emit configurationRemoved(ptr); } else { #ifdef BEARER_MANAGEMENT_DEBUG qDebug("IAP: %s, already missing from the known list", iap_id.toAscii().data()); diff --git a/src/plugins/bearer/icd/qnetworksession_impl.cpp b/src/plugins/bearer/icd/qnetworksession_impl.cpp index 03624fa..bb81408 100644 --- a/src/plugins/bearer/icd/qnetworksession_impl.cpp +++ b/src/plugins/bearer/icd/qnetworksession_impl.cpp @@ -140,7 +140,9 @@ static DBusHandlerResult signal_handler(DBusConnection *, DBUS_TYPE_STRING, &network_type, DBUS_TYPE_STRING, &state, DBUS_TYPE_INVALID) == FALSE) { - qWarning() << QString("Failed to parse icd status signal: %1").arg(error.message); +#ifdef BEARER_MANAGEMENT_DEBUG + qDebug() << QString("Failed to parse icd status signal: %1").arg(error.message); +#endif } else { QString _iap_id(iap_id); QString _network_type(network_type); @@ -166,7 +168,6 @@ void IcdListener::setup(QNetworkSessionPrivateImpl *d) dbus_connection = get_dbus_conn(&error); if (dbus_error_is_set(&error)) { - qWarning() << "Cannot get dbus connection."; dbus_error_free(&error); return; } @@ -176,7 +177,6 @@ void IcdListener::setup(QNetworkSessionPrivateImpl *d) dbus_bus_add_match(dbus_connection, ICD_DBUS_MATCH, &error); if (dbus_error_is_set(&error)) { - qWarning() << "Cannot add match" << ICD_DBUS_MATCH; dbus_error_free(&error); return; } @@ -185,7 +185,6 @@ void IcdListener::setup(QNetworkSessionPrivateImpl *d) ICD_DBUS_PATH, &icd_vtable, (void*)this) == FALSE) { - qWarning() << "Cannot register dbus signal handler, interface"<< ICD_DBUS_INTERFACE << "path" << ICD_DBUS_PATH; dbus_error_free(&error); return; } @@ -340,8 +339,6 @@ void QNetworkSessionPrivateImpl::updateIdentifier(QString &newId) } else { toIcdConfig(privateConfiguration(publicConfig))->network_attrs |= ICD_NW_ATTR_IAPNAME; if (privateConfiguration(publicConfig)->id != newId) { - qWarning() << "Your config id changed from" << privateConfiguration(publicConfig)->id - << "to" << newId; privateConfiguration(publicConfig)->id = newId; } } @@ -1015,25 +1012,21 @@ void QNetworkSessionPrivateImpl::stop() void QNetworkSessionPrivateImpl::migrate() { - qWarning("This platform does not support roaming (%s).", __FUNCTION__); } void QNetworkSessionPrivateImpl::accept() { - qWarning("This platform does not support roaming (%s).", __FUNCTION__); } void QNetworkSessionPrivateImpl::ignore() { - qWarning("This platform does not support roaming (%s).", __FUNCTION__); } void QNetworkSessionPrivateImpl::reject() { - qWarning("This platform does not support roaming (%s).", __FUNCTION__); } diff --git a/src/plugins/bearer/nativewifi/qnativewifiengine.cpp b/src/plugins/bearer/nativewifi/qnativewifiengine.cpp index ec2da00..952a6a3 100644 --- a/src/plugins/bearer/nativewifi/qnativewifiengine.cpp +++ b/src/plugins/bearer/nativewifi/qnativewifiengine.cpp @@ -83,8 +83,10 @@ QNativeWifiEngine::QNativeWifiEngine(QObject *parent) DWORD result = local_WlanOpenHandle(1, 0, &clientVersion, &handle); if (result != ERROR_SUCCESS) { +#ifdef BEARER_MANAGEMENT_DEBUG if (result != ERROR_SERVICE_NOT_ACTIVE) - qWarning("%s: WlanOpenHandle failed with error %ld\n", __FUNCTION__, result); + qDebug("%s: WlanOpenHandle failed with error %ld\n", __FUNCTION__, result); +#endif return; } @@ -92,8 +94,10 @@ QNativeWifiEngine::QNativeWifiEngine(QObject *parent) result = local_WlanRegisterNotification(handle, WLAN_NOTIFICATION_SOURCE_ALL, true, WLAN_NOTIFICATION_CALLBACK(qNotificationCallback), this, 0, 0); +#ifdef BEARER_MANAGEMENT_DEBUG if (result != ERROR_SUCCESS) - qWarning("%s: WlanRegisterNotification failed with error %ld\n", __FUNCTION__, result); + qDebug("%s: WlanRegisterNotification failed with error %ld\n", __FUNCTION__, result); +#endif scanComplete(); } @@ -113,7 +117,9 @@ void QNativeWifiEngine::scanComplete() WLAN_INTERFACE_INFO_LIST *interfaceList; DWORD result = local_WlanEnumInterfaces(handle, 0, &interfaceList); if (result != ERROR_SUCCESS) { - qWarning("%s: WlanEnumInterfaces failed with error %ld\n", __FUNCTION__, result); +#ifdef BEARER_MANAGEMENT_DEBUG + qDebug("%s: WlanEnumInterfaces failed with error %ld\n", __FUNCTION__, result); +#endif return; } @@ -124,8 +130,10 @@ void QNativeWifiEngine::scanComplete() result = local_WlanGetAvailableNetworkList(handle, &interface.InterfaceGuid, 3, 0, &networkList); if (result != ERROR_SUCCESS) { - qWarning("%s: WlanGetAvailableNetworkList failed with error %ld\n", - __FUNCTION__, result); +#ifdef BEARER_MANAGEMENT_DEBUG + qDebug("%s: WlanGetAvailableNetworkList failed with error %ld\n", + __FUNCTION__, result); +#endif continue; } @@ -229,7 +237,9 @@ QString QNativeWifiEngine::getInterfaceFromId(const QString &id) WLAN_INTERFACE_INFO_LIST *interfaceList; DWORD result = local_WlanEnumInterfaces(handle, 0, &interfaceList); if (result != ERROR_SUCCESS) { - qWarning("%s: WlanEnumInterfaces failed with error %ld\n", __FUNCTION__, result); +#ifdef BEARER_MANAGEMENT_DEBUG + qDebug("%s: WlanEnumInterfaces failed with error %ld\n", __FUNCTION__, result); +#endif return QString(); } @@ -242,8 +252,10 @@ QString QNativeWifiEngine::getInterfaceFromId(const QString &id) wlan_intf_opcode_current_connection, 0, &dataSize, reinterpret_cast(&connectionAttributes), 0); if (result != ERROR_SUCCESS) { +#ifdef BEARER_MANAGEMENT_DEBUG if (result != ERROR_INVALID_STATE) - qWarning("%s: WlanQueryInterface failed with error %ld\n", __FUNCTION__, result); + qDebug("%s: WlanQueryInterface failed with error %ld\n", __FUNCTION__, result); +#endif continue; } @@ -280,7 +292,9 @@ bool QNativeWifiEngine::hasIdentifier(const QString &id) WLAN_INTERFACE_INFO_LIST *interfaceList; DWORD result = local_WlanEnumInterfaces(handle, 0, &interfaceList); if (result != ERROR_SUCCESS) { - qWarning("%s: WlanEnumInterfaces failed with error %ld\n", __FUNCTION__, result); +#ifdef BEARER_MANAGEMENT_DEBUG + qDebug("%s: WlanEnumInterfaces failed with error %ld\n", __FUNCTION__, result); +#endif return false; } @@ -291,8 +305,10 @@ bool QNativeWifiEngine::hasIdentifier(const QString &id) result = local_WlanGetAvailableNetworkList(handle, &interface.InterfaceGuid, 3, 0, &networkList); if (result != ERROR_SUCCESS) { - qWarning("%s: WlanGetAvailableNetworkList failed with error %ld\n", - __FUNCTION__, result); +#ifdef BEARER_MANAGEMENT_DEBUG + qDebug("%s: WlanGetAvailableNetworkList failed with error %ld\n", + __FUNCTION__, result); +#endif continue; } @@ -335,7 +351,9 @@ void QNativeWifiEngine::connectToId(const QString &id) WLAN_INTERFACE_INFO_LIST *interfaceList; DWORD result = local_WlanEnumInterfaces(handle, 0, &interfaceList); if (result != ERROR_SUCCESS) { - qWarning("%s: WlanEnumInterfaces failed with error %ld\n", __FUNCTION__, result); +#ifdef BEARER_MANAGEMENT_DEBUG + qDebug("%s: WlanEnumInterfaces failed with error %ld\n", __FUNCTION__, result); +#endif emit connectionError(id, InterfaceLookupError); return; } @@ -349,8 +367,10 @@ void QNativeWifiEngine::connectToId(const QString &id) result = local_WlanGetAvailableNetworkList(handle, &interface.InterfaceGuid, 3, 0, &networkList); if (result != ERROR_SUCCESS) { - qWarning("%s: WlanGetAvailableNetworkList failed with error %ld\n", - __FUNCTION__, result); +#ifdef BEARER_MANAGEMENT_DEBUG + qDebug("%s: WlanGetAvailableNetworkList failed with error %ld\n", + __FUNCTION__, result); +#endif continue; } @@ -378,7 +398,9 @@ void QNativeWifiEngine::connectToId(const QString &id) DWORD result = local_WlanConnect(handle, &interface.InterfaceGuid, ¶meters, 0); if (result != ERROR_SUCCESS) { - qWarning("%s: WlanConnect failed with error %ld\n", __FUNCTION__, result); +#ifdef BEARER_MANAGEMENT_DEBUG + qDebug("%s: WlanConnect failed with error %ld\n", __FUNCTION__, result); +#endif emit connectionError(id, ConnectError); break; } @@ -417,7 +439,9 @@ void QNativeWifiEngine::disconnectFromId(const QString &id) DWORD result = local_WlanDisconnect(handle, &guid, 0); if (result != ERROR_SUCCESS) { - qWarning("%s: WlanDisconnect failed with error %ld\n", __FUNCTION__, result); +#ifdef BEARER_MANAGEMENT_DEBUG + qDebug("%s: WlanDisconnect failed with error %ld\n", __FUNCTION__, result); +#endif emit connectionError(id, DisconnectionError); return; } @@ -431,14 +455,18 @@ void QNativeWifiEngine::requestUpdate() WLAN_INTERFACE_INFO_LIST *interfaceList; DWORD result = local_WlanEnumInterfaces(handle, 0, &interfaceList); if (result != ERROR_SUCCESS) { - qWarning("%s: WlanEnumInterfaces failed with error %ld\n", __FUNCTION__, result); +#ifdef BEARER_MANAGEMENT_DEBUG + qDebug("%s: WlanEnumInterfaces failed with error %ld\n", __FUNCTION__, result); +#endif return; } for (unsigned int i = 0; i < interfaceList->dwNumberOfItems; ++i) { result = local_WlanScan(handle, &interfaceList->InterfaceInfo[i].InterfaceGuid, 0, 0, 0); +#ifdef BEARER_MANAGEMENT_DEBUG if (result != ERROR_SUCCESS) - qWarning("%s: WlanScan failed with error %ld\n", __FUNCTION__, result); + qDebug("%s: WlanScan failed with error %ld\n", __FUNCTION__, result); +#endif } local_WlanFreeMemory(interfaceList); diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp index c780fbc..d23bb0d 100644 --- a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp +++ b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp @@ -199,7 +199,6 @@ QNetworkManagerInterfaceAccessPoint::QNetworkManagerInterfaceAccessPoint(const Q dbusConnection); if (!d->connectionInterface->isValid()) { d->valid = false; - qWarning() << "Could not find InterfaceAccessPoint"; return; } d->valid = true; @@ -308,7 +307,6 @@ QNetworkManagerInterfaceDevice::QNetworkManagerInterfaceDevice(const QString &de dbusConnection); if (!d->connectionInterface->isValid()) { d->valid = false; - qWarning() << "Could not find NetworkManagerInterfaceDevice"; return; } d->valid = true; @@ -400,7 +398,6 @@ QNetworkManagerInterfaceDeviceWired::QNetworkManagerInterfaceDeviceWired(const Q dbusConnection, parent); if (!d->connectionInterface->isValid()) { d->valid = false; - qWarning() << "Could not find InterfaceDeviceWired"; return; } d->valid = true; @@ -478,7 +475,6 @@ QNetworkManagerInterfaceDeviceWireless::QNetworkManagerInterfaceDeviceWireless(c dbusConnection, parent); if (!d->connectionInterface->isValid()) { d->valid = false; - qWarning() << "Could not find InterfaceDeviceWireless"; return; } d->valid = true; @@ -596,7 +592,6 @@ QNetworkManagerSettings::QNetworkManagerSettings(const QString &settingsService, dbusConnection); if (!d->connectionInterface->isValid()) { d->valid = false; - //qWarning() << "Could not find NetworkManagerSettings"; return; } d->valid = true; @@ -660,7 +655,6 @@ QNetworkManagerSettingsConnection::QNetworkManagerSettingsConnection(const QStri QLatin1String(NM_DBUS_IFACE_SETTINGS_CONNECTION), dbusConnection, parent); if (!d->connectionInterface->isValid()) { - //qWarning() << "Could not find NetworkManagerSettingsConnection"; d->valid = false; return; } @@ -883,7 +877,6 @@ QNetworkManagerConnectionActive::QNetworkManagerConnectionActive( const QString dbusConnection, parent); if (!d->connectionInterface->isValid()) { d->valid = false; - //qWarning() << "Could not find NetworkManagerSettingsConnection"; return; } d->valid = true; @@ -978,7 +971,6 @@ QNetworkManagerIp4Config::QNetworkManagerIp4Config( const QString &deviceObjectP dbusConnection, parent); if (!d->connectionInterface->isValid()) { d->valid = false; - //qWarning() << "Could not find NetworkManagerIp4Config"; return; } d->valid = true; diff --git a/src/plugins/bearer/nla/qnlaengine.cpp b/src/plugins/bearer/nla/qnlaengine.cpp index ff334e5..334eb14 100644 --- a/src/plugins/bearer/nla/qnlaengine.cpp +++ b/src/plugins/bearer/nla/qnlaengine.cpp @@ -228,8 +228,11 @@ QNlaThread::~QNlaThread() if (handle) { /* cancel completion event */ - if (WSALookupServiceEnd(handle) == SOCKET_ERROR) - qWarning("WSALookupServiceEnd error %d", WSAGetLastError()); + if (WSALookupServiceEnd(handle) == SOCKET_ERROR) { +#ifdef BEARER_MANAGEMENT_DEBUG + qDebug("WSALookupServiceEnd error %d", WSAGetLastError()); +#endif + } } mutex.unlock(); @@ -252,8 +255,11 @@ void QNlaThread::forceUpdate() if (handle) { /* cancel completion event */ - if (WSALookupServiceEnd(handle) == SOCKET_ERROR) - qWarning("WSALookupServiceEnd error %d", WSAGetLastError()); + if (WSALookupServiceEnd(handle) == SOCKET_ERROR) { +#ifdef BEARER_MANAGEMENT_DEBUG + qDebug("WSALookupServiceEnd error %d", WSAGetLastError()); +#endif + } handle = 0; } mutex.unlock(); @@ -262,10 +268,8 @@ void QNlaThread::forceUpdate() void QNlaThread::run() { WSAEVENT changeEvent = WSACreateEvent(); - if (changeEvent == WSA_INVALID_EVENT) { - qWarning("WSACreateEvent error %d", WSAGetLastError()); + if (changeEvent == WSA_INVALID_EVENT) return; - } while (true) { fetchConfigurations(); @@ -284,10 +288,8 @@ void QNlaThread::run() int result = WSALookupServiceBegin(&qsRestrictions, LUP_RETURN_ALL, &handle); mutex.unlock(); - if (result == SOCKET_ERROR) { - qWarning("%s: WSALookupServiceBegin error %d", __FUNCTION__, WSAGetLastError()); + if (result == SOCKET_ERROR) break; - } WSACOMPLETION completion; WSAOVERLAPPED overlapped; @@ -303,11 +305,8 @@ void QNlaThread::run() result = WSANSPIoctl(handle, SIO_NSP_NOTIFY_CHANGE, 0, 0, 0, 0, &bytesReturned, &completion); if (result == SOCKET_ERROR) { - int error = WSAGetLastError(); - if (error != WSA_IO_PENDING) { - qWarning("WSANSPIoctl error %d", error); + if (WSAGetLastError() != WSA_IO_PENDING) break; - } } #ifndef Q_OS_WINCE @@ -325,7 +324,6 @@ void QNlaThread::run() if (handle) { result = WSALookupServiceEnd(handle); if (result == SOCKET_ERROR) { - qWarning("WSALookupServiceEnd error %d", WSAGetLastError()); mutex.unlock(); break; } @@ -360,7 +358,7 @@ DWORD QNlaThread::parseBlob(NLA_BLOB *blob, QNetworkConfigurationPrivate *cpPriv switch (blob->header.type) { case NLA_RAW_DATA: #ifdef BEARER_MANAGEMENT_DEBUG - qWarning("%s: unhandled header type NLA_RAW_DATA", __FUNCTION__); + qDebug("%s: unhandled header type NLA_RAW_DATA", __FUNCTION__); #endif break; case NLA_INTERFACE: @@ -372,7 +370,7 @@ DWORD QNlaThread::parseBlob(NLA_BLOB *blob, QNetworkConfigurationPrivate *cpPriv break; case NLA_802_1X_LOCATION: #ifdef BEARER_MANAGEMENT_DEBUG - qWarning("%s: unhandled header type NLA_802_1X_LOCATION", __FUNCTION__); + qDebug("%s: unhandled header type NLA_802_1X_LOCATION", __FUNCTION__); #endif break; case NLA_CONNECTIVITY: @@ -380,18 +378,15 @@ DWORD QNlaThread::parseBlob(NLA_BLOB *blob, QNetworkConfigurationPrivate *cpPriv cpPriv->internet = true; else cpPriv->internet = false; -#ifdef BEARER_MANAGEMENT_DEBUG - qWarning("%s: unhandled header type NLA_CONNECTIVITY", __FUNCTION__); -#endif break; case NLA_ICS: #ifdef BEARER_MANAGEMENT_DEBUG - qWarning("%s: unhandled header type NLA_ICS", __FUNCTION__); + qDebug("%s: unhandled header type NLA_ICS", __FUNCTION__); #endif break; default: #ifdef BEARER_MANAGEMENT_DEBUG - qWarning("%s: unhandled header type %d", __FUNCTION__, blob->header.type); + qDebug("%s: unhandled header type %d", __FUNCTION__, blob->header.type); #endif ; } @@ -462,7 +457,6 @@ void QNlaThread::fetchConfigurations() int result = WSALookupServiceBegin(&qsRestrictions, LUP_RETURN_ALL | LUP_DEEP, &hLookup); if (result == SOCKET_ERROR) { - qWarning("%s: WSALookupServiceBegin error %d", __FUNCTION__, WSAGetLastError()); mutex.lock(); fetchedConfigurations.clear(); mutex.unlock(); @@ -474,18 +468,8 @@ void QNlaThread::fetchConfigurations() result = WSALookupServiceNext(hLookup, LUP_RETURN_ALL, &bufferLength, reinterpret_cast(buffer)); - if (result == SOCKET_ERROR) { - int error = WSAGetLastError(); - - if (error == WSA_E_NO_MORE) - break; - - if (error == WSAEFAULT) - break; - - qWarning("WSALookupServiceNext error %d", WSAGetLastError()); + if (result == SOCKET_ERROR) break; - } QNetworkConfigurationPrivate *cpPriv = parseQuerySet(reinterpret_cast(buffer)); @@ -496,7 +480,9 @@ void QNlaThread::fetchConfigurations() if (hLookup) { result = WSALookupServiceEnd(hLookup); if (result == SOCKET_ERROR) { - qWarning("WSALookupServiceEnd error %d", WSAGetLastError()); +#ifdef BEARER_MANAGEMENT_DEBUG + qDebug("WSALookupServiceEnd error %d", WSAGetLastError()); +#endif } } diff --git a/src/plugins/bearer/qnetworksession_impl.cpp b/src/plugins/bearer/qnetworksession_impl.cpp index 0ba1237..db1759c 100644 --- a/src/plugins/bearer/qnetworksession_impl.cpp +++ b/src/plugins/bearer/qnetworksession_impl.cpp @@ -204,22 +204,18 @@ void QNetworkSessionPrivateImpl::stop() void QNetworkSessionPrivateImpl::migrate() { - qWarning("This platform does not support roaming (%s).", Q_FUNC_INFO); } void QNetworkSessionPrivateImpl::accept() { - qWarning("This platform does not support roaming (%s).", Q_FUNC_INFO); } void QNetworkSessionPrivateImpl::ignore() { - qWarning("This platform does not support roaming (%s).", Q_FUNC_INFO); } void QNetworkSessionPrivateImpl::reject() { - qWarning("This platform does not support roaming (%s).", Q_FUNC_INFO); } QNetworkInterface QNetworkSessionPrivateImpl::currentInterface() const -- cgit v0.12 From 20c7b2776133a9b3531ac711dd4f4be2d0523ddd Mon Sep 17 00:00:00 2001 From: Lorn Potter Date: Fri, 5 Mar 2010 15:28:31 +1000 Subject: add wifi power notifications. more Qt way for autorelease. and change to better way of getting wifi interfaces. --- src/plugins/bearer/corewlan/qcorewlanengine.h | 2 +- src/plugins/bearer/corewlan/qcorewlanengine.mm | 114 ++++++++++++++++++------- 2 files changed, 83 insertions(+), 33 deletions(-) diff --git a/src/plugins/bearer/corewlan/qcorewlanengine.h b/src/plugins/bearer/corewlan/qcorewlanengine.h index 3289ffb..cbaa9d6 100644 --- a/src/plugins/bearer/corewlan/qcorewlanengine.h +++ b/src/plugins/bearer/corewlan/qcorewlanengine.h @@ -78,7 +78,7 @@ public: QNetworkConfigurationPrivatePointer defaultConfiguration(); - bool getAllScInterfaces(); + bool getWifiInterfaces(); bool requiresPolling() const; diff --git a/src/plugins/bearer/corewlan/qcorewlanengine.mm b/src/plugins/bearer/corewlan/qcorewlanengine.mm index ec7d92b..8f174db 100644 --- a/src/plugins/bearer/corewlan/qcorewlanengine.mm +++ b/src/plugins/bearer/corewlan/qcorewlanengine.mm @@ -61,14 +61,78 @@ #include #include #include +#include #include +#include + QMap networkInterfaces; +#ifdef MAC_SDK_10_6 +@interface QNSListener : NSObject +{ + NSNotificationCenter *center; + CWInterface *currentInterface; + QCoreWlanEngine *engine; + NSAutoreleasePool *autoreleasepool; + NSLock *locker; +} +- (void)notificationHandler:(NSNotification *)notification; +- (void)remove; +- (void)setEngine:(QCoreWlanEngine *)coreEngine; +- (void)dealloc; + +@property (assign) QCoreWlanEngine* engine; + +@end + +@implementation QNSListener +- (id) init +{ + [locker lock]; + autoreleasepool = [[NSAutoreleasePool alloc] init]; + center = [NSNotificationCenter defaultCenter]; + currentInterface = [CWInterface interface]; +// [center addObserver:self selector:@selector(notificationHandler:) name:kCWLinkDidChangeNotification object:nil]; + [center addObserver:self selector:@selector(notificationHandler:) name:kCWPowerDidChangeNotification object:nil]; + [locker unlock]; + return self; +} + +-(void)dealloc +{ + [autoreleasepool release]; + [super dealloc]; +} + +-(void)setEngine:(QCoreWlanEngine *)coreEngine +{ + [locker lock]; + if(!engine) + engine = coreEngine; + [locker unlock]; +} + +-(void)remove +{ + [locker lock]; + [center removeObserver:self]; + [locker unlock]; +} + +- (void)notificationHandler:(NSNotification *)notification +{ + engine->requestUpdate(); +} +@end + +QNSListener *listener = 0; + +#endif + QT_BEGIN_NAMESPACE inline QString cfstringRefToQstring(CFStringRef cfStringRef) { -// return QString([cfStringRef UTF8String]); QString retVal; CFIndex maxLength = 2 * CFStringGetLength(cfStringRef) + 1/*zero term*/; // max UTF8 char *cstring = new char[maxLength]; @@ -122,12 +186,22 @@ QCoreWlanEngine::QCoreWlanEngine(QObject *parent) : QBearerEngineImpl(parent) { startNetworkChangeLoop(); + +#if defined(MAC_SDK_10_6) + if(!listener) { + listener = [[QNSListener alloc] init]; + listener.engine = this; + } +#endif } QCoreWlanEngine::~QCoreWlanEngine() { while (!foundConfigurations.isEmpty()) delete foundConfigurations.takeFirst(); + + [listener remove]; + [listener release]; } QString QCoreWlanEngine::getInterfaceFromId(const QString &id) @@ -249,7 +323,7 @@ void QCoreWlanEngine::doRequestUpdate() { QMutexLocker locker(&mutex); - getAllScInterfaces(); + getWifiInterfaces(); QStringList previous = accessPointConfigurations.keys(); @@ -337,7 +411,7 @@ QStringList QCoreWlanEngine::scanForSsids(const QString &interfaceName) QStringList found; #if defined(MAC_SDK_10_6) - NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; + QMacCocoaAutoReleasePool pool; CWInterface *currentInterface = [CWInterface interfaceWithName:qstringToNSString(interfaceName)]; if([currentInterface power]) { @@ -348,7 +422,6 @@ QStringList QCoreWlanEngine::scanForSsids(const QString &interfaceName) CWNetwork *apNetwork; if (!err) { for(uint row=0; row < [apArray count]; row++ ) { - NSAutoreleasePool *looppool = [[NSAutoreleasePool alloc] init]; apNetwork = [apArray objectAtIndex:row]; @@ -411,11 +484,9 @@ QStringList QCoreWlanEngine::scanForSsids(const QString &interfaceName) emit configurationAdded(ptr); } - [looppool release]; } } } - [autoreleasepool drain]; #else Q_UNUSED(interfaceName); #endif @@ -455,39 +526,18 @@ bool QCoreWlanEngine::isKnownSsid(const QString &interfaceName, const QString &s return false; } -bool QCoreWlanEngine::getAllScInterfaces() +bool QCoreWlanEngine::getWifiInterfaces() { QMutexLocker locker(&mutex); networkInterfaces.clear(); - NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; + QMacCocoaAutoReleasePool pool; - CFArrayRef interfaces = SCNetworkInterfaceCopyAll(); - if (interfaces != NULL) { - CFIndex interfaceCount; - CFIndex interfaceIndex; - interfaceCount = CFArrayGetCount(interfaces); - for (interfaceIndex = 0; interfaceIndex < interfaceCount; interfaceIndex++) { - NSAutoreleasePool *looppool = [[NSAutoreleasePool alloc] init]; - - CFStringRef bsdName; - CFTypeRef thisInterface = CFArrayGetValueAtIndex(interfaces, interfaceIndex); - bsdName = SCNetworkInterfaceGetBSDName((SCNetworkInterfaceRef)thisInterface); - QString interfaceName = cfstringRefToQstring(bsdName); - QString typeStr; - CFStringRef type = SCNetworkInterfaceGetInterfaceType((SCNetworkInterfaceRef)thisInterface); - if ( CFEqual(type, kSCNetworkInterfaceTypeIEEE80211)) { - typeStr = "WLAN"; - } - if(!networkInterfaces.contains(interfaceName) && !typeStr.isEmpty()) { - networkInterfaces.insert(interfaceName,typeStr); - } - [looppool release]; - } + NSArray *wifiInterfaces = [CWInterface supportedInterfaces]; + for(uint row=0; row < [wifiInterfaces count]; row++ ) { + networkInterfaces.insert( nsstringToQString([wifiInterfaces objectAtIndex:row]),"WLAN"); } - CFRelease(interfaces); - [autoreleasepool drain]; return true; } -- cgit v0.12 From fd7872eb4e7a721ec5fc734a29cecd27f778842a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Thu, 4 Mar 2010 09:12:31 +0100 Subject: Doc: fix spelling errors. --- doc/src/development/developing-on-mac.qdoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/development/developing-on-mac.qdoc b/doc/src/development/developing-on-mac.qdoc index 20eefb7..1eb829e 100644 --- a/doc/src/development/developing-on-mac.qdoc +++ b/doc/src/development/developing-on-mac.qdoc @@ -72,10 +72,10 @@ Carbon Qt can be developed on and deployed to 10.4, but there is no 64-bit support. - With Qt 4.7 we now reccommend using the Cocoa version of Qt for developement, + With Qt 4.7 we now recommend using the Cocoa version of Qt for development, unless you want to target the 10.4 platform. Qt now uses Cocoa by default, both for the binary package and when configuring from source. Download the - Carbon binarypackages or configure with "-carbon" to use that version. + Carbon binary packages or configure with "-carbon" to use that version. There are two versions of the Qt binary, one with x86 and x86_64 Cocoa and another with x86 and ppc Carbon. If you want a different setup -- cgit v0.12 From 12b6987031be9faee3886d7623888feb4e1762af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Fri, 5 Mar 2010 12:09:06 +0100 Subject: Update the Qt focus widget on responder change. Set focus widget when the view becomes the first responder. This matches resignFirstResponder, where we set the focus widget to 0. This fixes the QCombobox::autoCompletionCaseSensitivity test failure introduced in the Mac alien widgets change. Reviewed-by: Richard Moe Gustavsen --- src/gui/kernel/qcocoaview_mac.mm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/gui/kernel/qcocoaview_mac.mm b/src/gui/kernel/qcocoaview_mac.mm index f7cb21f..6261429 100644 --- a/src/gui/kernel/qcocoaview_mac.mm +++ b/src/gui/kernel/qcocoaview_mac.mm @@ -1047,6 +1047,13 @@ static int qCocoaViewCount = 0; return YES; } +- (BOOL)becomeFirstResponder +{ + if (QApplication::focusWidget() == 0) + QApplicationPrivate::setFocusWidget([self QT_MANGLE_NAMESPACE(qt_qwidget)], Qt::OtherFocusReason); + return YES; +} + - (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal { Q_UNUSED(isLocal); -- cgit v0.12 From f4de94df2d55d0ea967bb7aea275cc5228ac045b Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Fri, 5 Mar 2010 13:08:03 +0100 Subject: doc: Fixed some QML qdoc errors. --- src/declarative/qml/qdeclarativeproperty.cpp | 82 +++++++++++++++++++--------- src/declarative/util/qdeclarativeview.cpp | 19 +++++-- 2 files changed, 70 insertions(+), 31 deletions(-) diff --git a/src/declarative/qml/qdeclarativeproperty.cpp b/src/declarative/qml/qdeclarativeproperty.cpp index 4f73b89..d223502 100644 --- a/src/declarative/qml/qdeclarativeproperty.cpp +++ b/src/declarative/qml/qdeclarativeproperty.cpp @@ -115,8 +115,10 @@ QDeclarativeProperty::QDeclarativeProperty(QObject *obj) } /*! - Creates a QDeclarativeProperty for the default property of \a obj. If there is no - default property, an invalid QDeclarativeProperty will be created. + Creates a QDeclarativeProperty for the default property of \a obj + using the \l{QDeclarativeContext} {context} \a ctxt. If there is + no default property, an invalid QDeclarativeProperty will be + created. */ QDeclarativeProperty::QDeclarativeProperty(QObject *obj, QDeclarativeContext *ctxt) : d(new QDeclarativePropertyPrivate) @@ -128,11 +130,13 @@ QDeclarativeProperty::QDeclarativeProperty(QObject *obj, QDeclarativeContext *ct } /*! - Creates a QDeclarativeProperty for the default property of \a obj. If there is no - default property, an invalid QDeclarativeProperty will be created. + Creates a QDeclarativeProperty for the default property of \a obj + using the environment for instantiating QML components that is + provided by \a engine. If there is no default property, an + invalid QDeclarativeProperty will be created. */ QDeclarativeProperty::QDeclarativeProperty(QObject *obj, QDeclarativeEngine *engine) -: d(new QDeclarativePropertyPrivate) + : d(new QDeclarativePropertyPrivate) { d->q = this; d->context = 0; @@ -166,8 +170,9 @@ QDeclarativeProperty::QDeclarativeProperty(QObject *obj, const QString &name) } /*! - Creates a QDeclarativeProperty for the property \a name of \a obj. - */ + Creates a QDeclarativeProperty for the property \a name of \a obj + using the \l{QDeclarativeContext} {context} \a ctxt. +*/ QDeclarativeProperty::QDeclarativeProperty(QObject *obj, const QString &name, QDeclarativeContext *ctxt) : d(new QDeclarativePropertyPrivate) { @@ -179,7 +184,9 @@ QDeclarativeProperty::QDeclarativeProperty(QObject *obj, const QString &name, QD } /*! - Creates a QDeclarativeProperty for the property \a name of \a obj. + Creates a QDeclarativeProperty for the property \a name of \a obj + using the environment for instantiating QML components that is + provided by \a engine. */ QDeclarativeProperty::QDeclarativeProperty(QObject *obj, const QString &name, QDeclarativeEngine *engine) : d(new QDeclarativePropertyPrivate) @@ -766,11 +773,13 @@ QVariant QDeclarativeProperty::read(QObject *object, const QString &name) } /*! -Return the \a name property value of \a object. This method is equivalent to: -\code + Return the \a name property value of \a object. This method is + equivalent to: + + \code QDeclarativeProperty p(object, name, context); p.read(); -\endcode + \endcode */ QVariant QDeclarativeProperty::read(QObject *object, const QString &name, QDeclarativeContext *ctxt) { @@ -779,11 +788,15 @@ QVariant QDeclarativeProperty::read(QObject *object, const QString &name, QDecla } /*! -Return the \a name property value of \a object. This method is equivalent to: -\code + + Return the \a name property value of \a object using the environment + for instantiating QML components that is provided by \a engine. . + This method is equivalent to: + + \code QDeclarativeProperty p(object, name, engine); p.read(); -\endcode + \endcode */ QVariant QDeclarativeProperty::read(QObject *object, const QString &name, QDeclarativeEngine *engine) { @@ -1073,19 +1086,23 @@ const QMetaObject *QDeclarativePropertyPrivate::rawMetaObjectForType(QDeclarativ } /*! - Set the property value to \a value. -*/ + Sets the property value to \a value and returns true. + Returns false if the property can't be set because the + \a value is the wrong type, for example. + */ bool QDeclarativeProperty::write(const QVariant &value) const { return QDeclarativePropertyPrivate::write(*this, value, 0); } /*! -Writes \a value to the \a name property of \a object. This method is equivalent to: -\code + Writes \a value to the \a name property of \a object. This method + is equivalent to: + + \code QDeclarativeProperty p(object, name); p.write(value); -\endcode + \endcode */ bool QDeclarativeProperty::write(QObject *object, const QString &name, const QVariant &value) { @@ -1094,13 +1111,18 @@ bool QDeclarativeProperty::write(QObject *object, const QString &name, const QVa } /*! -Writes \a value to the \a name property of \a object. This method is equivalent to: -\code + Writes \a value to the \a name property of \a object using the + \l{QDeclarativeContext} {context} \a ctxt. This method is + equivalent to: + + \code QDeclarativeProperty p(object, name, ctxt); p.write(value); -\endcode + \endcode */ -bool QDeclarativeProperty::write(QObject *object, const QString &name, const QVariant &value, +bool QDeclarativeProperty::write(QObject *object, + const QString &name, + const QVariant &value, QDeclarativeContext *ctxt) { QDeclarativeProperty p(object, name, ctxt); @@ -1108,11 +1130,15 @@ bool QDeclarativeProperty::write(QObject *object, const QString &name, const QVa } /*! -Writes \a value to the \a name property of \a object. This method is equivalent to: -\code + + Writes \a value to the \a name property of \a object using the + environment for instantiating QML components that is provided by + \a engine. This method is equivalent to: + + \code QDeclarativeProperty p(object, name, engine); p.write(value); -\endcode + \endcode */ bool QDeclarativeProperty::write(QObject *object, const QString &name, const QVariant &value, QDeclarativeEngine *engine) @@ -1122,7 +1148,9 @@ bool QDeclarativeProperty::write(QObject *object, const QString &name, const QVa } /*! - Resets the property value. + Resets the property and returns true if the property is + resettable. If the property is not resettable, nothing happens + and false is returned. */ bool QDeclarativeProperty::reset() const { diff --git a/src/declarative/util/qdeclarativeview.cpp b/src/declarative/util/qdeclarativeview.cpp index cd67aeb..735a009 100644 --- a/src/declarative/util/qdeclarativeview.cpp +++ b/src/declarative/util/qdeclarativeview.cpp @@ -221,7 +221,7 @@ void QDeclarativeViewPrivate::execute() */ /*! \fn void QDeclarativeView::statusChanged(QDeclarativeView::Status status) - This signal is emitted when the component's current \l{QDeclarativeView::Status} {status} changes. + This signal is emitted when the component's current \a status changes. */ /*! @@ -283,6 +283,12 @@ QDeclarativeView::~QDeclarativeView() delete d->root; } +/*! \property QDeclarativeView::source + \brief The URL of the source of the QML component. + + Changing this property causes the QML component to be reloaded. + */ + /*! Sets the source to the \a url, loads the QML component and instantiates it. @@ -326,7 +332,6 @@ QDeclarativeContext* QDeclarativeView::rootContext() return d->engine.rootContext(); } - /*! \enum QDeclarativeView::Status @@ -338,6 +343,14 @@ QDeclarativeContext* QDeclarativeView::rootContext() \value Error An error has occured. Calling errorDescription() to retrieve a description. */ +/*! \enum QDeclarativeView::ResizeMode + + This enum specifies how to resize the view. + + \value SizeViewToRootObject + \value SizeRootObjectToView +*/ + /*! \property QDeclarativeView::status The component's current \l{QDeclarativeView::Status} {status}. @@ -376,8 +389,6 @@ QList QDeclarativeView::errors() const Regardless of this property, the sizeHint of the view is the initial size of the root item. Note though that since QML may load dynamically, that size may change. - - \sa initialSize() */ void QDeclarativeView::setResizeMode(ResizeMode mode) -- cgit v0.12 From 4070bb1daafafabebb3c893a472a22fab413e4de Mon Sep 17 00:00:00 2001 From: Denis Dzyubenko Date: Fri, 5 Mar 2010 13:24:29 +0100 Subject: Prevent a freeze of QFileSystemWatcher on Mac. On Mac when the FSEvents backend is used and a file is added or removed from a file system watcher, we need to wait until the thread is finished, otherwise it is possible that the thread already exited from the run() function but hasn't fully terminated, meaning when we restart the thread by calling start() it won't start because QThread thinks it's already running. A better fix might be to avoid stopping and starting threads - to just stop the FSEvents loop and notify the thread that a file set has changed. Task-number: QTBUG-8524 Reviewed-by: Morten --- src/corelib/io/qfilesystemwatcher_fsevents.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/corelib/io/qfilesystemwatcher_fsevents.cpp b/src/corelib/io/qfilesystemwatcher_fsevents.cpp index efbc290..d3276bd 100644 --- a/src/corelib/io/qfilesystemwatcher_fsevents.cpp +++ b/src/corelib/io/qfilesystemwatcher_fsevents.cpp @@ -171,6 +171,7 @@ QStringList QFSEventsFileSystemWatcherEngine::addPaths(const QStringList &paths, { #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 stop(); + wait(); QMutexLocker locker(&mutex); QStringList failedToAdd; // if we have a running FSStreamEvent, we have to kill it, we'll re-add the stream soon. @@ -268,6 +269,7 @@ QStringList QFSEventsFileSystemWatcherEngine::removePaths(const QStringList &pat { #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 stop(); + wait(); QMutexLocker locker(&mutex); // short circuit for smarties that call remove before add and we have nothing. if (pathsToWatch == 0) -- cgit v0.12 From 12308db7663679e42c87aa72c564ec3f9f1a457f Mon Sep 17 00:00:00 2001 From: Fabien Freling Date: Fri, 5 Mar 2010 14:15:54 +0100 Subject: Change behavior of applicationShouldTerminate. We now terminate the application as long as Qt says we can. If not, then we cancel the termination. Task-number: QTBUG-6296 Reviewed-by: Morten Sorvig --- src/gui/kernel/qcocoaapplicationdelegate_mac.mm | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/gui/kernel/qcocoaapplicationdelegate_mac.mm b/src/gui/kernel/qcocoaapplicationdelegate_mac.mm index ab71a05..5dcf613 100644 --- a/src/gui/kernel/qcocoaapplicationdelegate_mac.mm +++ b/src/gui/kernel/qcocoaapplicationdelegate_mac.mm @@ -179,7 +179,7 @@ static void cleanupCocoaApplicationDelegate() } // This function will only be called when NSApp is actually running. Before -// that, the kAEQuitApplication apple event will be sendt to +// that, the kAEQuitApplication Apple event will be sent to // QApplicationPrivate::globalAppleEventProcessor in qapplication_mac.mm - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { @@ -196,21 +196,18 @@ static void cleanupCocoaApplicationDelegate() qAppInstance()->quit(); startedQuit = false; } + return NSTerminateNow; } if (qtPrivate->threadData->eventLoops.size() == 0) { // INVARIANT: No event loop is executing. This probably // means that Qt is used as a plugin, or as a part of a native - // Cocoa application. In any case it should be fine to + // Cocoa application. In any case it should be fine to // terminate now: return NSTerminateNow; - } else { - // Prevent Cocoa from terminating the application, since this simply - // exits the program whithout allowing QApplication::exec() to return. - // The call to QApplication::quit() above will instead quit the - // application from the Qt side. - return NSTerminateCancel; } + + return NSTerminateCancel; } - (void)applicationDidFinishLaunching:(NSNotification *)aNotification -- cgit v0.12 From 88e9515cc4300d841b16f17fe6b5c8c0d6de3562 Mon Sep 17 00:00:00 2001 From: Kent Hansen Date: Fri, 5 Mar 2010 13:12:24 +0100 Subject: QMetaType::type(): return immediately if the typename is empty No need to look up / lock data structures if we know that the comparisons will all fail. This was encountered because QMetaMethod::typeName() returns an empty string if the return type is void (even though there is a QMetaType::Void (value 0) with name "void"). This was causing the QtScript meta-object binding to spend a lot of its time looking up the type for an empty string when invoking slots that return void. Rather than having these checks in QtScript and who knows where else, it's better that QMetaType::type() does it itself. No regressions in the qmetatype benchmark. Reviewed-by: Olivier Goffart Reviewed-by: Harald Fernengel --- src/corelib/kernel/qmetatype.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp index 8f2d025..30af6fa 100644 --- a/src/corelib/kernel/qmetatype.cpp +++ b/src/corelib/kernel/qmetatype.cpp @@ -590,6 +590,8 @@ bool QMetaType::isRegistered(int type) int QMetaType::type(const char *typeName) { int length = qstrlen(typeName); + if (!length) + return 0; int type = qMetaTypeStaticType(typeName, length); if (!type) { QReadLocker locker(customTypesLock()); -- cgit v0.12 From 8a9a160c8f509511b7e44b66a20d60fb37d614cc Mon Sep 17 00:00:00 2001 From: Kent Hansen Date: Fri, 5 Mar 2010 12:23:09 +0100 Subject: QtScript: Don't needlessly make deep copies of function names The QObject binding uses the function name to determine whether a meta-method is an overload. This was implemented quite naively by copying the name from the signature into another array before comparing it. This could cause several unnecessary memory allocations, since storing the name is really only needed when there is an exception (e.g. ambiguous call). Instead, use strncmp to compare only the relevant characters of the original (non-copied) method signature. This makes normal slot invocation from QtScript up to 15% faster. Reviewed-by: Jedrzej Nowacki --- src/script/bridge/qscriptqobject.cpp | 89 ++++++++++++++++++++++-------------- src/script/bridge/qscriptqobject_p.h | 1 - 2 files changed, 55 insertions(+), 35 deletions(-) diff --git a/src/script/bridge/qscriptqobject.cpp b/src/script/bridge/qscriptqobject.cpp index 91636da..fbb29f5 100644 --- a/src/script/bridge/qscriptqobject.cpp +++ b/src/script/bridge/qscriptqobject.cpp @@ -163,10 +163,40 @@ static bool isEnumerableMetaProperty(const QMetaProperty &prop, && (mo->indexOfProperty(prop.name()) == index); } -static inline QByteArray methodName(const QMetaMethod &method) +/*! \internal + Calculates the length of the name of the given \a method by looking + for the first '(' character. +*/ +static inline int methodNameLength(const QMetaMethod &method) { - QByteArray signature = method.signature(); - return signature.left(signature.indexOf('(')); + const char *signature = method.signature(); + const char *s = signature; + while (*s && (*s != '(')) + ++s; + return s - signature; +} + +/*! \internal + Makes a deep copy of the first \a nameLength characters of the given + method \a signature and returns the copy. +*/ +static inline QByteArray methodName(const char *signature, int nameLength) +{ + return QByteArray(signature, nameLength); +} + +/*! \internal + + Returns true if the name of the given \a method is the same as that + specified by the (signature, nameLength) pair, otherwise returns + false. +*/ +static inline bool methodNameEquals(const QMetaMethod &method, + const char *signature, int nameLength) +{ + const char *otherSignature = method.signature(); + return !qstrncmp(otherSignature, signature, nameLength) + && (otherSignature[nameLength] == '('); } static QVariant variantFromValue(JSC::ExecState *exec, int targetType, JSC::JSValue value) @@ -310,25 +340,16 @@ QList QScript::QtFunction::overloadedIndexes() const if (!maybeOverloaded()) return QList(); QList result; - QString name = functionName(); const QMetaObject *meta = metaObject(); + QMetaMethod method = meta->method(initialIndex()); + int nameLength = methodNameLength(method); for (int index = mostGeneralMethod() - 1; index >= 0; --index) { - QString otherName = QString::fromLatin1(methodName(meta->method(index))); - if (otherName == name) + if (methodNameEquals(meta->method(index), method.signature(), nameLength)) result.append(index); } return result; } -QString QtFunction::functionName() const -{ - const QMetaObject *meta = metaObject(); - if (!meta) - return QString(); - QMetaMethod method = meta->method(initialIndex()); - return QLatin1String(methodName(method)); -} - class QScriptMetaType { public: @@ -415,8 +436,8 @@ class QScriptMetaMethod public: inline QScriptMetaMethod() { } - inline QScriptMetaMethod(const QByteArray &name, const QVector &types) - : m_name(name), m_types(types), m_firstUnresolvedIndex(-1) + inline QScriptMetaMethod(const QVector &types) + : m_types(types), m_firstUnresolvedIndex(-1) { QVector::const_iterator it; for (it = m_types.constBegin(); it != m_types.constEnd(); ++it) { @@ -429,9 +450,6 @@ public: inline bool isValid() const { return !m_types.isEmpty(); } - QByteArray name() const - { return m_name; } - inline QScriptMetaType returnType() const { return m_types.at(0); } @@ -460,7 +478,6 @@ public: { return m_types; } private: - QByteArray m_name; QVector m_types; int m_firstUnresolvedIndex; }; @@ -497,7 +514,6 @@ static JSC::JSValue callQtMethod(JSC::ExecState *exec, QMetaMethod::MethodType c const QMetaObject *meta, int initialIndex, bool maybeOverloaded) { - QByteArray funName; QScriptMetaMethod chosenMethod; int chosenIndex = -1; QVarLengthArray args; @@ -506,15 +522,18 @@ static JSC::JSValue callQtMethod(JSC::ExecState *exec, QMetaMethod::MethodType c QVector tooFewArgs; QVector conversionFailed; int index; + int nameLength = 0; + const char *initialMethodSignature = 0; exec->clearException(); QScriptEnginePrivate *engine = QScript::scriptEngineFromExec(exec); for (index = initialIndex; index >= 0; --index) { QMetaMethod method = metaMethod(meta, callType, index); - if (index == initialIndex) - funName = methodName(method); - else { - if (methodName(method) != funName) + if (index == initialIndex) { + initialMethodSignature = method.signature(); + nameLength = methodNameLength(method); + } else { + if (!methodNameEquals(method, initialMethodSignature, nameLength)) continue; } @@ -555,7 +574,7 @@ static JSC::JSValue callQtMethod(JSC::ExecState *exec, QMetaMethod::MethodType c } } - QScriptMetaMethod mtd = QScriptMetaMethod(methodName(method), types); + QScriptMetaMethod mtd = QScriptMetaMethod(types); if (int(scriptArgs.size()) < mtd.argumentCount()) { tooFewArgs.append(index); @@ -830,9 +849,10 @@ static JSC::JSValue callQtMethod(JSC::ExecState *exec, QMetaMethod::MethodType c //#ifndef Q_SCRIPT_NO_EVENT_NOTIFY // engine->notifyFunctionEntry(context); //#endif + QString funName = QString::fromLatin1(methodName(initialMethodSignature, nameLength)); if (!conversionFailed.isEmpty()) { QString message = QString::fromLatin1("incompatible type of argument(s) in call to %0(); candidates were\n") - .arg(QLatin1String(funName)); + .arg(funName); for (int i = 0; i < conversionFailed.size(); ++i) { if (i > 0) message += QLatin1String("\n"); @@ -847,7 +867,7 @@ static JSC::JSValue callQtMethod(JSC::ExecState *exec, QMetaMethod::MethodType c QScriptMetaType unresolvedType = argsInstance.method.type(unresolvedIndex); QString unresolvedTypeName = QString::fromLatin1(unresolvedType.name()); QString message = QString::fromLatin1("cannot call %0(): ") - .arg(QString::fromLatin1(funName)); + .arg(funName); if (unresolvedIndex > 0) { message.append(QString::fromLatin1("argument %0 has unknown type `%1'"). arg(unresolvedIndex).arg(unresolvedTypeName)); @@ -859,7 +879,7 @@ static JSC::JSValue callQtMethod(JSC::ExecState *exec, QMetaMethod::MethodType c result = JSC::throwError(exec, JSC::TypeError, message); } else { QString message = QString::fromLatin1("too few arguments in call to %0(); candidates are\n") - .arg(QLatin1String(funName)); + .arg(funName); for (int i = 0; i < tooFewArgs.size(); ++i) { if (i > 0) message += QLatin1String("\n"); @@ -875,6 +895,7 @@ static JSC::JSValue callQtMethod(JSC::ExecState *exec, QMetaMethod::MethodType c && (metaArgs.args.count() == candidates.at(1).args.count()) && (metaArgs.matchDistance == candidates.at(1).matchDistance)) { // ambiguous call + QByteArray funName = methodName(initialMethodSignature, nameLength); QString message = QString::fromLatin1("ambiguous call of overloaded function %0(); candidates were\n") .arg(QLatin1String(funName)); for (int i = 0; i < candidates.size(); ++i) { @@ -1240,7 +1261,7 @@ bool QObjectDelegate::getOwnPropertySlot(QScriptObject *object, JSC::ExecState * for (index = meta->methodCount() - 1; index >= offset; --index) { QMetaMethod method = meta->method(index); if (hasMethodAccess(method, index, opt) - && (methodName(method) == name)) { + && methodNameEquals(method, name.constData(), name.length())) { QtFunction *fun = new (exec)QtFunction( object, index, /*maybeOverloaded=*/true, &exec->globalData(), eng->originalGlobalObject()->functionStructure(), @@ -1372,7 +1393,7 @@ bool QObjectDelegate::getOwnPropertyDescriptor(QScriptObject *object, JSC::ExecS for (index = meta->methodCount() - 1; index >= offset; --index) { QMetaMethod method = meta->method(index); if (hasMethodAccess(method, index, opt) - && (methodName(method) == name)) { + && methodNameEquals(method, name.constData(), name.length())) { QtFunction *fun = new (exec)QtFunction( object, index, /*maybeOverloaded=*/true, &exec->globalData(), eng->originalGlobalObject()->functionStructure(), @@ -1486,7 +1507,7 @@ void QObjectDelegate::put(QScriptObject *object, JSC::ExecState* exec, for (index = meta->methodCount() - 1; index >= offset; --index) { QMetaMethod method = meta->method(index); if (hasMethodAccess(method, index, opt) - && (methodName(method) == name)) { + && methodNameEquals(method, name.constData(), name.length())) { data->cachedMembers.insert(name, value); return; } @@ -1605,7 +1626,7 @@ bool QObjectDelegate::getPropertyAttributes(const QScriptObject *object, for (index = meta->methodCount() - 1; index >= offset; --index) { QMetaMethod method = meta->method(index); if (hasMethodAccess(method, index, opt) - && (methodName(method) == name)) { + && methodNameEquals(method, name.constData(), name.length())) { attributes = QObjectMemberAttribute; if (opt & QScriptEngine::SkipMethodsInEnumeration) attributes |= JSC::DontEnum; diff --git a/src/script/bridge/qscriptqobject_p.h b/src/script/bridge/qscriptqobject_p.h index 448fa99..8b05d6b 100644 --- a/src/script/bridge/qscriptqobject_p.h +++ b/src/script/bridge/qscriptqobject_p.h @@ -212,7 +212,6 @@ public: bool maybeOverloaded() const; int mostGeneralMethod(QMetaMethod *out = 0) const; QList overloadedIndexes() const; - QString functionName() const; private: Data *data; -- cgit v0.12 From e10c1fe03fbfd3c8bdca7a68d4dc568715db4176 Mon Sep 17 00:00:00 2001 From: Kent Hansen Date: Fri, 5 Mar 2010 14:31:25 +0100 Subject: Don't needlessly call pushContext() when reading properties It's only necessary to push a QScriptContext when properties are read from an object that inherits QScriptable. Postpone the decision of pushing a context until we know whether the object is a QScriptable. --- src/script/bridge/qscriptqobject.cpp | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/script/bridge/qscriptqobject.cpp b/src/script/bridge/qscriptqobject.cpp index fbb29f5..6c401f8 100644 --- a/src/script/bridge/qscriptqobject.cpp +++ b/src/script/bridge/qscriptqobject.cpp @@ -1057,14 +1057,7 @@ JSC::JSValue JSC_HOST_CALL QtPropertyFunction::call( if (!callee->inherits(&QtPropertyFunction::info)) return throwError(exec, JSC::TypeError, "callee is not a QtPropertyFunction object"); QtPropertyFunction *qfun = static_cast(callee); - QScriptEnginePrivate *eng_p = scriptEngineFromExec(exec); - JSC::ExecState *previousFrame = eng_p->currentFrame; - eng_p->currentFrame = exec; - eng_p->pushContext(exec, thisValue, args, callee); - JSC::JSValue result = qfun->execute(eng_p->currentFrame, thisValue, args); - eng_p->popContext(); - eng_p->currentFrame = previousFrame; - return result; + return qfun->execute(exec, thisValue, args); } JSC::JSValue QtPropertyFunction::execute(JSC::ExecState *exec, @@ -1074,12 +1067,15 @@ JSC::JSValue QtPropertyFunction::execute(JSC::ExecState *exec, JSC::JSValue result = JSC::jsUndefined(); QScriptEnginePrivate *engine = scriptEngineFromExec(exec); - thisValue = engine->toUsableValue(thisValue); - QObject *qobject = QScriptEnginePrivate::toQObject(exec, thisValue); + JSC::ExecState *previousFrame = engine->currentFrame; + engine->currentFrame = exec; + + JSC::JSValue qobjectValue = engine->toUsableValue(thisValue); + QObject *qobject = QScriptEnginePrivate::toQObject(exec, qobjectValue); while ((!qobject || (qobject->metaObject() != data->meta)) - && JSC::asObject(thisValue)->prototype().isObject()) { - thisValue = JSC::asObject(thisValue)->prototype(); - qobject = QScriptEnginePrivate::toQObject(exec, thisValue); + && JSC::asObject(qobjectValue)->prototype().isObject()) { + qobjectValue = JSC::asObject(qobjectValue)->prototype(); + qobject = QScriptEnginePrivate::toQObject(exec, qobjectValue); } Q_ASSERT_X(qobject, Q_FUNC_INFO, "this-object must be a QObject"); @@ -1091,14 +1087,17 @@ JSC::JSValue QtPropertyFunction::execute(JSC::ExecState *exec, QScriptable *scriptable = scriptableFromQObject(qobject); QScriptEngine *oldEngine = 0; if (scriptable) { + engine->pushContext(exec, thisValue, args, this); oldEngine = QScriptablePrivate::get(scriptable)->engine; QScriptablePrivate::get(scriptable)->engine = QScriptEnginePrivate::get(engine); } QVariant v = prop.read(qobject); - if (scriptable) + if (scriptable) { QScriptablePrivate::get(scriptable)->engine = oldEngine; + engine->popContext(); + } result = QScriptEnginePrivate::jscValueFromVariant(exec, v); } @@ -1118,17 +1117,21 @@ JSC::JSValue QtPropertyFunction::execute(JSC::ExecState *exec, QScriptable *scriptable = scriptableFromQObject(qobject); QScriptEngine *oldEngine = 0; if (scriptable) { + engine->pushContext(exec, thisValue, args, this); oldEngine = QScriptablePrivate::get(scriptable)->engine; QScriptablePrivate::get(scriptable)->engine = QScriptEnginePrivate::get(engine); } prop.write(qobject, v); - if (scriptable) + if (scriptable) { QScriptablePrivate::get(scriptable)->engine = oldEngine; + engine->popContext(); + } result = arg; } + engine->currentFrame = previousFrame; return result; } -- cgit v0.12 From d5b716852c6ce79d2abc089e690a3f968273c805 Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Fri, 5 Mar 2010 15:12:37 +0100 Subject: doc: Fixed some QML qdoc errors. --- src/declarative/graphicsitems/qdeclarativeitem.cpp | 10 ++++++++++ src/declarative/graphicsitems/qdeclarativelistview.cpp | 5 +++++ src/declarative/qml/qdeclarativeengine.cpp | 6 ++---- src/imports/multimedia/qdeclarativeaudio.cpp | 5 +++-- src/imports/multimedia/qdeclarativevideo.cpp | 5 +++-- 5 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/declarative/graphicsitems/qdeclarativeitem.cpp b/src/declarative/graphicsitems/qdeclarativeitem.cpp index 3bee5b8..3e1218b 100644 --- a/src/declarative/graphicsitems/qdeclarativeitem.cpp +++ b/src/declarative/graphicsitems/qdeclarativeitem.cpp @@ -1291,6 +1291,16 @@ QDeclarativeKeysAttached *QDeclarativeKeysAttached::qmlAttachedProperties(QObjec \internal */ +/*! + \fn void QDeclarativeItem::smoothChanged() + \internal +*/ + +/*! + \fn void QDeclarativeItem::clipChanged() + \internal +*/ + /*! \fn void QDeclarativeItem::transformOriginChanged(TransformOrigin) \internal */ diff --git a/src/declarative/graphicsitems/qdeclarativelistview.cpp b/src/declarative/graphicsitems/qdeclarativelistview.cpp index cd8d143..be16baa 100644 --- a/src/declarative/graphicsitems/qdeclarativelistview.cpp +++ b/src/declarative/graphicsitems/qdeclarativelistview.cpp @@ -1783,6 +1783,11 @@ void QDeclarativeListView::setPreferredHighlightEnd(qreal end) emit preferredHighlightEndChanged(); } +/*! + \property QDeclarativeListView::highlightRangeMode + + This property contains the highlight range mode for the listview. + */ QDeclarativeListView::HighlightRangeMode QDeclarativeListView::highlightRangeMode() const { Q_D(const QDeclarativeListView); diff --git a/src/declarative/qml/qdeclarativeengine.cpp b/src/declarative/qml/qdeclarativeengine.cpp index 7ce2d0b..a71546b 100644 --- a/src/declarative/qml/qdeclarativeengine.cpp +++ b/src/declarative/qml/qdeclarativeengine.cpp @@ -1659,10 +1659,8 @@ void QDeclarativeEngine::addImportPath(const QString& path) } /*! - Imports the given \a extension into this QDeclarativeEngine. Returns - true if the extension was successfully imported. - - \sa QDeclarativeExtensionInterface + Imports the extension named \a fileName from the \a uri provided. + Returns true if the extension was successfully imported. */ bool QDeclarativeEngine::importExtension(const QString &fileName, const QString &uri) { diff --git a/src/imports/multimedia/qdeclarativeaudio.cpp b/src/imports/multimedia/qdeclarativeaudio.cpp index df2888c..40133ee 100644 --- a/src/imports/multimedia/qdeclarativeaudio.cpp +++ b/src/imports/multimedia/qdeclarativeaudio.cpp @@ -316,8 +316,9 @@ QDeclarativeAudio::Error QDeclarativeAudio::error() const /*! \qmlsignal Audio::onError(error, errorString) - This handler is called when an \l {Error}{error} has occurred. The errorString parameter - may contain more detailed information about the error. + This handler is called when an \l {QMediaPlayer::Error}{error} has + occurred. The errorString parameter may contain more detailed + information about the error. */ QT_END_NAMESPACE diff --git a/src/imports/multimedia/qdeclarativevideo.cpp b/src/imports/multimedia/qdeclarativevideo.cpp index 064f242..80c0ba4 100644 --- a/src/imports/multimedia/qdeclarativevideo.cpp +++ b/src/imports/multimedia/qdeclarativevideo.cpp @@ -317,8 +317,9 @@ QDeclarativeVideo::Error QDeclarativeVideo::error() const /*! \qmlsignal Video::onError(error, errorString) - This handler is called when an \l {Error}{error} has occurred. The errorString parameter - may contain more detailed information about the error. + This handler is called when an \l {QMediaPlayer::Error}{error} has + occurred. The errorString parameter may contain more detailed + information about the error. */ /*! -- cgit v0.12 From 0cb155516992d3bb917f72bdab9f28b9e65ff40d Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Tue, 2 Mar 2010 11:33:55 +0100 Subject: Mac: static getFont functions in QFontDialog does not work This bug is visible if the static funtions are used before calling qApp->exec(). The reason is that the static functions still use the old code path, rather than the new one (that will end up creating a QFontDialog and call exec on it). Just using the new style will fix the problem. Task-number: QTBUG-7371 Reviewed-by: cduclos --- src/gui/dialogs/qfontdialog.cpp | 8 -- src/gui/dialogs/qfontdialog_mac.mm | 189 ------------------------------------- src/gui/dialogs/qfontdialog_p.h | 6 -- 3 files changed, 203 deletions(-) diff --git a/src/gui/dialogs/qfontdialog.cpp b/src/gui/dialogs/qfontdialog.cpp index b987611..8e17830 100644 --- a/src/gui/dialogs/qfontdialog.cpp +++ b/src/gui/dialogs/qfontdialog.cpp @@ -428,14 +428,6 @@ QFont QFontDialog::getFont(bool *ok, QWidget *parent) QFont QFontDialogPrivate::getFont(bool *ok, const QFont &initial, QWidget *parent, const QString &title, QFontDialog::FontDialogOptions options) { -#ifdef Q_WS_MAC - if (!(options & QFontDialog::DontUseNativeDialog) - && QFontDialogPrivate::sharedFontPanelAvailable) { - return QFontDialogPrivate::execCocoaFontPanel(ok, initial, parent, - title.isEmpty() ? QFontDialog::tr("Select Font") : title, options); - } -#endif - QFontDialog dlg(parent); dlg.setOptions(options); dlg.setCurrentFont(initial); diff --git a/src/gui/dialogs/qfontdialog_mac.mm b/src/gui/dialogs/qfontdialog_mac.mm index 67d32b8..93410e7 100644 --- a/src/gui/dialogs/qfontdialog_mac.mm +++ b/src/gui/dialogs/qfontdialog_mac.mm @@ -412,170 +412,6 @@ extern void macStartInterceptNSPanelCtor(); extern void macStopInterceptNSPanelCtor(); extern NSButton *macCreateButton(const char *text, NSView *superview); -void *QFontDialogPrivate::openCocoaFontPanel(const QFont &initial, - QWidget *parent, const QString &title, QFontDialog::FontDialogOptions options, - QFontDialogPrivate *priv) -{ - Q_UNUSED(parent); // we would use the parent if only NSFontPanel could be a sheet - QMacCocoaAutoReleasePool pool; - - /* - The standard Cocoa font panel has no OK or Cancel button and - is created as a utility window. For strange reasons (which seem - to stem from the fact that the font panel is based on a NIB - file), the approach we use for the color panel doesn't work for - the font panel (and, inversely, the approach we use here doesn't - quite work for color panel, and crashed last time I tried). So - instead, we take the following steps: - - 1. Constructs a plain NSPanel that looks the way we want it - to look. Specifically, if the NoButtons option is off, we - construct a panel without the NSUtilityWindowMask flag - and with buttons (OK and Cancel). - - 2. Steal the content view from the shared NSFontPanel and - put it inside our new NSPanel's content view, together - with the OK and Cancel buttons. - - 3. Lay out the original content view and the buttons when - the font panel is shown and whenever it is resized. - - 4. Clean up after ourselves. - - PS. Some customization is also done in QCocoaApplication - validModesForFontPanel:. - */ - - Qt::WindowModality modality = Qt::ApplicationModal; - if (priv) - modality = priv->fontDialog()->windowModality(); - - bool needButtons = !(options & QFontDialog::NoButtons); - // don't need our own panel if the title bar isn't visible anyway (in a sheet) - bool needOwnPanel = (needButtons && modality != Qt::WindowModal); - - bool sharedFontPanelExisted = [NSFontPanel sharedFontPanelExists]; - NSFontPanel *sharedFontPanel = [NSFontPanel sharedFontPanel]; - [sharedFontPanel setHidesOnDeactivate:false]; - - // hack to ensure that QCocoaApplication's validModesForFontPanel: - // implementation is honored - if (!sharedFontPanelExisted && needOwnPanel) { - [sharedFontPanel makeKeyAndOrderFront:sharedFontPanel]; - [sharedFontPanel close]; - } - - NSPanel *ourPanel = 0; - NSView *stolenContentView = 0; - NSButton *okButton = 0; - NSButton *cancelButton = 0; - - CGFloat dialogExtraWidth = 0.0; - CGFloat dialogExtraHeight = 0.0; - - if (!needOwnPanel) { - // we can reuse the NSFontPanel unchanged - ourPanel = sharedFontPanel; - } else { - // compute dialogExtra{Width,Height} - dialogExtraWidth = 2.0 * DialogSideMargin; - dialogExtraHeight = DialogTopMargin + ButtonTopMargin + ButtonMinHeight - + ButtonBottomMargin; - - // compute initial contents rectangle - NSRect contentRect = [sharedFontPanel contentRectForFrameRect:[sharedFontPanel frame]]; - contentRect.size.width += dialogExtraWidth; - contentRect.size.height += dialogExtraHeight; - - // create the new panel - ourPanel = [[NSPanel alloc] initWithContentRect:contentRect - styleMask:StyleMask - backing:NSBackingStoreBuffered - defer:YES]; - [ourPanel setReleasedWhenClosed:YES]; - } - - stolenContentView = [sharedFontPanel contentView]; - - if (needButtons) { - // steal the font panel's contents view - [stolenContentView retain]; - [sharedFontPanel setContentView:0]; - - // create a new content view and add the stolen one as a subview - NSRect frameRect = { { 0.0, 0.0 }, { 0.0, 0.0 } }; - NSView *ourContentView = [[NSView alloc] initWithFrame:frameRect]; - [ourContentView addSubview:stolenContentView]; - - // create OK and Cancel buttons and add these as subviews - okButton = macCreateButton("&OK", ourContentView); - cancelButton = macCreateButton("Cancel", ourContentView); - - [ourPanel setContentView:ourContentView]; - [ourPanel setDefaultButtonCell:[okButton cell]]; - } - - // create a delegate and set it - QCocoaFontPanelDelegate *delegate = - [[QCocoaFontPanelDelegate alloc] initWithFontPanel:sharedFontPanel - stolenContentView:stolenContentView - okButton:okButton - cancelButton:cancelButton - priv:priv - extraWidth:dialogExtraWidth - extraHeight:dialogExtraHeight]; - [ourPanel setDelegate:delegate]; - [[NSFontManager sharedFontManager] setDelegate:delegate]; -#ifdef QT_MAC_USE_COCOA - [[NSFontManager sharedFontManager] setTarget:delegate]; -#endif - setFont(delegate, initial); - - // hack to get correct initial layout - NSRect frameRect = [ourPanel frame]; - frameRect.size.width += 1.0; - [ourPanel setFrame:frameRect display:NO]; - frameRect.size.width -= 1.0; - frameRect.size = [delegate windowWillResize:ourPanel toSize:frameRect.size]; - [ourPanel setFrame:frameRect display:NO]; - [ourPanel center]; - - [ourPanel setTitle:(NSString*)(CFStringRef)QCFString(title)]; - - if (priv) { - switch (modality) { - case Qt::WindowModal: - if (parent) { -#ifndef QT_MAC_USE_COCOA - WindowRef hiwindowRef = qt_mac_window_for(parent); - NSWindow *window = - [[NSWindow alloc] initWithWindowRef:hiwindowRef]; - // Cocoa docs say I should retain the Carbon ref. - CFRetain(hiwindowRef); -#else - NSWindow *window = qt_mac_window_for(parent); -#endif - [NSApp beginSheet:ourPanel - modalForWindow:window - modalDelegate:0 - didEndSelector:0 - contextInfo:0]; -#ifndef QT_MAC_USE_COCOA - [window release]; -#endif - break; - } - // fallthrough - case Qt::ApplicationModal: - [delegate setModalSession:[NSApp beginModalSessionForWindow:ourPanel]]; - break; - default: - [ourPanel makeKeyAndOrderFront:ourPanel]; - } - } - return delegate; -} - void QFontDialogPrivate::closeCocoaFontPanel(void *delegate) { QMacCocoaAutoReleasePool pool; @@ -586,30 +422,6 @@ void QFontDialogPrivate::closeCocoaFontPanel(void *delegate) [theDelegate autorelease]; } -QFont QFontDialogPrivate::execCocoaFontPanel(bool *ok, const QFont &initial, - QWidget *parent, const QString &title, QFontDialog::FontDialogOptions options) -{ - QMacCocoaAutoReleasePool pool; - QCocoaFontPanelDelegate *delegate = - static_cast( - openCocoaFontPanel(initial, parent, title, options)); - NSWindow *ourPanel = [delegate actualPanel]; - [ourPanel retain]; - int rval = [NSApp runModalForWindow:ourPanel]; - QFont font([delegate qtFont]); - [ourPanel release]; - [delegate cleanUpAfterMyself]; - [delegate release]; - bool isOk = ((options & QFontDialog::NoButtons) || rval == NSOKButton); - if (ok) - *ok = isOk; - if (isOk) { - return font; - } else { - return initial; - } -} - void QFontDialogPrivate::setFont(void *delegate, const QFont &font) { QMacCocoaAutoReleasePool pool; @@ -760,7 +572,6 @@ void QFontDialogPrivate::mac_nativeDialogModalHelp() void QFontDialogPrivate::_q_macRunNativeAppModalPanel() { QBoolBlocker nativeDialogOnTop(QApplicationPrivate::native_modal_dialog_active); - Q_Q(QFontDialog); QCocoaFontPanelDelegate *delegate = (QCocoaFontPanelDelegate *)_q_constructNativePanel(); NSWindow *ourPanel = [delegate actualPanel]; [ourPanel retain]; diff --git a/src/gui/dialogs/qfontdialog_p.h b/src/gui/dialogs/qfontdialog_p.h index 7654a80..c18b87b 100644 --- a/src/gui/dialogs/qfontdialog_p.h +++ b/src/gui/dialogs/qfontdialog_p.h @@ -139,13 +139,7 @@ public: QByteArray memberToDisconnectOnClose; #ifdef Q_WS_MAC - static void *openCocoaFontPanel(const QFont &initial, - QWidget *parent, const QString &title, - QFontDialog::FontDialogOptions options, - QFontDialogPrivate *priv = 0); static void closeCocoaFontPanel(void *delegate); - static QFont execCocoaFontPanel(bool *ok, const QFont &initial, QWidget *parent, - const QString &title, QFontDialog::FontDialogOptions options); static void setFont(void *delegate, const QFont &font); inline void done(int result) { q_func()->done(result); } -- cgit v0.12 From f3ecbb007acf39b43c73be26f4cbbf195c352e57 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Tue, 2 Mar 2010 15:08:55 +0100 Subject: Mac: QFontDialog will not sometimes leave modality It turns out the the code implemented two different ways of entering modality, and mixed the two when it came to exit modality. This patch just uses the nsapp runmodalforwindow approach. Reviewed-by: cduclos --- src/gui/dialogs/qfontdialog_mac.mm | 35 +++++++++-------------------------- 1 file changed, 9 insertions(+), 26 deletions(-) diff --git a/src/gui/dialogs/qfontdialog_mac.mm b/src/gui/dialogs/qfontdialog_mac.mm index 93410e7..3a4c688 100644 --- a/src/gui/dialogs/qfontdialog_mac.mm +++ b/src/gui/dialogs/qfontdialog_mac.mm @@ -95,7 +95,6 @@ const int StyleMask = NSTitledWindowMask | NSClosableWindowMask | NSResizableWin BOOL mPanelHackedWithButtons; CGFloat mDialogExtraWidth; CGFloat mDialogExtraHeight; - NSModalSession mModalSession; } - (id)initWithFontPanel:(NSFontPanel *)panel stolenContentView:(NSView *)stolenContentView @@ -106,7 +105,6 @@ const int StyleMask = NSTitledWindowMask | NSClosableWindowMask | NSResizableWin extraHeight:(CGFloat)extraHeight; - (void)changeFont:(id)sender; - (void)changeAttributes:(id)sender; -- (void)setModalSession:(NSModalSession)session; - (BOOL)windowShouldClose:(id)window; - (NSSize)windowWillResize:(NSWindow *)window toSize:(NSSize)proposedFrameSize; - (void)relayout; @@ -163,7 +161,6 @@ static QFont qfontForCocoaFont(NSFont *cocoaFont, const QFont &resolveFont) mPanelHackedWithButtons = (okButton != 0); mDialogExtraWidth = extraWidth; mDialogExtraHeight = extraHeight; - mModalSession = 0; if (mPanelHackedWithButtons) { [self relayout]; @@ -216,12 +213,6 @@ static QFont qfontForCocoaFont(NSFont *cocoaFont, const QFont &resolveFont) mPriv->updateSampleFont(*mQtFont); } -- (void)setModalSession:(NSModalSession)session -{ - Q_ASSERT(!mModalSession); - mModalSession = session; -} - - (BOOL)windowShouldClose:(id)window { Q_UNUSED(window); @@ -368,21 +359,14 @@ static QFont qfontForCocoaFont(NSFont *cocoaFont, const QFont &resolveFont) - (void)finishOffWithCode:(NSInteger)code { - if (mPriv) { - if (mModalSession) { - [NSApp endModalSession:mModalSession]; - mModalSession = 0; - } - // Hack alert! - // Since this code path was never intended to be followed when starting from exec - // we need to force the dialog to communicate the new font, otherwise the signal - // won't get emitted. - if(code == NSOKButton) - mPriv->sampleEdit->setFont([self qtFont]); - mPriv->done((code == NSOKButton) ? QDialog::Accepted : QDialog::Rejected); - } else { - [NSApp stopModalWithCode:code]; - } + [NSApp stopModalWithCode:code]; + // Hack alert! + // Since this code path was never intended to be followed when starting from exec + // we need to force the dialog to communicate the new font, otherwise the signal + // won't get emitted. + if(code == NSOKButton) + mPriv->sampleEdit->setFont([self qtFont]); + mPriv->done((code == NSOKButton) ? QDialog::Accepted : QDialog::Rejected); } - (void)cleanUpAfterMyself @@ -544,8 +528,6 @@ void *QFontDialogPrivate::_q_constructNativePanel() } NSString *title = @"Select font"; [ourPanel setTitle:title]; - - [delegate setModalSession:[NSApp beginModalSessionForWindow:ourPanel]]; return delegate; } @@ -575,6 +557,7 @@ void QFontDialogPrivate::_q_macRunNativeAppModalPanel() QCocoaFontPanelDelegate *delegate = (QCocoaFontPanelDelegate *)_q_constructNativePanel(); NSWindow *ourPanel = [delegate actualPanel]; [ourPanel retain]; + int rval = [NSApp runModalForWindow:ourPanel]; QAbstractEventDispatcher::instance()->interrupt(); [ourPanel release]; -- cgit v0.12 From 0dfb7598e4659dc912c2b3ace7dfdb93f953f83c Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Wed, 3 Mar 2010 09:56:36 +0100 Subject: Mac: qfontdialog test fails The native font dialog on mac did not set the font specified in the non-native font dialog upon exec, but rather qApp->font(). This oneliner sets the correct font, and makes the autotest pass. Reviewed-by: cduclos --- src/gui/dialogs/qfontdialog_mac.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/dialogs/qfontdialog_mac.mm b/src/gui/dialogs/qfontdialog_mac.mm index 3a4c688..fd7fd68 100644 --- a/src/gui/dialogs/qfontdialog_mac.mm +++ b/src/gui/dialogs/qfontdialog_mac.mm @@ -514,7 +514,7 @@ void *QFontDialogPrivate::_q_constructNativePanel() #ifdef QT_MAC_USE_COCOA [[NSFontManager sharedFontManager] setTarget:delegate]; #endif - setFont(delegate, QApplication::font()); + setFont(delegate, q_func()->currentFont()); { // hack to get correct initial layout -- cgit v0.12 From 0e9bd62d905db6e0015a58609a747bb22521f8cc Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Wed, 3 Mar 2010 15:30:46 +0100 Subject: Mac: non-modal native qfontdialog does not work at all This was never implemented, and as it stands, just creating a QFontDialog and calling show on it will not show anything. This patch makes sure that show works, and that one can have more than one font dialog showing at the same time (but only the first one will be native) Reviewed-by: cduclos --- src/gui/dialogs/qfontdialog.cpp | 12 +-- src/gui/dialogs/qfontdialog_mac.mm | 165 +++++++++++++++++++++++++++---------- src/gui/dialogs/qfontdialog_p.h | 6 +- src/gui/kernel/qwidget_mac.mm | 6 +- 4 files changed, 135 insertions(+), 54 deletions(-) diff --git a/src/gui/dialogs/qfontdialog.cpp b/src/gui/dialogs/qfontdialog.cpp index 8e17830..b159fa7 100644 --- a/src/gui/dialogs/qfontdialog.cpp +++ b/src/gui/dialogs/qfontdialog.cpp @@ -174,6 +174,11 @@ void QFontDialogPrivate::init() { Q_Q(QFontDialog); +#ifdef Q_WS_MAC + nativeDialogInUse = false; + delegate = 0; +#endif + q->setSizeGripEnabled(true); q->setWindowTitle(QFontDialog::tr("Select Font")); @@ -329,10 +334,6 @@ void QFontDialogPrivate::init() familyList->setFocus(); retranslateStrings(); - -#ifdef Q_WS_MAC - delegate = 0; -#endif } /*! @@ -345,8 +346,7 @@ QFontDialog::~QFontDialog() #ifdef Q_WS_MAC Q_D(QFontDialog); if (d->delegate) { - QFontDialogPrivate::closeCocoaFontPanel(d->delegate); - QFontDialogPrivate::sharedFontPanelAvailable = true; + d->closeCocoaFontPanel(); return; } #endif diff --git a/src/gui/dialogs/qfontdialog_mac.mm b/src/gui/dialogs/qfontdialog_mac.mm index fd7fd68..c6653cb 100644 --- a/src/gui/dialogs/qfontdialog_mac.mm +++ b/src/gui/dialogs/qfontdialog_mac.mm @@ -58,6 +58,14 @@ typedef float CGFloat; // Should only not be defined on 32-bit platforms #endif +QT_BEGIN_NAMESPACE + +extern void macStartInterceptNSPanelCtor(); +extern void macStopInterceptNSPanelCtor(); +extern NSButton *macCreateButton(const char *text, NSView *superview); +extern bool qt_mac_is_macsheet(const QWidget *w); // qwidget_mac.mm + +QT_END_NAMESPACE QT_USE_NAMESPACE // should a priori be kept in sync with qcolordialog_mac.mm @@ -103,6 +111,9 @@ const int StyleMask = NSTitledWindowMask | NSClosableWindowMask | NSResizableWin priv:(QFontDialogPrivate *)priv extraWidth:(CGFloat)extraWidth extraHeight:(CGFloat)extraHeight; +- (void)showModelessPanel; +- (void)showWindowModalSheet:(QWidget *)docWidget; +- (void)runApplicationModalPanel; - (void)changeFont:(id)sender; - (void)changeAttributes:(id)sender; - (BOOL)windowShouldClose:(id)window; @@ -171,6 +182,20 @@ static QFont qfontForCocoaFont(NSFont *cocoaFont, const QFont &resolveFont) [cancelButton setAction:@selector(onCancelClicked)]; [cancelButton setTarget:self]; } + +#ifdef QT_MAC_USE_COCOA + // Stack the native dialog in front of its parent, if any: + QFontDialog *q = mPriv->fontDialog(); + if (!qt_mac_is_macsheet(q)) { + if (QWidget *parent = q->parentWidget()) { + if (parent->isWindow()) { + [qt_mac_window_for(parent) + addChildWindow:[mStolenContentView window] ordered:NSWindowAbove]; + } + } + } +#endif + mQtFont = new QFont(); return self; } @@ -181,6 +206,36 @@ static QFont qfontForCocoaFont(NSFont *cocoaFont, const QFont &resolveFont) [super dealloc]; } +- (void)showModelessPanel +{ + NSWindow *ourPanel = [mStolenContentView window]; + [ourPanel makeKeyAndOrderFront:self]; +} + +- (void)runApplicationModalPanel +{ + QBoolBlocker nativeDialogOnTop(QApplicationPrivate::native_modal_dialog_active); + NSWindow *ourPanel = [mStolenContentView window]; + [NSApp runModalForWindow:ourPanel]; + QAbstractEventDispatcher::instance()->interrupt(); +} + +- (void)showWindowModalSheet:(QWidget *)docWidget +{ +#ifdef QT_MAC_USE_COCOA + Q_UNUSED(docWidget); + NSWindow *ourPanel = [mStolenContentView window]; + [NSApp beginSheet:ourPanel + modalForWindow:qt_mac_window_for(docWidget) + modalDelegate:0 + didEndSelector:0 + contextInfo:0 ]; +#else + Q_UNUSED(docWidget); + [self showModelessPanel]; +#endif +} + - (void)changeFont:(id)sender { NSFont *dummyFont = [NSFont userFontOfSize:12.0]; @@ -273,9 +328,8 @@ static QFont qfontForCocoaFont(NSFont *cocoaFont, const QFont &resolveFont) NSSize cancelSizeHint = [mCancelButton frame].size; const CGFloat ButtonWidth = qMin(qMax(ButtonMinWidth, - qMax(okSizeHint.width, cancelSizeHint.width)), - CGFloat((frameSize.width - 2.0 * ButtonSideMargin - - ButtonSpacing) * 0.5)); + qMax(okSizeHint.width, cancelSizeHint.width)), + CGFloat((frameSize.width - 2.0 * ButtonSideMargin - ButtonSpacing) * 0.5)); const CGFloat ButtonHeight = qMax(ButtonMinHeight, qMax(okSizeHint.height, cancelSizeHint.height)); @@ -308,14 +362,12 @@ static QFont qfontForCocoaFont(NSFont *cocoaFont, const QFont &resolveFont) NSFontManager *fontManager = [NSFontManager sharedFontManager]; [self setQtFont:qfontForCocoaFont([fontManager convertFont:[fontManager selectedFont]], *mQtFont)]; - [[mStolenContentView window] close]; [self finishOffWithCode:NSOKButton]; } - (void)onCancelClicked { Q_ASSERT(mPanelHackedWithButtons); - [[mStolenContentView window] close]; [self finishOffWithCode:NSCancelButton]; } @@ -359,14 +411,21 @@ static QFont qfontForCocoaFont(NSFont *cocoaFont, const QFont &resolveFont) - (void)finishOffWithCode:(NSInteger)code { +#ifdef QT_MAC_USE_COCOA + QFontDialog *q = mPriv->fontDialog(); + if (QWidget *parent = q->parentWidget()) { + if (parent->isWindow()) { + [qt_mac_window_for(parent) removeChildWindow:[mStolenContentView window]]; + } + } +#endif + [NSApp stopModalWithCode:code]; - // Hack alert! - // Since this code path was never intended to be followed when starting from exec - // we need to force the dialog to communicate the new font, otherwise the signal - // won't get emitted. if(code == NSOKButton) mPriv->sampleEdit->setFont([self qtFont]); - mPriv->done((code == NSOKButton) ? QDialog::Accepted : QDialog::Rejected); + QMetaObject::invokeMethod(mPriv->fontDialog(), + (code == NSOKButton) ? "accept" : "reject", + Qt::QueuedConnection); } - (void)cleanUpAfterMyself @@ -392,18 +451,16 @@ static QFont qfontForCocoaFont(NSFont *cocoaFont, const QFont &resolveFont) QT_BEGIN_NAMESPACE -extern void macStartInterceptNSPanelCtor(); -extern void macStopInterceptNSPanelCtor(); -extern NSButton *macCreateButton(const char *text, NSView *superview); - -void QFontDialogPrivate::closeCocoaFontPanel(void *delegate) +void QFontDialogPrivate::closeCocoaFontPanel() { QMacCocoaAutoReleasePool pool; QCocoaFontPanelDelegate *theDelegate = static_cast(delegate); NSWindow *ourPanel = [theDelegate actualPanel]; [ourPanel close]; [theDelegate cleanUpAfterMyself]; - [theDelegate autorelease]; + [theDelegate release]; + this->delegate = 0; + sharedFontPanelAvailable = true; } void QFontDialogPrivate::setFont(void *delegate, const QFont &font) @@ -441,10 +498,13 @@ void QFontDialogPrivate::setFont(void *delegate, const QFont &font) [static_cast(delegate) setQtFont:font]; } -void *QFontDialogPrivate::_q_constructNativePanel() +void QFontDialogPrivate::createNSFontPanelDelegate() { - QMacCocoaAutoReleasePool pool; + if (delegate) + return; + sharedFontPanelAvailable = false; + QMacCocoaAutoReleasePool pool; bool sharedFontPanelExisted = [NSFontPanel sharedFontPanelExists]; NSFontPanel *sharedFontPanel = [NSFontPanel sharedFontPanel]; [sharedFontPanel setHidesOnDeactivate:false]; @@ -466,8 +526,7 @@ void *QFontDialogPrivate::_q_constructNativePanel() // compute dialogExtra{Width,Height} dialogExtraWidth = 2.0 * DialogSideMargin; - dialogExtraHeight = DialogTopMargin + ButtonTopMargin + ButtonMinHeight - + ButtonBottomMargin; + dialogExtraHeight = DialogTopMargin + ButtonTopMargin + ButtonMinHeight + ButtonBottomMargin; // compute initial contents rectangle NSRect contentRect = [sharedFontPanel contentRectForFrameRect:[sharedFontPanel frame]]; @@ -480,7 +539,6 @@ void *QFontDialogPrivate::_q_constructNativePanel() backing:NSBackingStoreBuffered defer:YES]; [ourPanel setReleasedWhenClosed:YES]; - stolenContentView = [sharedFontPanel contentView]; // steal the font panel's contents view @@ -500,21 +558,23 @@ void *QFontDialogPrivate::_q_constructNativePanel() [ourPanel setContentView:ourContentView]; [ourPanel setDefaultButtonCell:[okButton cell]]; } - // create a delegate and set it - QCocoaFontPanelDelegate *delegate = - [[QCocoaFontPanelDelegate alloc] initWithFontPanel:sharedFontPanel + + // create the delegate and set it + QCocoaFontPanelDelegate *del = [[QCocoaFontPanelDelegate alloc] initWithFontPanel:sharedFontPanel stolenContentView:stolenContentView okButton:okButton cancelButton:cancelButton priv:this extraWidth:dialogExtraWidth extraHeight:dialogExtraHeight]; - [ourPanel setDelegate:delegate]; - [[NSFontManager sharedFontManager] setDelegate:delegate]; + delegate = del; + [ourPanel setDelegate:del]; + + [[NSFontManager sharedFontManager] setDelegate:del]; #ifdef QT_MAC_USE_COCOA - [[NSFontManager sharedFontManager] setTarget:delegate]; + [[NSFontManager sharedFontManager] setTarget:del]; #endif - setFont(delegate, q_func()->currentFont()); + setFont(del, q_func()->currentFont()); { // hack to get correct initial layout @@ -522,13 +582,12 @@ void *QFontDialogPrivate::_q_constructNativePanel() frameRect.size.width += 1.0; [ourPanel setFrame:frameRect display:NO]; frameRect.size.width -= 1.0; - frameRect.size = [delegate windowWillResize:ourPanel toSize:frameRect.size]; + frameRect.size = [del windowWillResize:ourPanel toSize:frameRect.size]; [ourPanel setFrame:frameRect display:NO]; [ourPanel center]; } NSString *title = @"Select font"; [ourPanel setTitle:title]; - return delegate; } void QFontDialogPrivate::mac_nativeDialogModalHelp() @@ -553,29 +612,47 @@ void QFontDialogPrivate::mac_nativeDialogModalHelp() // and "adding" the buttons. void QFontDialogPrivate::_q_macRunNativeAppModalPanel() { - QBoolBlocker nativeDialogOnTop(QApplicationPrivate::native_modal_dialog_active); - QCocoaFontPanelDelegate *delegate = (QCocoaFontPanelDelegate *)_q_constructNativePanel(); - NSWindow *ourPanel = [delegate actualPanel]; - [ourPanel retain]; + createNSFontPanelDelegate(); + QCocoaFontPanelDelegate *del = static_cast(delegate); + [del runApplicationModalPanel]; +} - int rval = [NSApp runModalForWindow:ourPanel]; - QAbstractEventDispatcher::instance()->interrupt(); - [ourPanel release]; - [delegate cleanUpAfterMyself]; - [delegate release]; - bool isOk = (rval == NSOKButton); - if(isOk) - rescode = QDialog::Accepted; +bool QFontDialogPrivate::showCocoaFontPanel() +{ + if (!sharedFontPanelAvailable) + return false; + + Q_Q(QFontDialog); + QMacCocoaAutoReleasePool pool; + createNSFontPanelDelegate(); + QCocoaFontPanelDelegate *del = static_cast(delegate); + if (qt_mac_is_macsheet(q)) + [del showWindowModalSheet:q->parentWidget()]; else - rescode = QDialog::Rejected; + [del showModelessPanel]; + return true; } +bool QFontDialogPrivate::hideCocoaFontPanel() +{ + if (!delegate){ + // Nothing to do. We return false to leave the question + // open regarding whether or not to go native: + return false; + } else { + closeCocoaFontPanel(); + // Even when we hide it, we are still using a + // native dialog, so return true: + return true; + } +} bool QFontDialogPrivate::setVisible_sys(bool visible) { Q_Q(QFontDialog); if (!visible == q->isHidden()) return false; - return visible; + + return visible ? showCocoaFontPanel() : hideCocoaFontPanel(); } QT_END_NAMESPACE diff --git a/src/gui/dialogs/qfontdialog_p.h b/src/gui/dialogs/qfontdialog_p.h index c18b87b..8676be3 100644 --- a/src/gui/dialogs/qfontdialog_p.h +++ b/src/gui/dialogs/qfontdialog_p.h @@ -139,19 +139,21 @@ public: QByteArray memberToDisconnectOnClose; #ifdef Q_WS_MAC - static void closeCocoaFontPanel(void *delegate); static void setFont(void *delegate, const QFont &font); inline void done(int result) { q_func()->done(result); } inline QFontDialog *fontDialog() { return q_func(); } void *delegate; + void closeCocoaFontPanel(); bool nativeDialogInUse; bool canBeNativeDialog(); bool setVisible_sys(bool visible); - void *_q_constructNativePanel(); + void createNSFontPanelDelegate(); void _q_macRunNativeAppModalPanel(); void mac_nativeDialogModalHelp(); + bool showCocoaFontPanel(); + bool hideCocoaFontPanel(); static bool sharedFontPanelAvailable; #endif diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm index 6d8c97b..3622bac 100644 --- a/src/gui/kernel/qwidget_mac.mm +++ b/src/gui/kernel/qwidget_mac.mm @@ -3433,8 +3433,10 @@ void QWidgetPrivate::show_sys() // The window is modally shaddowed, so we need to make // sure that we don't pop in front of the modal window: [window orderFront:window]; - if (NSWindow *modalWin = qt_mac_window_for(top)) - [modalWin orderFront:window]; + if (!top->testAttribute(Qt::WA_DontShowOnScreen)) { + if (NSWindow *modalWin = qt_mac_window_for(top)) + [modalWin orderFront:window]; + } } #endif if (q->windowType() == Qt::Popup) { -- cgit v0.12 From f84112bb06e9a7a65afe9ba20d3419b33aee1e5d Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Fri, 5 Mar 2010 10:11:12 +0100 Subject: Mac: qfontdialog autotest failes The reason is the way we leave modality in the font dialog. When we do, we need to close the non-native qfontdialog as well, but doing so will issue callbacks (like set_visible_sys(false)), that will cause problems. This patch makes sure we wait with such callbacks until the native modal event loop has finished executing Reviewed-by: cduclos --- src/gui/dialogs/qfontdialog_mac.mm | 42 ++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/src/gui/dialogs/qfontdialog_mac.mm b/src/gui/dialogs/qfontdialog_mac.mm index c6653cb..919790b 100644 --- a/src/gui/dialogs/qfontdialog_mac.mm +++ b/src/gui/dialogs/qfontdialog_mac.mm @@ -103,6 +103,8 @@ const int StyleMask = NSTitledWindowMask | NSClosableWindowMask | NSResizableWin BOOL mPanelHackedWithButtons; CGFloat mDialogExtraWidth; CGFloat mDialogExtraHeight; + int mReturnCode; + BOOL mAppModal; } - (id)initWithFontPanel:(NSFontPanel *)panel stolenContentView:(NSView *)stolenContentView @@ -172,6 +174,8 @@ static QFont qfontForCocoaFont(NSFont *cocoaFont, const QFont &resolveFont) mPanelHackedWithButtons = (okButton != 0); mDialogExtraWidth = extraWidth; mDialogExtraHeight = extraHeight; + mReturnCode = -1; + mAppModal = false; if (mPanelHackedWithButtons) { [self relayout]; @@ -208,6 +212,7 @@ static QFont qfontForCocoaFont(NSFont *cocoaFont, const QFont &resolveFont) - (void)showModelessPanel { + mAppModal = false; NSWindow *ourPanel = [mStolenContentView window]; [ourPanel makeKeyAndOrderFront:self]; } @@ -215,24 +220,37 @@ static QFont qfontForCocoaFont(NSFont *cocoaFont, const QFont &resolveFont) - (void)runApplicationModalPanel { QBoolBlocker nativeDialogOnTop(QApplicationPrivate::native_modal_dialog_active); + mAppModal = true; NSWindow *ourPanel = [mStolenContentView window]; [NSApp runModalForWindow:ourPanel]; QAbstractEventDispatcher::instance()->interrupt(); + + if (mReturnCode == NSOKButton) + mPriv->fontDialog()->accept(); + else + mPriv->fontDialog()->reject(); } - (void)showWindowModalSheet:(QWidget *)docWidget { #ifdef QT_MAC_USE_COCOA - Q_UNUSED(docWidget); + NSWindow *window = qt_mac_window_for(docWidget); +#else + WindowRef hiwindowRef = qt_mac_window_for(docWidget); + NSWindow *window = [[NSWindow alloc] initWithWindowRef:hiwindowRef]; + CFRetain(hiwindowRef); +#endif + + mAppModal = false; NSWindow *ourPanel = [mStolenContentView window]; [NSApp beginSheet:ourPanel - modalForWindow:qt_mac_window_for(docWidget) + modalForWindow:window modalDelegate:0 didEndSelector:0 contextInfo:0 ]; -#else - Q_UNUSED(docWidget); - [self showModelessPanel]; + +#ifndef QT_MAC_USE_COCOA + CFRelease(hiwindowRef); #endif } @@ -420,12 +438,18 @@ static QFont qfontForCocoaFont(NSFont *cocoaFont, const QFont &resolveFont) } #endif - [NSApp stopModalWithCode:code]; if(code == NSOKButton) mPriv->sampleEdit->setFont([self qtFont]); - QMetaObject::invokeMethod(mPriv->fontDialog(), - (code == NSOKButton) ? "accept" : "reject", - Qt::QueuedConnection); + + if (mAppModal) { + mReturnCode = code; + [NSApp stopModalWithCode:code]; + } else { + if (code == NSOKButton) + mPriv->fontDialog()->accept(); + else + mPriv->fontDialog()->reject(); + } } - (void)cleanUpAfterMyself -- cgit v0.12 From 9ce72402149da7cdd3b204e7981b1c810595d699 Mon Sep 17 00:00:00 2001 From: Carlos Manuel Duclos Vergara Date: Fri, 5 Mar 2010 15:59:24 +0100 Subject: Fixing compilation error, missing ifdef. Reviewed-by: Prasanth --- src/plugins/bearer/corewlan/qcorewlanengine.mm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/bearer/corewlan/qcorewlanengine.mm b/src/plugins/bearer/corewlan/qcorewlanengine.mm index 8f174db..9a213e7 100644 --- a/src/plugins/bearer/corewlan/qcorewlanengine.mm +++ b/src/plugins/bearer/corewlan/qcorewlanengine.mm @@ -199,9 +199,10 @@ QCoreWlanEngine::~QCoreWlanEngine() { while (!foundConfigurations.isEmpty()) delete foundConfigurations.takeFirst(); - +#if defined(MAC_SDK_10_6) [listener remove]; [listener release]; +#endif } QString QCoreWlanEngine::getInterfaceFromId(const QString &id) -- cgit v0.12 From 1fdaff30cde418a858170547e9d3c514617ba366 Mon Sep 17 00:00:00 2001 From: ck Date: Fri, 5 Mar 2010 16:11:35 +0100 Subject: Assistant: Fix warnings about unused variables. --- tools/assistant/tools/assistant/helpviewer_qwv.cpp | 2 +- tools/assistant/tools/assistant/mainwindow.cpp | 4 ++-- tools/assistant/tools/assistant/mainwindow.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/assistant/tools/assistant/helpviewer_qwv.cpp b/tools/assistant/tools/assistant/helpviewer_qwv.cpp index 9bb66e1..a656416 100644 --- a/tools/assistant/tools/assistant/helpviewer_qwv.cpp +++ b/tools/assistant/tools/assistant/helpviewer_qwv.cpp @@ -223,7 +223,7 @@ bool HelpPage::acceptNavigationRequest(QWebFrame *, if (type == QWebPage::NavigationTypeLinkClicked && (m_keyboardModifiers & Qt::ControlModifier || m_pressedButtons == Qt::MidButton)) { - if (HelpViewer* viewer = centralWidget->newEmptyTab()) + if (centralWidget->newEmptyTab()) centralWidget->setSource(url); m_pressedButtons = Qt::NoButton; m_keyboardModifiers = Qt::NoModifier; diff --git a/tools/assistant/tools/assistant/mainwindow.cpp b/tools/assistant/tools/assistant/mainwindow.cpp index 8096218..687e6bc 100644 --- a/tools/assistant/tools/assistant/mainwindow.cpp +++ b/tools/assistant/tools/assistant/mainwindow.cpp @@ -341,7 +341,7 @@ void MainWindow::lookForNewQtDocumentation() m_qtDocInstaller = new QtDocInstaller(qtDocInfos); connect(m_qtDocInstaller, SIGNAL(docsInstalled(bool)), this, - SLOT(qtDocumentationInstalled(bool))); + SLOT(qtDocumentationInstalled())); connect(m_qtDocInstaller, SIGNAL(qchFileNotFound(QString)), this, SLOT(resetQtDocInfo(QString))); connect(m_qtDocInstaller, SIGNAL(registerDocumentation(QString, QString)), @@ -351,7 +351,7 @@ void MainWindow::lookForNewQtDocumentation() m_qtDocInstaller->installDocs(); } -void MainWindow::qtDocumentationInstalled(bool newDocsInstalled) +void MainWindow::qtDocumentationInstalled() { TRACE_OBJ statusBar()->clearMessage(); diff --git a/tools/assistant/tools/assistant/mainwindow.h b/tools/assistant/tools/assistant/mainwindow.h index 40ca624..8e4276d 100644 --- a/tools/assistant/tools/assistant/mainwindow.h +++ b/tools/assistant/tools/assistant/mainwindow.h @@ -112,7 +112,7 @@ private slots: void lookForNewQtDocumentation(); void indexingStarted(); void indexingFinished(); - void qtDocumentationInstalled(bool newDocsInstalled); + void qtDocumentationInstalled(); void registerDocumentation(const QString &component, const QString &absFileName); void resetQtDocInfo(const QString &component); -- cgit v0.12 From 56c9bd9a4c03418ad0ba83b576bcc278e86bfe99 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 5 Mar 2010 14:12:18 +0100 Subject: FreeType: Fast lookup of Latin-1 glyphs Store all glyphs with index < 256 in a pointer array for fast lookup Reviewed-by: Benjamin Poulain --- src/gui/painting/qpaintengine_raster.cpp | 2 +- src/gui/painting/qtextureglyphcache.cpp | 2 +- src/gui/text/qfontengine_ft.cpp | 70 +++++++++++++++++++++++++------- src/gui/text/qfontengine_ft_p.h | 16 +++++++- 4 files changed, 72 insertions(+), 18 deletions(-) diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp index a7c2a0b..bfcf7db 100644 --- a/src/gui/painting/qpaintengine_raster.cpp +++ b/src/gui/painting/qpaintengine_raster.cpp @@ -3390,7 +3390,7 @@ void QRasterPaintEngine::drawTextItem(const QPointF &p, const QTextItem &textIte }; for(int i = 0; i < glyphs.size(); i++) { - QFontEngineFT::Glyph *glyph = gset->glyph_data.value(glyphs[i]); + QFontEngineFT::Glyph *glyph = gset->getGlyph(glyphs[i]); if (!glyph || glyph->format != neededFormat) { if (!lockedFace) diff --git a/src/gui/painting/qtextureglyphcache.cpp b/src/gui/painting/qtextureglyphcache.cpp index cf3957b..4418018 100644 --- a/src/gui/painting/qtextureglyphcache.cpp +++ b/src/gui/painting/qtextureglyphcache.cpp @@ -195,7 +195,7 @@ QImage QTextureGlyphCache::textureMapForGlyph(glyph_t g) const QFontEngineFT::QGlyphSet *gset = ft->loadTransformedGlyphSet(m_transform); if (gset && ft->loadGlyphs(gset, &g, 1, format)) { - QFontEngineFT::Glyph *glyph = gset->glyph_data.value(g); + QFontEngineFT::Glyph *glyph = gset->getGlyph(g); const int bytesPerLine = (format == QFontEngineFT::Format_Mono ? ((glyph->width + 31) & ~31) >> 3 : (glyph->width + 3) & ~3); return QImage(glyph->data, glyph->width, glyph->height, bytesPerLine, imageFormat); diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp index 17ade64..6b40aad 100644 --- a/src/gui/text/qfontengine_ft.cpp +++ b/src/gui/text/qfontengine_ft.cpp @@ -746,7 +746,7 @@ bool QFontEngineFT::init(FaceId faceId, bool antialias, GlyphFormat format) QFontEngineFT::Glyph *QFontEngineFT::loadGlyphMetrics(QGlyphSet *set, uint glyph) const { - Glyph *g = set->glyph_data.value(glyph); + Glyph *g = set->getGlyph(glyph); if (g) return g; @@ -858,10 +858,10 @@ QFontEngineFT::Glyph *QFontEngineFT::loadGlyph(QGlyphSet *set, uint glyph, Glyph } } - Glyph *g = set->glyph_data.value(glyph); + Glyph *g = set->getGlyph(glyph); if (g && g->format == format) { if (uploadToServer && !g->uploadedToServer) { - set->glyph_data[glyph] = 0; + set->setGlyph(glyph, 0); delete g; g = 0; } else { @@ -1158,7 +1158,7 @@ QFontEngineFT::Glyph *QFontEngineFT::loadGlyph(QGlyphSet *set, uint glyph, Glyph uploadGlyphToServer(set, glyph, g, &info, glyph_buffer_size); } - set->glyph_data[glyph] = g; + set->setGlyph(glyph, g); return g; } @@ -1381,8 +1381,7 @@ QFontEngineFT::QGlyphSet *QFontEngineFT::loadTransformedGlyphSet(const QTransfor } gs = &transformedGlyphSets[0]; - qDeleteAll(gs->glyph_data); - gs->glyph_data.clear(); + gs->clear(); gs->id = allocateServerGlyphSet(); @@ -1398,7 +1397,7 @@ bool QFontEngineFT::loadGlyphs(QGlyphSet *gs, glyph_t *glyphs, int num_glyphs, G FT_Face face = 0; for (int i = 0; i < num_glyphs; ++i) { - Glyph *glyph = gs->glyph_data.value(glyphs[i]); + Glyph *glyph = gs->getGlyph(glyphs[i]); if (glyph == 0 || glyph->format != format) { if (!face) { face = lockFace(); @@ -1635,7 +1634,7 @@ void QFontEngineFT::recalcAdvances(QGlyphLayout *glyphs, QTextEngine::ShaperFlag FT_Face face = 0; if (flags & QTextEngine::DesignMetrics) { for (int i = 0; i < glyphs->numGlyphs; i++) { - Glyph *g = defaultGlyphSet.glyph_data.value(glyphs->glyphs[i]); + Glyph *g = defaultGlyphSet.getGlyph(glyphs->glyphs[i]); if (g) { glyphs->advances_x[i] = QFixed::fromFixed(g->linearAdvance); } else { @@ -1648,7 +1647,7 @@ void QFontEngineFT::recalcAdvances(QGlyphLayout *glyphs, QTextEngine::ShaperFlag } } else { for (int i = 0; i < glyphs->numGlyphs; i++) { - Glyph *g = defaultGlyphSet.glyph_data.value(glyphs->glyphs[i]); + Glyph *g = defaultGlyphSet.getGlyph(glyphs->glyphs[i]); if (g) { glyphs->advances_x[i] = QFixed(g->advance); } else { @@ -1677,7 +1676,7 @@ glyph_metrics_t QFontEngineFT::boundingBox(const QGlyphLayout &glyphs) QFixed ymax = 0; QFixed xmax = 0; for (int i = 0; i < glyphs.numGlyphs; i++) { - Glyph *g = defaultGlyphSet.glyph_data.value(glyphs.glyphs[i]); + Glyph *g = defaultGlyphSet.getGlyph(glyphs.glyphs[i]); if (!g) { if (!face) face = lockFace(); @@ -1719,7 +1718,7 @@ glyph_metrics_t QFontEngineFT::boundingBox(glyph_t glyph) { FT_Face face = 0; glyph_metrics_t overall; - Glyph *g = defaultGlyphSet.glyph_data.value(glyph); + Glyph *g = defaultGlyphSet.getGlyph(glyph); if (!g) { face = lockFace(); g = loadGlyph(glyph, Format_None, true); @@ -1783,8 +1782,7 @@ glyph_metrics_t QFontEngineFT::boundingBox(glyph_t glyph, const QTransform &matr transformedGlyphSets.prepend(QGlyphSet()); } glyphSet = &transformedGlyphSets[0]; - qDeleteAll(glyphSet->glyph_data); - glyphSet->glyph_data.clear(); + glyphSet->clear(); glyphSet->id = allocateServerGlyphSet(); glyphSet->transformationMatrix = m; } @@ -1792,7 +1790,7 @@ glyph_metrics_t QFontEngineFT::boundingBox(glyph_t glyph, const QTransform &matr } else { glyphSet = &defaultGlyphSet; } - Glyph * g = glyphSet->glyph_data.value(glyph); + Glyph * g = glyphSet->getGlyph(glyph); if (!g) { face = lockFace(); g = loadGlyphMetrics(glyphSet, glyph); @@ -1881,7 +1879,7 @@ QImage QFontEngineFT::alphaRGBMapForGlyph(glyph_t g, int margin, const QTransfor void QFontEngineFT::removeGlyphFromCache(glyph_t glyph) { - delete defaultGlyphSet.glyph_data.take(glyph); + defaultGlyphSet.removeGlyphFromCache(glyph); } int QFontEngineFT::glyphCount() const @@ -1937,11 +1935,53 @@ QFontEngineFT::QGlyphSet::QGlyphSet() transformationMatrix.yy = 0x10000; transformationMatrix.xy = 0; transformationMatrix.yx = 0; + memset(fast_glyph_data, 0, sizeof(fast_glyph_data)); + fast_glyph_count = 0; } QFontEngineFT::QGlyphSet::~QGlyphSet() { + clear(); +} + +void QFontEngineFT::QGlyphSet::clear() +{ + if (fast_glyph_count > 0) { + for (int i = 0; i < 256; ++i) { + if (fast_glyph_data[i]) { + delete fast_glyph_data[i]; + fast_glyph_data[i] = 0; + } + } + fast_glyph_count = 0; + } qDeleteAll(glyph_data); + glyph_data.clear(); +} + +void QFontEngineFT::QGlyphSet::removeGlyphFromCache(int index) +{ + if (index < 256) { + if (fast_glyph_data[index]) { + delete fast_glyph_data[index]; + fast_glyph_data[index] = 0; + if (fast_glyph_count > 0) + --fast_glyph_count; + } + } else { + delete glyph_data.take(index); + } +} + +void QFontEngineFT::QGlyphSet::setGlyph(int index, Glyph *glyph) +{ + if (index < 256) { + if (!fast_glyph_data[index]) + ++fast_glyph_count; + fast_glyph_data[index] = glyph; + } else { + glyph_data.insert(index, glyph); + } } unsigned long QFontEngineFT::allocateServerGlyphSet() diff --git a/src/gui/text/qfontengine_ft_p.h b/src/gui/text/qfontengine_ft_p.h index 98dd002..12b7da8 100644 --- a/src/gui/text/qfontengine_ft_p.h +++ b/src/gui/text/qfontengine_ft_p.h @@ -180,7 +180,21 @@ public: FT_Matrix transformationMatrix; unsigned long id; // server sided id, GlyphSet for X11 bool outline_drawing; + + void removeGlyphFromCache(int index); + void clear(); + inline Glyph *getGlyph(int index) const + { + if (index < 256) + return fast_glyph_data[index]; + return glyph_data.value(index); + } + void setGlyph(int index, Glyph *glyph); + +private: mutable QHash glyph_data; // maps from glyph index to glyph data + mutable Glyph *fast_glyph_data[256]; // for fast lookup of glyphs < 256 + mutable int fast_glyph_count; }; virtual QFontEngine::FaceId faceId() const; @@ -252,7 +266,7 @@ public: QGlyphSet *defaultGlyphs() { return &defaultGlyphSet; } GlyphFormat defaultGlyphFormat() const { return defaultFormat; } - inline Glyph *cachedGlyph(glyph_t g) const { return defaultGlyphSet.glyph_data.value(g); } + inline Glyph *cachedGlyph(glyph_t g) const { return defaultGlyphSet.getGlyph(g); } QGlyphSet *loadTransformedGlyphSet(const QTransform &matrix); bool loadGlyphs(QGlyphSet *gs, glyph_t *glyphs, int num_glyphs, GlyphFormat format = Format_Render); -- cgit v0.12 From f58c75bb0a6738ec65520f73e7ed7a791d8a77ab Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Thu, 4 Mar 2010 13:10:19 +0100 Subject: Doc: Update QString docs about real ASCII and to/fromAscii and NULs. Despite the names, the QString::toAscii and QString::fromAscii functions are not about ASCII. One can set an ASCII-incompatible codec using QTextCodec::setCodecForCStrings, which may lead to loss of information. Also update the docs about how the functions that take QByteArray take embedded NULs in the QByteArray into account. The result is: stop conversion at NUL: operator=, operator==, operator!= include NUL in conversion: operator<, operator<=, operator>, operator>= Reviewed-by: ossi --- src/corelib/tools/qstring.cpp | 78 ++++++++++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 31 deletions(-) diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index e9b7b9a..eedb981 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -335,7 +335,7 @@ const QString::Null QString::null = { }; \macro QT_NO_CAST_TO_ASCII \relates QString - disables automatic conversion from QString to ASCII 8-bit strings (char *) + disables automatic conversion from QString to 8-bit strings (char *) \sa QT_NO_CAST_FROM_ASCII, QT_NO_CAST_FROM_BYTEARRAY */ @@ -391,10 +391,10 @@ const QString::Null QString::null = { }; with code values above 65535 are stored using surrogate pairs, i.e., two consecutive \l{QChar}s.) - \l{Unicode} is an international standard that supports most of - the writing systems in use today. It is a superset of ASCII and - Latin-1 (ISO 8859-1), and all the ASCII/Latin-1 characters are - available at the same code positions. + \l{Unicode} is an international standard that supports most of the + writing systems in use today. It is a superset of US-ASCII (ANSI + X3.4-1986) and Latin-1 (ISO 8859-1), and all the US-ASCII/Latin-1 + characters are available at the same code positions. Behind the scenes, QString uses \l{implicit sharing} (copy-on-write) to reduce memory usage and to avoid the needless @@ -562,11 +562,13 @@ const QString::Null QString::null = { }; toLatin1(), toUtf8(), and toLocal8Bit(). \list - \o toAscii() returns an ASCII encoded 8-bit string. + \o toAscii() returns an 8-bit string encoded using the codec + specified by QTextCodec::codecForCStrings (by default, that's + Latin 1). \o toLatin1() returns a Latin-1 (ISO 8859-1) encoded 8-bit string. \o toUtf8() returns a UTF-8 encoded 8-bit string. UTF-8 is a - superset of ASCII that supports the entire Unicode character - set through multibyte sequences. + superset of US-ASCII (ANSI X3.4-1986) that supports the entire + Unicode character set through multibyte sequences. \o toLocal8Bit() returns an 8-bit string using the system's local encoding. \endlist @@ -578,7 +580,7 @@ const QString::Null QString::null = { }; As mentioned above, QString provides a lot of functions and operators that make it easy to interoperate with \c{const char *} strings. But this functionality is a double-edged sword: It makes - QString more convenient to use if all strings are ASCII or + QString more convenient to use if all strings are US-ASCII or Latin-1, but there is always the risk that an implicit conversion from or to \c{const char *} is done using the wrong 8-bit encoding. To minimize these risks, you can turn off these implicit @@ -586,9 +588,9 @@ const QString::Null QString::null = { }; \list \o \c QT_NO_CAST_FROM_ASCII disables automatic conversions from - ASCII to Unicode. + C string literals and pointers to Unicode. \o \c QT_NO_CAST_TO_ASCII disables automatic conversion from QString - to ASCII. + to C strings. \endlist One way to define these preprocessor symbols globally for your @@ -837,7 +839,7 @@ int QString::grow(int size) /*! \fn QString::QString(const char *str) - Constructs a string initialized with the ASCII string \a str. The + Constructs a string initialized with the 8-bit string \a str. The given const char pointer is converted to Unicode using the fromAscii() function. @@ -1337,8 +1339,9 @@ QString &QString::operator=(const QString &other) \overload operator=() - Assigns \a ba to this string. The byte array is converted to - Unicode using the fromAscii() function. + Assigns \a ba to this string. The byte array is converted to Unicode + using the fromAscii() function. This function stops conversion at the + first NUL character found, or the end of the \a ba byte array. You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII when you compile your applications. This @@ -2131,7 +2134,8 @@ bool QString::operator==(const QLatin1String &other) const \overload operator==() The \a other byte array is converted to a QString using the - fromAscii() function. + fromAscii() function. This function stops conversion at the + first NUL character found, or the end of the \a ba byte array. You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII when you compile your applications. This @@ -2192,7 +2196,8 @@ bool QString::operator<(const QLatin1String &other) const \overload operator<() The \a other byte array is converted to a QString using the - fromAscii() function. + fromAscii() function. If any NUL characters ('\0') are embedded + in the \a ba byte array, they will be included in the transformation. You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII when you compile your applications. This @@ -2234,7 +2239,8 @@ bool QString::operator<(const QLatin1String &other) const \overload operator<=() The \a other byte array is converted to a QString using the - fromAscii() function. + fromAscii() function. If any NUL characters ('\0') are embedded + in the \a ba byte array, they will be included in the transformation. You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII when you compile your applications. This @@ -2292,7 +2298,8 @@ bool QString::operator>(const QLatin1String &other) const \overload operator>() The \a other byte array is converted to a QString using the - fromAscii() function. + fromAscii() function. If any NUL characters ('\0') are embedded + in the \a ba byte array, they will be included in the transformation. You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII when you compile your applications. This @@ -2334,7 +2341,8 @@ bool QString::operator>(const QLatin1String &other) const \overload operator>=() The \a other byte array is converted to a QString using the - fromAscii() function. + fromAscii() function. If any NUL characters ('\0') are embedded + in the \a ba byte array, they will be included in the transformation. You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII when you compile your applications. This can be useful if you want @@ -2376,7 +2384,8 @@ bool QString::operator>(const QLatin1String &other) const \overload operator!=() The \a other byte array is converted to a QString using the - fromAscii() function. + fromAscii() function. If any NUL characters ('\0') are embedded + in the \a ba byte array, they will be included in the transformation. You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII when you compile your applications. This can be useful if you want @@ -3578,12 +3587,15 @@ QByteArray QString::toLatin1() const // isn't necessary in the header. See task 177402. /*! - Returns an 8-bit ASCII representation of the string as a QByteArray. + Returns an 8-bit representation of the string as a QByteArray. If a codec has been set using QTextCodec::setCodecForCStrings(), it is used to convert Unicode to 8-bit char; otherwise this function does the same as toLatin1(). + Note that, despite the name, this function does not necessarily return an US-ASCII + (ANSI X3.4-1986) string and its result may not be US-ASCII compatible. + \sa fromAscii(), toLatin1(), toUtf8(), toLocal8Bit(), QTextCodec */ QByteArray QString::toAscii() const @@ -3952,14 +3964,16 @@ QString QString::fromLocal8Bit(const char *str, int size) /*! Returns a QString initialized with the first \a size characters - of the 8-bit ASCII string \a str. + of the 8-bit string \a str. If \a size is -1 (default), it is taken to be qstrlen(\a str). - If a codec has been set using QTextCodec::setCodecForCStrings(), - it is used to convert \a str to Unicode; otherwise this function - does the same as fromLatin1(). + Note that, despite the name, this function actually uses the codec + defined by QTextCodec::setCodecForCStrings() to convert \a str to + Unicode. Depending on the codec, it may not accept valid US-ASCII (ANSI + X3.4-1986) input. If no codec has been set, this function does the same + as fromLatin1(). \sa toAscii(), fromLatin1(), fromUtf8(), fromLocal8Bit() */ @@ -4399,8 +4413,10 @@ QString& QString::fill(QChar ch, int size) \overload operator+=() - Appends the byte array \a ba to this string. The byte array is - converted to Unicode using the fromAscii() function. + Appends the byte array \a ba to this string. The byte array is converted + to Unicode using the fromAscii() function. If any NUL characters ('\0') + are embedded in the \a ba byte array, they will be included in the + transformation. You can disable this function by defining \c QT_NO_CAST_FROM_ASCII when you compile your applications. This @@ -7085,9 +7101,9 @@ void QString::updateProperties() const This operator is mostly useful to pass a QString to a function that accepts a std::string object. - If the QString contains non-ASCII Unicode characters, using this - operator can lead to loss of information, since the implementation - calls toAscii(). + If the QString contains Unicode characters that the + QTextCodec::codecForCStrings() codec cannot handle, using this operator + can lead to loss of information. This operator is only available if Qt is configured with STL compatibility enabled. @@ -7138,7 +7154,7 @@ QString QString::fromRawData(const QChar *unicode, int size) } /*! \class QLatin1String - \brief The QLatin1String class provides a thin wrapper around an ASCII/Latin-1 encoded string literal. + \brief The QLatin1String class provides a thin wrapper around an US-ASCII/Latin-1 encoded string literal. \ingroup string-processing \reentrant -- cgit v0.12 From e1c5eb5247bae6e9ccc2c7985c36c5953f3a72d1 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Thu, 4 Mar 2010 13:14:20 +0100 Subject: Doc: fix a mistake saying that const char* was converted to QLatin1String --- src/corelib/tools/qstring.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index eedb981..5d946cf 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -7241,7 +7241,7 @@ QString QString::fromRawData(const QChar *unicode, int size) \since 4.3 \overload - The \a other const char pointer is converted to a QLatin1String using + The \a other const char pointer is converted to a QString using the QString::fromAscii() function. You can disable this operator by defining \c @@ -7266,7 +7266,7 @@ QString QString::fromRawData(const QChar *unicode, int size) \since 4.3 \overload operator!=() - The \a other const char pointer is converted to a QLatin1String using + The \a other const char pointer is converted to a QString using the QString::fromAscii() function. You can disable this operator by defining \c @@ -7292,7 +7292,7 @@ QString QString::fromRawData(const QChar *unicode, int size) \since 4.3 \overload - The \a other const char pointer is converted to a QLatin1String using + The \a other const char pointer is converted to a QString using the QString::fromAscii() function. You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII @@ -7318,7 +7318,7 @@ QString QString::fromRawData(const QChar *unicode, int size) \since 4.3 \overload - The \a other const char pointer is converted to a QLatin1String using + The \a other const char pointer is converted to a QString using the QString::fromAscii() function. You can disable this operator by defining \c @@ -7344,7 +7344,7 @@ QString QString::fromRawData(const QChar *unicode, int size) \since 4.3 \overload - The \a other const char pointer is converted to a QLatin1String using + The \a other const char pointer is converted to a QString using the QString::fromAscii() function. You can disable this operator by defining \c -- cgit v0.12 From 2101a184311d12e1e52a0d421f7a81a28ca333d3 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Fri, 5 Mar 2010 11:49:49 +0100 Subject: Doc: add some notes about QString lossy/lossless conversions --- src/corelib/tools/qstring.cpp | 43 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index 5d946cf..9097570 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -3572,8 +3572,10 @@ static QByteArray toLatin1_helper(const QChar *data, int length) /*! Returns a Latin-1 representation of the string as a QByteArray. - The returned byte array is undefined if the string contains - non-Latin1 characters. + + The returned byte array is undefined if the string contains non-Latin1 + characters. Those characters may be suppressed or replaced with a + question mark. \sa fromLatin1(), toAscii(), toUtf8(), toLocal8Bit(), QTextCodec */ @@ -3623,8 +3625,13 @@ static QByteArray toLocal8Bit_helper(const QChar *data, int length) QByteArray. The returned byte array is undefined if the string contains characters not supported by the local 8-bit encoding. - QTextCodec::codecForLocale() is used to perform the conversion - from Unicode. + QTextCodec::codecForLocale() is used to perform the conversion from + Unicode. If the locale encoding could not be determined, this function + does the same as toLatin1(). + + If this string contains any characters that cannot be encoded in the + locale, the returned byte array is undefined. Those characters may be + suppressed or replaced by another. \sa fromLocal8Bit(), toAscii(), toLatin1(), toUtf8(), QTextCodec */ @@ -3640,6 +3647,17 @@ QByteArray QString::toLocal8Bit() const /*! Returns a UTF-8 representation of the string as a QByteArray. + UTF-8 is a Unicode codec and can represent all characters in a Unicode + string like QString. + + However, in the Unicode range, there are certain codepoints that are not + considered characters. The Unicode standard reserves the last two + codepoints in each Unicode Plane (U+FFFE, U+FFFF, U+1FFFE, U+1FFFF, + U+2FFFE, etc.), as well as 16 codepoints in the range U+FDD0..U+FDDF, + inclusive, as non-characters. If any of those appear in the string, they + may be discarded and will not appear in the UTF-8 representation, or they + may be replaced by one or more replacement characters. + \sa fromUtf8(), toAscii(), toLatin1(), toLocal8Bit(), QTextCodec */ QByteArray QString::toUtf8() const @@ -3687,7 +3705,10 @@ QByteArray QString::toUtf8() const /*! \since 4.2 - Returns a UCS-4 representation of the string as a QVector. + Returns a UCS-4/UTF-32 representation of the string as a QVector. + + UCS-4 is a Unicode codec and is lossless. All characters from this string + can be encoded in UCS-4. \sa fromUtf8(), toAscii(), toLatin1(), toLocal8Bit(), QTextCodec, fromUcs4(), toWCharArray() */ @@ -3989,6 +4010,18 @@ QString QString::fromAscii(const char *str, int size) If \a size is -1 (default), it is taken to be qstrlen(\a str). + UTF-8 is a Unicode codec and can represent all characters in a Unicode + string like QString. However, invalid sequences are possible with UTF-8 + and, if any such are found, they will be replaced with one or more + "replacement characters", or suppressed. These include non-Unicode + sequences, non-characters, overlong sequences or surrogate codepoints + encoded into UTF-8. + + Non-characters are codepoints that the Unicode standard reserves and must + not be used in text interchange. They are the last two codepoints in each + Unicode Plane (U+FFFE, U+FFFF, U+1FFFE, U+1FFFF, U+2FFFE, etc.), as well + as 16 codepoints in the range U+FDD0..U+FDDF, inclusive. + \sa toUtf8(), fromAscii(), fromLatin1(), fromLocal8Bit() */ QString QString::fromUtf8(const char *str, int size) -- cgit v0.12 From ca33c72439ba92ca8bdeca4d172550602f01f0cc Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Fri, 5 Mar 2010 12:55:14 +0100 Subject: Make QString::toUtf8() also use QUtf8. Reviewed-By: Denis Dzyubenko --- src/corelib/tools/qstring.cpp | 44 +++++-------------------------------------- 1 file changed, 5 insertions(+), 39 deletions(-) diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index 9097570..703ec67 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -563,7 +563,7 @@ const QString::Null QString::null = { }; \list \o toAscii() returns an 8-bit string encoded using the codec - specified by QTextCodec::codecForCStrings (by default, that's + specified by QTextCodec::codecForCStrings (by default, that is Latin 1). \o toLatin1() returns a Latin-1 (ISO 8859-1) encoded 8-bit string. \o toUtf8() returns a UTF-8 encoded 8-bit string. UTF-8 is a @@ -3662,44 +3662,10 @@ QByteArray QString::toLocal8Bit() const */ QByteArray QString::toUtf8() const { - QByteArray ba; - if (d->size) { - int l = d->size; - int rlen = l*3+1; - ba.resize(rlen); - uchar *cursor = (uchar*)ba.data(); - const ushort *ch =d->data; - for (int i=0; i < l; i++) { - uint u = *ch; - if (u < 0x80) { - *cursor++ = (uchar)u; - } else { - if (u < 0x0800) { - *cursor++ = 0xc0 | ((uchar) (u >> 6)); - } else { - if (QChar(u).isHighSurrogate() && i < l-1) { - ushort low = ch[1]; - if (QChar(low).isLowSurrogate()) { - ++ch; - ++i; - u = QChar::surrogateToUcs4(u,low); - } - } - if (u > 0xffff) { - *cursor++ = 0xf0 | ((uchar) (u >> 18)); - *cursor++ = 0x80 | (((uchar) (u >> 12)) & 0x3f); - } else { - *cursor++ = 0xe0 | ((uchar) (u >> 12)); - } - *cursor++ = 0x80 | (((uchar) (u >> 6)) & 0x3f); - } - *cursor++ = 0x80 | ((uchar) (u&0x3f)); - } - ++ch; - } - ba.resize(cursor - (uchar*)ba.constData()); - } - return ba; + if (isNull()) + return QByteArray(); + + return QUtf8::convertFromUnicode(constData(), length(), 0); } /*! -- cgit v0.12 From 4f02ca5c9458299185d447da87058d6e8ca1b260 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Fri, 5 Mar 2010 13:12:43 +0100 Subject: Finish reverting the UTF-8 hack added in 80ea01c6 (P4 106704, Qt 3.2). This code was removed from QString in 539cd1e5 (P4 259474, Qt 4.3), but apparently lingered on the UTF-8 codec code. Reviewed-by: Denis Dzyubenko --- src/corelib/codecs/qutfcodec.cpp | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/corelib/codecs/qutfcodec.cpp b/src/corelib/codecs/qutfcodec.cpp index 7655c51..742b2e7 100644 --- a/src/corelib/codecs/qutfcodec.cpp +++ b/src/corelib/codecs/qutfcodec.cpp @@ -107,15 +107,8 @@ QByteArray QUtf8::convertFromUnicode(const QChar *uc, int len, QTextCodec::Conve *cursor++ = 0xc0 | ((uchar) (u >> 6)); } else { if (u > 0xffff) { - // see QString::fromUtf8() and QString::utf8() for explanations - if (u > 0x10fe00 && u < 0x10ff00) { - *cursor++ = (u - 0x10fe00); - ++ch; - continue; - } else { - *cursor++ = 0xf0 | ((uchar) (u >> 18)); - *cursor++ = 0x80 | (((uchar) (u >> 12)) & 0x3f); - } + *cursor++ = 0xf0 | ((uchar) (u >> 18)); + *cursor++ = 0x80 | (((uchar) (u >> 12)) & 0x3f); } else { *cursor++ = 0xe0 | (((uchar) (u >> 12)) & 0x3f); } -- cgit v0.12 From 8b30b72948d5f16d59f8799f3889f563e2c6e24d Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Fri, 5 Mar 2010 14:10:57 +0100 Subject: Make the UTF-8 encoder/decoder not accept Unicode non-characters Reviewed-By: Denis Dzyubenko --- src/corelib/codecs/qutfcodec.cpp | 28 +++++++++++-- tests/auto/utf8/tst_utf8.cpp | 85 ++++++++++++++++++++++++++++++++++------ 2 files changed, 97 insertions(+), 16 deletions(-) diff --git a/src/corelib/codecs/qutfcodec.cpp b/src/corelib/codecs/qutfcodec.cpp index 742b2e7..233bd8f 100644 --- a/src/corelib/codecs/qutfcodec.cpp +++ b/src/corelib/codecs/qutfcodec.cpp @@ -48,6 +48,19 @@ QT_BEGIN_NAMESPACE enum { Endian = 0, Data = 1 }; +static inline bool isUnicodeNonCharacter(uint ucs4) +{ + // Unicode has a couple of "non-characters" that one can use internally, + // but are not allowed to be used for text interchange. + // + // Those are the last two entries each Unicode Plane (U+FFFE, U+FFFF, + // U+1FFFE, U+1FFFF, etc.) as well as the entries between U+FDD0 and + // U+FDEF (inclusive) + + return (ucs4 & 0xfffe) == 0xfffe + || (ucs4 - 0xfdd0U) < 16; +} + QByteArray QUtf8::convertFromUnicode(const QChar *uc, int len, QTextCodec::ConverterState *state) { uchar replacement = '?'; @@ -106,6 +119,14 @@ QByteArray QUtf8::convertFromUnicode(const QChar *uc, int len, QTextCodec::Conve if (u < 0x0800) { *cursor++ = 0xc0 | ((uchar) (u >> 6)); } else { + // is it one of the Unicode non-characters? + if (isUnicodeNonCharacter(u)) { + *cursor = replacement; + ++ch; + ++invalid; + continue; + } + if (u > 0xffff) { *cursor++ = 0xf0 | ((uchar) (u >> 18)); *cursor++ = 0x80 | (((uchar) (u >> 12)) & 0x3f); @@ -172,15 +193,16 @@ QString QUtf8::convertToUnicode(const char *chars, int len, QTextCodec::Converte --need; if (!need) { // utf-8 bom composes into 0xfeff code point + bool nonCharacter; if (!headerdone && uc == 0xfeff) { // dont do anything, just skip the BOM - } else if (uc > 0xffff && uc < 0x110000) { + } else if (!(nonCharacter = isUnicodeNonCharacter(uc)) && uc > 0xffff && uc < 0x110000) { // surrogate pair Q_ASSERT((qch - (ushort*)result.unicode()) + 2 < result.length()); *qch++ = QChar::highSurrogate(uc); *qch++ = QChar::lowSurrogate(uc); - } else if ((uc < min_uc) || (uc >= 0xd800 && uc <= 0xdfff) || (uc >= 0xfffe)) { - // error: overlong sequence, UTF16 surrogate or BOM + } else if ((uc < min_uc) || (uc >= 0xd800 && uc <= 0xdfff) || nonCharacter || uc >= 0x110000) { + // error: overlong sequence, UTF16 surrogate or non-character *qch++ = replacement; ++invalid; } else { diff --git a/tests/auto/utf8/tst_utf8.cpp b/tests/auto/utf8/tst_utf8.cpp index 1183b81..7bbbfab 100644 --- a/tests/auto/utf8/tst_utf8.cpp +++ b/tests/auto/utf8/tst_utf8.cpp @@ -73,6 +73,9 @@ private slots: void invalidUtf8_data(); void invalidUtf8(); + + void nonCharacters_data(); + void nonCharacters(); }; void tst_Utf8::initTestCase() @@ -134,8 +137,8 @@ void tst_Utf8::roundTrip_data() static const uint utf32_5[] = { 0x010203 }; QTest::newRow("utf8_5") << QByteArray(utf8_5) << QString::fromUcs4(utf32_5, 1); - static const char utf8_6[] = "\364\217\277\277"; // U+10FFFF - static const uint utf32_6[] = { 0x10FFFF }; + static const char utf8_6[] = "\364\217\277\275"; // U+10FFFD + static const uint utf32_6[] = { 0x10FFFD }; QTest::newRow("utf8_6") << QByteArray(utf8_6) << QString::fromUcs4(utf32_6, 1); static const char utf8_7[] = "abc\302\240\303\241\303\251\307\275 \342\202\254def"; @@ -144,10 +147,10 @@ void tst_Utf8::roundTrip_data() ' ', 0x20AC, 'd', 'e', 'f', 0 }; QTest::newRow("utf8_7") << QByteArray(utf8_7) << QString::fromUtf16(utf16_7); - static const char utf8_8[] = "abc\302\240\303\241\303\251\307\275 \364\217\277\277 \342\202\254def"; + static const char utf8_8[] = "abc\302\240\303\241\303\251\307\275 \364\217\277\275 \342\202\254def"; static const uint utf32_8[] = { 'a', 'b', 'c', 0x00A0, 0x00E1, 0x00E9, 0x01FD, - ' ', 0x10FFFF, ' ', + ' ', 0x10FFFD, ' ', 0x20AC, 'd', 'e', 'f', 0 }; QTest::newRow("utf8_8") << QByteArray(utf8_8) << QString::fromUcs4(utf32_8); } @@ -214,14 +217,6 @@ void tst_Utf8::invalidUtf8_data() QTest::newRow("4chars-2") << QByteArray("\xF0\x90\xC0\x80"); QTest::newRow("4chars-3") << QByteArray("\xF0\xC0\x80\x80"); - // U+FFFE and U+FFFF are non-characters and must not be present - // U+FFFE: 1111 11 1111 11 1110 - // encoding: xxxz:1111 xz11:1111 xz11:1110 - QTest::newRow("fffe") << QByteArray("\xEF\xBF\xBE"); - // U+FFFF: 1111 11 1111 11 1111 - // encoding: xxxz:1111 xz11:1111 xz11:1111 - QTest::newRow("ffff") << QByteArray("\xEF\xBF\xBF"); - // Surrogate pairs must now be present either // U+D800: 1101 10 0000 00 0000 // encoding: xxxz:1101 xz10:0000 xz00:0000 @@ -302,7 +297,7 @@ void tst_Utf8::invalidUtf8() QFETCH_GLOBAL(bool, useLocale); QSharedPointer decoder = QSharedPointer(codec->makeDecoder()); - QString decoded = decoder->toUnicode(utf8); + decoder->toUnicode(utf8); // Only enforce correctness on our UTF-8 decoder // The system's UTF-8 codec is sometimes buggy @@ -314,5 +309,69 @@ void tst_Utf8::invalidUtf8() qWarning("System codec does not report failure when it should. Should report bug upstream."); } +void tst_Utf8::nonCharacters_data() +{ + QTest::addColumn("utf8"); + QTest::addColumn("utf16"); + + // Unicode has a couple of "non-characters" that one can use internally, + // but are not allowed to be used for text interchange. + // + // Those are the last two entries each Unicode Plane (U+FFFE, U+FFFF, + // U+1FFFE, U+1FFFF, etc.) as well as the entries between U+FDD0 and + // U+FDEF (inclusive) + + // U+FDD0 through U+FDEF + for (int i = 0; i < 16; ++i) { + char utf8[] = { 0357, 0267, 0220 + i, 0 }; + QString utf16 = QChar(0xfdd0 + i); + QTest::newRow(qPrintable(QString::number(0xfdd0 + i, 16))) << QByteArray(utf8) << utf16; + } + + // the last two in Planes 1 through 16 + for (uint plane = 1; plane <= 16; ++plane) { + for (uint lower = 0xfffe; lower < 0x10000; ++lower) { + uint ucs4 = (plane << 16) | lower; + char utf8[] = { 0xf0 | uchar(ucs4 >> 18), + 0x80 | (uchar(ucs4 >> 12) & 0x3f), + 0x80 | (uchar(ucs4 >> 6) & 0x3f), + 0x80 | (uchar(ucs4) & 0x3f), + 0 }; + ushort utf16[] = { QChar::highSurrogate(ucs4), QChar::lowSurrogate(ucs4), 0 }; + + QTest::newRow(qPrintable(QString::number(ucs4, 16))) << QByteArray(utf8) << QString::fromUtf16(utf16); + } + } + + QTest::newRow("fffe") << QByteArray("\xEF\xBF\xBE") << QString(QChar(0xfffe)); + QTest::newRow("ffff") << QByteArray("\xEF\xBF\xBF") << QString(QChar(0xffff)); +} + +void tst_Utf8::nonCharacters() +{ + QFETCH(QByteArray, utf8); + QFETCH(QString, utf16); + QFETCH_GLOBAL(bool, useLocale); + + QSharedPointer decoder = QSharedPointer(codec->makeDecoder()); + decoder->toUnicode(utf8); + + // Only enforce correctness on our UTF-8 decoder + // The system's UTF-8 codec is sometimes buggy + // GNU libc's iconv is known to accept U+FFFF and U+FFFE encoded as UTF-8 + // OS X's iconv is known to accept those, plus surrogates and codepoints above U+10FFFF + if (!useLocale) + QVERIFY(decoder->hasFailure()); + else if (!decoder->hasFailure()) + qWarning("System codec does not report failure when it should. Should report bug upstream."); + + QSharedPointer encoder(codec->makeEncoder()); + encoder->fromUnicode(utf16); + if (!useLocale) + QVERIFY(encoder->hasFailure()); + else if (!encoder->hasFailure()) + qWarning("System codec does not report failure when it should. Should report bug upstream."); +} + QTEST_MAIN(tst_Utf8) #include "tst_utf8.moc" -- cgit v0.12 From 59068d0d90ed28a1a99a5fdef3d4aaadddb31d6d Mon Sep 17 00:00:00 2001 From: Ritt Konstantin Date: Wed, 24 Feb 2010 20:13:16 +0100 Subject: adjust unicode tables generator to work better under win * protect data-files from crlf line-endings since generator asserts on windows because of crlf line endings * assume generator is a console app Merge-request: 480 Reviewed-by: Thiago Macieira --- util/unicode/.gitattributes | 1 + util/unicode/unicode.pro | 1 + 2 files changed, 2 insertions(+) create mode 100644 util/unicode/.gitattributes diff --git a/util/unicode/.gitattributes b/util/unicode/.gitattributes new file mode 100644 index 0000000..772b88f --- /dev/null +++ b/util/unicode/.gitattributes @@ -0,0 +1 @@ +data/*.txt -crlf diff --git a/util/unicode/unicode.pro b/util/unicode/unicode.pro index a53f70a..0250c2a 100644 --- a/util/unicode/unicode.pro +++ b/util/unicode/unicode.pro @@ -1,2 +1,3 @@ SOURCES += main.cpp QT = core +CONFIG += console -- cgit v0.12 From 43c4852de3c990c0f84bedfec3da168cb259e19d Mon Sep 17 00:00:00 2001 From: Ritt Konstantin Date: Wed, 24 Feb 2010 20:13:18 +0100 Subject: apply some (forgotten) changes to generator as they were applied to the data b6542eb2 - Thierry Bastian) fix to exported symbol 2e429e40 - Lars Knoll) N'Ko support Merge-request: 480 Reviewed-by: Thiago Macieira --- util/unicode/main.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/util/unicode/main.cpp b/util/unicode/main.cpp index 8f27d4a..4d20b22 100644 --- a/util/unicode/main.cpp +++ b/util/unicode/main.cpp @@ -38,9 +38,11 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ + #include #include #include +#include #include #include #include @@ -275,7 +277,7 @@ const char *methods = " }\n" "\n" " Q_CORE_EXPORT int QT_FASTCALL script(uint ucs4);\n" - " Q_CORE_EXPORT_INLINE int QT_FASTCALL script(const QChar &ch) {\n" + " inline int script(const QChar &ch) {\n" " return script(ch.unicode());\n" " }\n\n"; @@ -1644,6 +1646,7 @@ QByteArray createScriptEnumDeclaration() "Lao", "Malayalam", "Myanmar", + "Nko", "Ogham", "Oriya", "Runic", @@ -1683,9 +1686,12 @@ QByteArray createScriptEnumDeclaration() scriptHash[i] = i; } - declaration += ",\n "; - declaration += scriptName; + if (scriptName != "Inherited") { + declaration += ",\n "; + declaration += scriptName; + } } + declaration += ",\n Inherited"; declaration += ",\n ScriptCount = Inherited"; // output the ones that are an alias for 'Common' -- cgit v0.12 From c0e07ee419b9bf3023d5802a7e685c0d3c817185 Mon Sep 17 00:00:00 2001 From: Ritt Konstantin Date: Wed, 24 Feb 2010 20:13:20 +0100 Subject: minor cleanups and styling fixes for generator and generated code Merge-request: 480 Reviewed-by: Thiago Macieira --- util/unicode/main.cpp | 190 ++++++++++++++++++++++++++------------------------ 1 file changed, 98 insertions(+), 92 deletions(-) diff --git a/util/unicode/main.cpp b/util/unicode/main.cpp index 4d20b22..70d362d 100644 --- a/util/unicode/main.cpp +++ b/util/unicode/main.cpp @@ -49,11 +49,16 @@ #include #include +#define DATA_VERSION_S "5.0" +#define DATA_VERSION_STR "QChar::Unicode_5_0" + +#define LAST_CODEPOINT 0x10ffff + static struct AgeMap { const char *age; const QChar::UnicodeVersion version; -} ageMap [] = { +} ageMap[] = { { "1.1", QChar::Unicode_1_1 }, { "2.0", QChar::Unicode_2_0 }, { "2.1", QChar::Unicode_2_1_2 }, @@ -65,11 +70,10 @@ static struct AgeMap { { "5.0", QChar::Unicode_5_0 }, { 0, QChar::Unicode_Unassigned } }; -#define CURRENT_UNICODE_VERSION "QChar::Unicode_5_0" static const char *grapheme_break_string = " enum GraphemeBreak {\n" - " GraphemeBreakOther, \n" + " GraphemeBreakOther,\n" " GraphemeBreakCR,\n" " GraphemeBreakLF,\n" " GraphemeBreakControl,\n" @@ -161,7 +165,7 @@ static void initWordBreak() { WordBreakMidNum, "MidNum" }, { WordBreakNumeric, "Numeric" }, { WordBreakExtendNumLet, "ExtendNumLet" }, - { WordBreakFormat, 0 } + { WordBreakFormat, 0 } }; WordBreakList *d = breaks; while (d->name) { @@ -220,7 +224,7 @@ static void initSentenceBreak() { SentenceBreakATerm, "ATerm" }, { SentenceBreakSTerm, "STerm" }, { SentenceBreakClose, "Close" }, - { SentenceBreakOther, 0 } + { SentenceBreakOther, 0 } }; SentenceBreakList *d = breaks; while (d->name) { @@ -230,32 +234,6 @@ static void initSentenceBreak() } -// Keep this one in sync with the code in createPropertyInfo -const char *property_string = - " struct Properties {\n" - " ushort category : 8;\n" - " ushort line_break_class : 8;\n" - " ushort direction : 8;\n" - " ushort combiningClass :8;\n" - " ushort joining : 2;\n" - " signed short digitValue : 6; /* 5 needed */\n" - " ushort unicodeVersion : 4;\n" - " ushort lowerCaseSpecial : 1;\n" - " ushort upperCaseSpecial : 1;\n" - " ushort titleCaseSpecial : 1;\n" - " ushort caseFoldSpecial : 1; /* currently unused */\n" - " signed short mirrorDiff : 16;\n" - " signed short lowerCaseDiff : 16;\n" - " signed short upperCaseDiff : 16;\n" - " signed short titleCaseDiff : 16;\n" - " signed short caseFoldDiff : 16;\n" - " ushort graphemeBreak : 8;\n" - " ushort wordBreak : 8;\n" - " ushort sentenceBreak : 8;\n" - " };\n" - " Q_CORE_EXPORT const Properties * QT_FASTCALL properties(uint ucs4);\n" - " Q_CORE_EXPORT const Properties * QT_FASTCALL properties(ushort ucs2);\n"; - const char *lineBreakClass = " // see http://www.unicode.org/reports/tr14/tr14-19.html\n" " // we don't use the XX, AI and CB properties and map them to AL instead.\n" @@ -270,16 +248,40 @@ const char *lineBreakClass = " LineBreak_SP, LineBreak_CR, LineBreak_LF, LineBreak_BK\n" " };\n\n"; +// Keep this one in sync with the code in createPropertyInfo +const char *property_string = + " struct Properties {\n" + " ushort category : 8; /* 5 needed */\n" + " ushort line_break_class : 8; /* 6 needed */\n" + " ushort direction : 8; /* 5 needed */\n" + " ushort combiningClass : 8;\n" + " ushort joining : 2;\n" + " signed short digitValue : 6; /* 5 needed */\n" + " ushort unicodeVersion : 4;\n" + " ushort lowerCaseSpecial : 1;\n" + " ushort upperCaseSpecial : 1;\n" + " ushort titleCaseSpecial : 1;\n" + " ushort caseFoldSpecial : 1; /* currently unused */\n" + " signed short mirrorDiff : 16;\n" + " signed short lowerCaseDiff : 16;\n" + " signed short upperCaseDiff : 16;\n" + " signed short titleCaseDiff : 16;\n" + " signed short caseFoldDiff : 16;\n" + " ushort graphemeBreak : 8; /* 4 needed */\n" + " ushort wordBreak : 8; /* 4 needed */\n" + " ushort sentenceBreak : 8; /* 4 needed */\n" + " };\n" + " Q_CORE_EXPORT const Properties * QT_FASTCALL properties(uint ucs4);\n" + " Q_CORE_EXPORT const Properties * QT_FASTCALL properties(ushort ucs2);\n"; + const char *methods = " Q_CORE_EXPORT QUnicodeTables::LineBreakClass QT_FASTCALL lineBreakClass(uint ucs4);\n" - " inline int lineBreakClass(const QChar &ch) {\n" - " return QUnicodeTables::lineBreakClass(ch.unicode());\n" - " }\n" + " inline int lineBreakClass(const QChar &ch)\n" + " { return lineBreakClass(ch.unicode()); }\n" "\n" " Q_CORE_EXPORT int QT_FASTCALL script(uint ucs4);\n" - " inline int script(const QChar &ch) {\n" - " return script(ch.unicode());\n" - " }\n\n"; + " inline int script(const QChar &ch)\n" + " { return script(ch.unicode()); }\n\n"; struct PropertyFlags { @@ -314,7 +316,7 @@ struct PropertyFlags { // from DerivedAge.txt QChar::UnicodeVersion age : 4; int digitValue; - uint line_break_class : 5; + uint line_break_class : 6; int mirrorDiff : 16; @@ -447,7 +449,7 @@ static void initCategoryMap() struct Cat { QChar::Category cat; const char *name; - } categories [] = { + } categories[] = { { QChar::Mark_NonSpacing, "Mn" }, { QChar::Mark_SpacingCombining, "Mc" }, { QChar::Mark_Enclosing, "Me" }, @@ -555,7 +557,7 @@ static void initDecompositionMap() { QChar::Square, "" }, { QChar::Compat, "" }, { QChar::Fraction, "" }, - { QChar::NoDecomposition, 0 } + { QChar::NoDecomposition, 0 } }; Dec *d = decompositions; while (d->name) { @@ -574,11 +576,14 @@ int highestComposedCharacter = 0; int numLigatures = 0; int highestLigature = 0; -struct Ligature {ushort u1; ushort u2; ushort ligature;}; +struct Ligature { + ushort u1; + ushort u2; + ushort ligature; +}; // we need them sorted after the first component for fast lookup -bool operator < (const Ligature &l1, const Ligature &l2) { - return l1.u1 < l2.u1; -} +bool operator < (const Ligature &l1, const Ligature &l2) +{ return l1.u1 < l2.u1; } QHash > ligatureHashes; @@ -646,7 +651,7 @@ static void readUnicodeData() } if (!properties[UD_LowerCase].isEmpty()) { int lowerCase = properties[UD_LowerCase].toInt(&ok, 16); - Q_ASSERT (ok); + Q_ASSERT(ok); data.p.lowerCaseDiff = lowerCase - codepoint; maxLowerCaseDiff = qMax(maxLowerCaseDiff, qAbs(data.p.lowerCaseDiff)); if (codepoint > 0xffff) { @@ -660,7 +665,7 @@ static void readUnicodeData() properties[UD_TitleCase] = properties[UD_UpperCase]; if (!properties[UD_TitleCase].isEmpty()) { int titleCase = properties[UD_TitleCase].toInt(&ok, 16); - Q_ASSERT (ok); + Q_ASSERT(ok); data.p.titleCaseDiff = titleCase - codepoint; maxTitleCaseDiff = qMax(maxTitleCaseDiff, qAbs(data.p.titleCaseDiff)); if (codepoint > 0xffff) { @@ -731,10 +736,8 @@ static void readBidiMirroring() UnicodeData d = unicodeData.value(codepoint, UnicodeData(codepoint)); d.mirroredChar = mirror; - if (qAbs(codepoint-d.mirroredChar) > maxMirroredDiff) - maxMirroredDiff = qAbs(codepoint - d.mirroredChar); - d.p.mirrorDiff = d.mirroredChar - codepoint; + maxMirroredDiff = qMax(maxMirroredDiff, qAbs(d.p.mirrorDiff)); unicodeData.insert(codepoint, d); } } @@ -870,7 +873,7 @@ static void readCompositionExclusion() unicodeData.insert(codepoint, d); } - for (int i = 0; i < 0x110000; ++i) { + for (int i = 0; i <= LAST_CODEPOINT; ++i) { UnicodeData data = unicodeData.value(i, UnicodeData(i)); if (!data.excludedComposition && data.decompositionType == QChar::Canonical @@ -935,10 +938,12 @@ static QByteArray createNormalizationCorrections() QList fields = line.split(';'); Q_ASSERT(fields.size() == 4); - NormalizationCorrection c; + NormalizationCorrection c = { 0, 0, 0 }; bool ok; c.codepoint = fields.at(0).toInt(&ok, 16); + Q_ASSERT(ok); c.mapped = fields.at(1).toInt(&ok, 16); + Q_ASSERT(ok); if (fields.at(3) == "3.2.0") c.version = QChar::Unicode_3_2; else if (fields.at(3) == "4.0.0") @@ -955,7 +960,6 @@ static QByteArray createNormalizationCorrections() "enum { NumNormalizationCorrections = " + QByteArray::number(numCorrections) + " };\n\n"; - return out; } @@ -963,7 +967,7 @@ static QByteArray createNormalizationCorrections() static void computeUniqueProperties() { qDebug("computeUniqueProperties:"); - for (int uc = 0; uc < 0x110000; ++uc) { + for (int uc = 0; uc <= LAST_CODEPOINT; ++uc) { UnicodeData d = unicodeData.value(uc, UnicodeData(uc)); int index = uniqueProperties.indexOf(d.p); @@ -1068,7 +1072,7 @@ static void readLineBreak() static void readSpecialCasing() { -// qDebug() << "Reading SpecialCasing.txt"; + qDebug() << "Reading SpecialCasing.txt"; QFile f("data/SpecialCasing.txt"); if (!f.exists()) qFatal("Couldn't find SpecialCasing.txt"); @@ -1180,7 +1184,7 @@ static void readCaseFolding() QList l = line.split(';'); bool ok; - uint codepoint = l[0].trimmed().toInt(&ok, 16); + int codepoint = l[0].trimmed().toInt(&ok, 16); Q_ASSERT(ok); @@ -1664,7 +1668,7 @@ QByteArray createScriptEnumDeclaration() // generate script enum QByteArray declaration; - declaration += " // See http://www.unicode.org/reports/tr24/tr24-5.html\n\n"; + declaration += " // See http://www.unicode.org/reports/tr24/tr24-5.html\n"; declaration += " enum Script {\n Common"; int uniqueScripts = 1; // Common @@ -1674,12 +1678,14 @@ QByteArray createScriptEnumDeclaration() QByteArray scriptName = scriptNames.at(i); // does the script require special processing? bool special = false; - for (int s = 0; !special && s < specialScriptsCount; ++s) { - if (scriptName == specialScripts[s]) + for (int s = 0; s < specialScriptsCount; ++s) { + if (scriptName == specialScripts[s]) { special = true; + break; + } } if (!special) { - scriptHash[i] = 0; // alias for 'Common' + scriptHash[i] = 0; // alias for 'Common' continue; } else { ++uniqueScripts; @@ -1698,10 +1704,9 @@ QByteArray createScriptEnumDeclaration() for (int i = 1; i < scriptNames.size(); ++i) { if (scriptHash.value(i) != 0) continue; - QByteArray scriptName = scriptNames.at(i); - scriptName += " = Common"; declaration += ",\n "; - declaration += scriptName; + declaration += scriptNames.at(i); + declaration += " = Common"; } declaration += "\n };\n"; @@ -1844,7 +1849,7 @@ static QByteArray createPropertyInfo() { qDebug("createPropertyInfo:"); - const int BMP_BLOCKSIZE=32; + const int BMP_BLOCKSIZE = 32; const int BMP_SHIFT = 5; const int BMP_END = 0x11000; const int SMP_END = 0x110000; @@ -1896,14 +1901,14 @@ static QByteArray createPropertyInfo() int bmp_block_data = bmp_blocks*BMP_BLOCKSIZE*2; int bmp_trie = BMP_END/BMP_BLOCKSIZE*2; int bmp_mem = bmp_block_data + bmp_trie; - qDebug(" %d unique blocks in BMP.",blocks.size()); + qDebug(" %d unique blocks in BMP.", blocks.size()); qDebug(" block data uses: %d bytes", bmp_block_data); qDebug(" trie data uses : %d bytes", bmp_trie); - int smp_block_data = (blocks.size()- bmp_blocks)*SMP_BLOCKSIZE*2; + int smp_block_data = (blocks.size() - bmp_blocks)*SMP_BLOCKSIZE*2; int smp_trie = (SMP_END-BMP_END)/SMP_BLOCKSIZE*2; int smp_mem = smp_block_data + smp_trie; - qDebug(" %d unique blocks in SMP.",blocks.size()-bmp_blocks); + qDebug(" %d unique blocks in SMP.", blocks.size()-bmp_blocks); qDebug(" block data uses: %d bytes", smp_block_data); qDebug(" trie data uses : %d bytes", smp_trie); @@ -1914,7 +1919,7 @@ static QByteArray createPropertyInfo() out += "static const unsigned short uc_property_trie[] = {\n"; // first write the map - out += " // 0x" + QByteArray::number(BMP_END, 16); + out += " // 0 - 0x" + QByteArray::number(BMP_END, 16); for (int i = 0; i < BMP_END/BMP_BLOCKSIZE; ++i) { if (!(i % 8)) { if (out.endsWith(' ')) @@ -1983,7 +1988,7 @@ static QByteArray createPropertyInfo() "] + (ucs2 & 0x" + QByteArray::number(BMP_BLOCKSIZE-1, 16)+ ")])\n\n" - "static const QUnicodeTables::Properties uc_properties [] = {\n"; + "static const QUnicodeTables::Properties uc_properties[] = {\n"; // keep in sync with the property declaration for (int i = 0; i < uniqueProperties.size(); ++i) { @@ -2042,7 +2047,7 @@ static QByteArray createPropertyInfo() out += QByteArray::number( p.wordBreak ); out += ", "; out += QByteArray::number( p.sentenceBreak ); - out += "},\n"; + out += " },\n"; } out += "};\n\n"; @@ -2070,9 +2075,9 @@ static QByteArray createPropertyInfo() " return uc_properties + index;\n" "}\n\n"; - out += "#define CURRENT_VERSION "CURRENT_UNICODE_VERSION"\n\n"; + out += "#define CURRENT_VERSION "DATA_VERSION_STR"\n\n"; - out += "static const ushort specialCaseMap [] = {"; + out += "static const ushort specialCaseMap[] = {"; for (int i = 0; i < specialCaseMap.size(); ++i) { if (!(i % 16)) out += "\n "; @@ -2083,7 +2088,7 @@ static QByteArray createPropertyInfo() out += "\n};\n"; out += "#define SPECIAL_CASE_MAX_LEN " + QByteArray::number(specialCaseMaxLen) + "\n\n"; - qDebug() << "Special case map uses " << specialCaseMap.size()*2 << "bytes"; + qDebug("Special case map uses : %d bytes", specialCaseMap.size()*2); return out; } @@ -2094,14 +2099,14 @@ struct DecompositionBlock { int index; QList decompositionPositions; bool operator ==(const DecompositionBlock &other) - { return decompositionPositions == other.decompositionPositions; } + { return decompositionPositions == other.decompositionPositions; } }; static QByteArray createCompositionInfo() { qDebug("createCompositionInfo:"); - const int BMP_BLOCKSIZE=16; + const int BMP_BLOCKSIZE = 16; const int BMP_SHIFT = 4; const int BMP_END = 0x3400; // start of Han const int SMP_END = 0x30000; @@ -2202,15 +2207,15 @@ static QByteArray createCompositionInfo() int bmp_block_data = bmp_blocks*BMP_BLOCKSIZE*2; int bmp_trie = BMP_END/BMP_BLOCKSIZE*2; int bmp_mem = bmp_block_data + bmp_trie; - qDebug(" %d unique blocks in BMP.",blocks.size()); + qDebug(" %d unique blocks in BMP.", blocks.size()); qDebug(" block data uses: %d bytes", bmp_block_data); qDebug(" trie data uses : %d bytes", bmp_trie); qDebug(" memory usage: %d bytes", bmp_mem); - int smp_block_data = (blocks.size()- bmp_blocks)*SMP_BLOCKSIZE*2; + int smp_block_data = (blocks.size() - bmp_blocks)*SMP_BLOCKSIZE*2; int smp_trie = (SMP_END-BMP_END)/SMP_BLOCKSIZE*2; int smp_mem = smp_block_data + smp_trie; - qDebug(" %d unique blocks in SMP.",blocks.size()-bmp_blocks); + qDebug(" %d unique blocks in SMP.", blocks.size()-bmp_blocks); qDebug(" block data uses: %d bytes", smp_block_data); qDebug(" trie data uses : %d bytes", smp_trie); @@ -2353,7 +2358,7 @@ static QByteArray createLigatureInfo() int bmp_block_data = bmp_blocks*BMP_BLOCKSIZE*2; int bmp_trie = BMP_END/BMP_BLOCKSIZE*2; int bmp_mem = bmp_block_data + bmp_trie; - qDebug(" %d unique blocks in BMP.",blocks.size()); + qDebug(" %d unique blocks in BMP.", blocks.size()); qDebug(" block data uses: %d bytes", bmp_block_data); qDebug(" trie data uses : %d bytes", bmp_trie); qDebug(" ligature data uses : %d bytes", ligatures.size()*2); @@ -2405,7 +2410,7 @@ static QByteArray createLigatureInfo() "uc_ligature_trie[uc_ligature_trie[u2>>" + QByteArray::number(BMP_SHIFT) + "] + (u2 & 0x" + QByteArray::number(BMP_BLOCKSIZE-1, 16)+ ")] : 0xffff);\n\n" - "static const unsigned short uc_ligature_map [] = {\n"; + "static const unsigned short uc_ligature_map[] = {\n"; for (int i = 0; i < ligatures.size(); ++i) { if (!(i % 8)) { @@ -2468,9 +2473,6 @@ int main(int, char **) QByteArray scriptEnumDeclaration = createScriptEnumDeclaration(); QByteArray scriptTableDeclaration = createScriptTableDeclaration(); - QFile f("../../src/corelib/tools/qunicodetables.cpp"); - f.open(QFile::WriteOnly|QFile::Truncate); - QByteArray header = "/****************************************************************************\n" "**\n" @@ -2511,9 +2513,10 @@ int main(int, char **) "**\n" "** $QT_END_LICENSE$\n" "**\n" - "****************************************************************************/\n\n" + "****************************************************************************/\n\n"; - "/* This file is autogenerated from the Unicode 5.0 database. Do not edit */\n\n"; + QByteArray note = + "/* This file is autogenerated from the Unicode "DATA_VERSION_S" database. Do not edit */\n\n"; QByteArray warning = "//\n" @@ -2527,41 +2530,45 @@ int main(int, char **) "// We mean it.\n" "//\n\n"; + QFile f("../../src/corelib/tools/qunicodetables.cpp"); + f.open(QFile::WriteOnly|QFile::Truncate); f.write(header); + f.write(note); f.write("QT_BEGIN_NAMESPACE\n\n"); f.write(properties); f.write(compositions); f.write(ligatures); f.write(normalizationCorrections); f.write(scriptTableDeclaration); - f.write("\nQT_END_NAMESPACE\n"); + f.write("QT_END_NAMESPACE\n"); f.close(); f.setFileName("../../src/corelib/tools/qunicodetables_p.h"); f.open(QFile::WriteOnly | QFile::Truncate); f.write(header); + f.write(note); f.write(warning); f.write("#ifndef QUNICODETABLES_P_H\n" "#define QUNICODETABLES_P_H\n\n" "#include \n\n" "QT_BEGIN_NAMESPACE\n\n"); - f.write("namespace QUnicodeTables {\n"); + f.write("namespace QUnicodeTables {\n\n"); f.write(property_string); f.write("\n"); f.write(scriptEnumDeclaration); f.write("\n"); f.write(lineBreakClass); f.write("\n"); - f.write(methods); - f.write("\n"); f.write(grapheme_break_string); f.write("\n"); f.write(word_break_string); f.write("\n"); f.write(sentence_break_string); - f.write("\n}\n\n" + f.write("\n"); + f.write(methods); + f.write("} // namespace QUnicodeTables\n\n" "QT_END_NAMESPACE\n\n" - "#endif\n"); + "#endif // QUNICODETABLES_P_H\n"); f.close(); qDebug() << "maxMirroredDiff = " << hex << maxMirroredDiff; @@ -2584,7 +2591,7 @@ int main(int, char **) sum += decompositionLength.value(i, 0); } qDebug(" len decomposition map %d, average length %f, num composed chars %d", - totalcompositions, (float)totalcompositions/(float)sum, sum); + totalcompositions, (float)totalcompositions/(float)sum, sum); qDebug("highest composed character %x", highestComposedCharacter); qDebug("num ligatures = %d highest=%x, maxLength=%d", numLigatures, highestLigature, longestLigature); @@ -2605,4 +2612,3 @@ int main(int, char **) #endif } - -- cgit v0.12 From 7706e9ba3807f9f31a9310f39f0c8b3007f7fb10 Mon Sep 17 00:00:00 2001 From: Ritt Konstantin Date: Wed, 24 Feb 2010 20:13:22 +0100 Subject: fix some 0x10000 codepoint -related issues Merge-request: 480 Reviewed-by: Thiago Macieira --- util/unicode/main.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/util/unicode/main.cpp b/util/unicode/main.cpp index 70d362d..14d8046 100644 --- a/util/unicode/main.cpp +++ b/util/unicode/main.cpp @@ -2131,15 +2131,14 @@ static QByteArray createCompositionInfo() if (!d.decomposition.isEmpty()) { int utf16Chars = 0; for (int j = 0; j < d.decomposition.size(); ++j) - utf16Chars += d.decomposition.at(j) > 0x10000 ? 2 : 1; + utf16Chars += d.decomposition.at(j) >= 0x10000 ? 2 : 1; decompositions.append(d.decompositionType + (utf16Chars<<8)); for (int j = 0; j < d.decomposition.size(); ++j) { int code = d.decomposition.at(j); - if (code > 0x10000) { + if (code >= 0x10000) { // save as surrogate pair - code -= 0x10000; - ushort high = code/0x400 + 0xd800; - ushort low = code%0x400 + 0xdc00; + ushort high = QChar::highSurrogate(code); + ushort low = QChar::lowSurrogate(code); decompositions.append(high); decompositions.append(low); } else { @@ -2173,15 +2172,14 @@ static QByteArray createCompositionInfo() if (!d.decomposition.isEmpty()) { int utf16Chars = 0; for (int j = 0; j < d.decomposition.size(); ++j) - utf16Chars += d.decomposition.at(j) > 0x10000 ? 2 : 1; + utf16Chars += d.decomposition.at(j) >= 0x10000 ? 2 : 1; decompositions.append(d.decompositionType + (utf16Chars<<8)); for (int j = 0; j < d.decomposition.size(); ++j) { int code = d.decomposition.at(j); - if (code > 0x10000) { + if (code >= 0x10000) { // save as surrogate pair - code -= 0x10000; - ushort high = code/0x400 + 0xd800; - ushort low = code%0x400 + 0xdc00; + ushort high = QChar::highSurrogate(code); + ushort low = QChar::lowSurrogate(code); decompositions.append(high); decompositions.append(low); } else { -- cgit v0.12 From 58ea5d52b4f30fc1d029db05b09b60fef49a6f2a Mon Sep 17 00:00:00 2001 From: Ritt Konstantin Date: Wed, 24 Feb 2010 20:13:24 +0100 Subject: Unicode character property 'General_Category=Cn' was erroneously ignored causing two related bugs in QChar::category() and QChar::isPrint(). As described in tr44, 4.2.8 Default Values General_Category character property should be setted to Cn for all codepoints omitted in UCD. Instead they was mapped to QChar::NoCategory (=0) which have no equivalent in Unicode specs and as result was ignored in filtering by binary mask. Merge-request: 480 Reviewed-by: Thiago Macieira --- tests/auto/qchar/tst_qchar.cpp | 13 +++++++++++++ util/unicode/main.cpp | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/tests/auto/qchar/tst_qchar.cpp b/tests/auto/qchar/tst_qchar.cpp index 547147c..6227c2e 100644 --- a/tests/auto/qchar/tst_qchar.cpp +++ b/tests/auto/qchar/tst_qchar.cpp @@ -72,6 +72,7 @@ private slots: void toLower(); void toTitle(); void toCaseFolded(); + void isPrint(); void isUpper(); void isLower(); void category(); @@ -218,6 +219,12 @@ void tst_QChar::toCaseFolded() QVERIFY(QChar::toCaseFolded((ushort)0xb5) == 0x3bc); } +void tst_QChar::isPrint() +{ + QVERIFY(QChar('A').isPrint()); + QVERIFY(!QChar(0x1aff).isPrint()); // General_Gategory =Cn +} + void tst_QChar::isUpper() { QVERIFY(QChar('A').isUpper()); @@ -259,6 +266,12 @@ void tst_QChar::category() QVERIFY(QChar::category(0xd900u) == QChar::Other_Surrogate); QVERIFY(QChar::category(0xdc00u) == QChar::Other_Surrogate); QVERIFY(QChar::category(0xdc01u) == QChar::Other_Surrogate); + + QVERIFY(QChar::category((uint)0x10fffdu) == QChar::Other_PrivateUse); + QVERIFY(QChar::category((uint)0x110000u) == QChar::NoCategory); + + QVERIFY(QChar::category((uint)0x1aff) == QChar::Other_NotAssigned); + QVERIFY(QChar::category((uint)0x10ffffu) == QChar::Other_NotAssigned); } void tst_QChar::direction() diff --git a/util/unicode/main.cpp b/util/unicode/main.cpp index 14d8046..d7ee084 100644 --- a/util/unicode/main.cpp +++ b/util/unicode/main.cpp @@ -368,7 +368,7 @@ static int appendToSpecialCaseMap(const QList &map) struct UnicodeData { UnicodeData(int codepoint = 0) { - p.category = QChar::NoCategory; + p.category = QChar::Other_NotAssigned; // Cn p.combiningClass = 0; p.direction = QChar::DirL; -- cgit v0.12 From 9b7377aa9623eeacccb9219bc87b6658b6af0285 Mon Sep 17 00:00:00 2001 From: Ritt Konstantin Date: Wed, 24 Feb 2010 20:13:26 +0100 Subject: make sure that the sequences in specialCaseMap are unique there is was a bug caused appending the same sequence again and again... this fix also reduces count of unique unicode properties (and blocks) Merge-request: 480 Reviewed-by: Thiago Macieira --- util/unicode/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/unicode/main.cpp b/util/unicode/main.cpp index d7ee084..4f39e06 100644 --- a/util/unicode/main.cpp +++ b/util/unicode/main.cpp @@ -351,7 +351,7 @@ static int appendToSpecialCaseMap(const QList &map) specialCaseMaxLen = qMax(specialCaseMaxLen, utf16map.size()); utf16map << 0; - for (int i = 0; i < specialCaseMap.size() - utf16map.size() - 1; ++i) { + for (int i = 0; i < specialCaseMap.size() - utf16map.size() + 1; ++i) { int j; for (j = 0; j < utf16map.size(); ++j) { if (specialCaseMap.at(i+j) != utf16map.at(j)) -- cgit v0.12 From 627d5ca9fbfcdc54eca466ee8eae9ac3c9bd9276 Mon Sep 17 00:00:00 2001 From: Ritt Konstantin Date: Wed, 24 Feb 2010 20:13:28 +0100 Subject: generate specialCaseMap as set of human-readable code-sequences Merge-request: 480 Reviewed-by: Thiago Macieira --- util/unicode/main.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/util/unicode/main.cpp b/util/unicode/main.cpp index 4f39e06..4cc2066 100644 --- a/util/unicode/main.cpp +++ b/util/unicode/main.cpp @@ -2077,13 +2077,13 @@ static QByteArray createPropertyInfo() out += "#define CURRENT_VERSION "DATA_VERSION_STR"\n\n"; - out += "static const ushort specialCaseMap[] = {"; + out += "static const ushort specialCaseMap[] = {\n "; for (int i = 0; i < specialCaseMap.size(); ++i) { - if (!(i % 16)) - out += "\n "; out += QByteArray(" 0x") + QByteArray::number(specialCaseMap.at(i), 16); if (i < specialCaseMap.size() - 1) out += ","; + if (!specialCaseMap.at(i)) + out += "\n "; } out += "\n};\n"; out += "#define SPECIAL_CASE_MAX_LEN " + QByteArray::number(specialCaseMaxLen) + "\n\n"; -- cgit v0.12 From ae9f34db6c59c2446513a7ba81da220ac9db38c7 Mon Sep 17 00:00:00 2001 From: Ritt Konstantin Date: Wed, 24 Feb 2010 20:13:30 +0100 Subject: minor clean-ups no changes in behavior in our case `c->cat != QChar::NoCategory` logically equals to `c->name` and the latter expression used in other maps Merge-request: 480 Reviewed-by: Thiago Macieira --- util/unicode/main.cpp | 86 ++++++++++++++++++++++++++------------------------- 1 file changed, 44 insertions(+), 42 deletions(-) diff --git a/util/unicode/main.cpp b/util/unicode/main.cpp index 4cc2066..bbcd286 100644 --- a/util/unicode/main.cpp +++ b/util/unicode/main.cpp @@ -71,6 +71,7 @@ static struct AgeMap { { 0, QChar::Unicode_Unassigned } }; + static const char *grapheme_break_string = " enum GraphemeBreak {\n" " GraphemeBreakOther,\n" @@ -98,7 +99,7 @@ enum GraphemeBreak { GraphemeBreakLVT }; -QHash grapheme_break_map; +static QHash grapheme_break_map; static void initGraphemeBreak() { @@ -125,7 +126,8 @@ static void initGraphemeBreak() } } -const char *word_break_string = + +static const char *word_break_string = " enum WordBreak {\n" " WordBreakOther,\n" " WordBreakFormat,\n" @@ -148,8 +150,7 @@ enum WordBreak { WordBreakExtendNumLet }; - -QHash word_break_map; +static QHash word_break_map; static void initWordBreak() { @@ -204,8 +205,7 @@ enum SentenceBreak { SentenceBreakClose }; - -QHash sentence_break_map; +static QHash sentence_break_map; static void initSentenceBreak() { @@ -234,7 +234,7 @@ static void initSentenceBreak() } -const char *lineBreakClass = +static const char *lineBreakClass = " // see http://www.unicode.org/reports/tr14/tr14-19.html\n" " // we don't use the XX, AI and CB properties and map them to AL instead.\n" " // as we don't support any EBDIC based OS'es, NL is ignored and mapped to AL as well.\n" @@ -249,7 +249,7 @@ const char *lineBreakClass = " };\n\n"; // Keep this one in sync with the code in createPropertyInfo -const char *property_string = +static const char *property_string = " struct Properties {\n" " ushort category : 8; /* 5 needed */\n" " ushort line_break_class : 8; /* 6 needed */\n" @@ -274,7 +274,7 @@ const char *property_string = " Q_CORE_EXPORT const Properties * QT_FASTCALL properties(uint ucs4);\n" " Q_CORE_EXPORT const Properties * QT_FASTCALL properties(ushort ucs2);\n"; -const char *methods = +static const char *methods = " Q_CORE_EXPORT QUnicodeTables::LineBreakClass QT_FASTCALL lineBreakClass(uint ucs4);\n" " inline int lineBreakClass(const QChar &ch)\n" " { return lineBreakClass(ch.unicode()); }\n" @@ -333,8 +333,9 @@ struct PropertyFlags { SentenceBreak sentenceBreak; }; -QList specialCaseMap; -int specialCaseMaxLen = 0; + +static QList specialCaseMap; +static int specialCaseMaxLen = 0; static int appendToSpecialCaseMap(const QList &map) { @@ -442,7 +443,8 @@ enum UniDataFields { UD_TitleCase }; -QHash categoryMap; + +static QHash categoryMap; static void initCategoryMap() { @@ -489,13 +491,14 @@ static void initCategoryMap() { QChar::NoCategory, 0 } }; Cat *c = categories; - while (c->cat != QChar::NoCategory) { + while (c->name) { categoryMap.insert(c->name, c->cat); ++c; } } -QHash directionMap; + +static QHash directionMap; static void initDirectionMap() { @@ -532,7 +535,7 @@ static void initDirectionMap() } -QHash decompositionMap; +static QHash decompositionMap; static void initDecompositionMap() { @@ -567,14 +570,14 @@ static void initDecompositionMap() } -QHash unicodeData; -QList uniqueProperties; +static QHash unicodeData; +static QList uniqueProperties; -QHash decompositionLength; -int highestComposedCharacter = 0; -int numLigatures = 0; -int highestLigature = 0; +static QHash decompositionLength; +static int highestComposedCharacter = 0; +static int numLigatures = 0; +static int highestLigature = 0; struct Ligature { ushort u1; @@ -585,13 +588,13 @@ struct Ligature { bool operator < (const Ligature &l1, const Ligature &l2) { return l1.u1 < l2.u1; } -QHash > ligatureHashes; +static QHash > ligatureHashes; -QHash combiningClassUsage; +static QHash combiningClassUsage; -int maxLowerCaseDiff = 0; -int maxUpperCaseDiff = 0; -int maxTitleCaseDiff = 0; +static int maxLowerCaseDiff = 0; +static int maxUpperCaseDiff = 0; +static int maxTitleCaseDiff = 0; static void readUnicodeData() { @@ -873,22 +876,22 @@ static void readCompositionExclusion() unicodeData.insert(codepoint, d); } - for (int i = 0; i <= LAST_CODEPOINT; ++i) { - UnicodeData data = unicodeData.value(i, UnicodeData(i)); - if (!data.excludedComposition - && data.decompositionType == QChar::Canonical - && data.decomposition.size() > 1) { - Q_ASSERT(data.decomposition.size() == 2); + for (int codepoint = 0; codepoint <= LAST_CODEPOINT; ++codepoint) { + UnicodeData d = unicodeData.value(codepoint, UnicodeData(codepoint)); + if (!d.excludedComposition + && d.decompositionType == QChar::Canonical + && d.decomposition.size() > 1) { + Q_ASSERT(d.decomposition.size() == 2); - uint part1 = data.decomposition.at(0); - uint part2 = data.decomposition.at(1); + uint part1 = d.decomposition.at(0); + uint part2 = d.decomposition.at(1); UnicodeData first = unicodeData.value(part1, UnicodeData(part1)); if (first.p.combiningClass != 0) continue; ++numLigatures; highestLigature = qMax(highestLigature, (int)part1); - Ligature l = {(ushort)part1, (ushort)part2, i}; + Ligature l = {(ushort)part1, (ushort)part2, codepoint}; ligatureHashes[part2].append(l); } } @@ -978,7 +981,7 @@ static void computeUniqueProperties() d.propertyIndex = index; unicodeData.insert(uc, d); } - qDebug(" %d unicode properties found", uniqueProperties.size()); + qDebug(" %d unique unicode properties found", uniqueProperties.size()); } @@ -1120,8 +1123,6 @@ static void readSpecialCasing() for (int i = 0; i < title.size(); ++i) { bool ok; titleMap.append(title.at(i).toInt(&ok, 16)); - if (!ok) - qDebug() << line << title.at(i); Q_ASSERT(ok); } @@ -1157,7 +1158,7 @@ static void readSpecialCasing() } } -int maxCaseFoldDiff = 0; +static int maxCaseFoldDiff = 0; static void readCaseFolding() { @@ -1214,7 +1215,7 @@ static void readCaseFolding() if (foldMap.at(0) != codepoint + ud.p.lowerCaseDiff) qDebug() << hex << codepoint; } else { - Q_ASSERT(false); // we currently don't support full case foldings + qFatal("we currently don't support full case foldings"); // qDebug() << "special" << hex << foldMap; ud.p.caseFoldSpecial = true; ud.p.caseFoldDiff = appendToSpecialCaseMap(foldMap); @@ -1842,7 +1843,8 @@ struct PropertyBlock { PropertyBlock() { index = -1; } int index; QList properties; - bool operator ==(const PropertyBlock &other) { return properties == other.properties; } + bool operator==(const PropertyBlock &other) + { return properties == other.properties; } }; static QByteArray createPropertyInfo() @@ -2448,7 +2450,7 @@ int main(int, char **) initGraphemeBreak(); initWordBreak(); initSentenceBreak(); - + readUnicodeData(); readBidiMirroring(); readArabicShaping(); -- cgit v0.12 From f87056c6e58dd691f15967067c6faac29f912bfd Mon Sep 17 00:00:00 2001 From: Ritt Konstantin Date: Wed, 24 Feb 2010 20:13:32 +0100 Subject: use QHash for age map to be consistent with other maps Merge-request: 480 Reviewed-by: Thiago Macieira --- util/unicode/main.cpp | 55 +++++++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/util/unicode/main.cpp b/util/unicode/main.cpp index bbcd286..2c80e0e 100644 --- a/util/unicode/main.cpp +++ b/util/unicode/main.cpp @@ -55,21 +55,31 @@ #define LAST_CODEPOINT 0x10ffff -static struct AgeMap { - const char *age; - const QChar::UnicodeVersion version; -} ageMap[] = { - { "1.1", QChar::Unicode_1_1 }, - { "2.0", QChar::Unicode_2_0 }, - { "2.1", QChar::Unicode_2_1_2 }, - { "3.0", QChar::Unicode_3_0 }, - { "3.1", QChar::Unicode_3_1 }, - { "3.2", QChar::Unicode_3_2 }, - { "4.0", QChar::Unicode_4_0 }, - { "4.1", QChar::Unicode_4_1 }, - { "5.0", QChar::Unicode_5_0 }, - { 0, QChar::Unicode_Unassigned } -}; +static QHash age_map; + +static void initAgeMap() +{ + struct AgeMap { + const QChar::UnicodeVersion version; + const char *age; + } ageMap[] = { + { QChar::Unicode_1_1, "1.1" }, + { QChar::Unicode_2_0, "2.0" }, + { QChar::Unicode_2_1_2, "2.1" }, + { QChar::Unicode_3_0, "3.0" }, + { QChar::Unicode_3_1, "3.1" }, + { QChar::Unicode_3_2, "3.2" }, + { QChar::Unicode_4_0, "4.0" }, + { QChar::Unicode_4_1, "4.1" }, + { QChar::Unicode_5_0, "5.0" }, + { QChar::Unicode_Unassigned, 0 } + }; + AgeMap *d = ageMap; + while (d->age) { + age_map.insert(d->age, d->version); + ++d; + } +} static const char *grapheme_break_string = @@ -822,18 +832,10 @@ static void readDerivedAge() if (cl.size() == 2) to = cl[1].toInt(&ok, 16); - QChar::UnicodeVersion age = QChar::Unicode_Unassigned; - QByteArray ba = l[1]; - AgeMap *map = ageMap; - while (map->age) { - if (ba == map->age) { - age = map->version; - break; - } - ++map; - } + QChar::UnicodeVersion age = age_map.value(l[1].trimmed(), QChar::Unicode_Unassigned); //qDebug() << hex << from << ".." << to << ba << age; - Q_ASSERT(age != QChar::Unicode_Unassigned); + if (age == QChar::Unicode_Unassigned) + qFatal("unassigned or unhandled age value: %s", l[1].constData()); for (int codepoint = from; codepoint <= to; ++codepoint) { UnicodeData d = unicodeData.value(codepoint, UnicodeData(codepoint)); @@ -2444,6 +2446,7 @@ QByteArray createCasingInfo() int main(int, char **) { + initAgeMap(); initCategoryMap(); initDirectionMap(); initDecompositionMap(); -- cgit v0.12 From 5472420755bf1b450580f838ca3bd2798dc98d82 Mon Sep 17 00:00:00 2001 From: Ritt Konstantin Date: Wed, 24 Feb 2010 20:13:34 +0100 Subject: use QHash for line break map to be consistent with other maps this also improves perfomance a bit Merge-request: 480 Reviewed-by: Thiago Macieira --- util/unicode/main.cpp | 119 +++++++++++++++++++++++++++++++------------------- 1 file changed, 74 insertions(+), 45 deletions(-) diff --git a/util/unicode/main.cpp b/util/unicode/main.cpp index 2c80e0e..917cc5a 100644 --- a/util/unicode/main.cpp +++ b/util/unicode/main.cpp @@ -258,6 +258,74 @@ static const char *lineBreakClass = " LineBreak_SP, LineBreak_CR, LineBreak_LF, LineBreak_BK\n" " };\n\n"; +enum LineBreakClass { + LineBreak_OP, LineBreak_CL, LineBreak_QU, LineBreak_GL, LineBreak_NS, + LineBreak_EX, LineBreak_SY, LineBreak_IS, LineBreak_PR, LineBreak_PO, + LineBreak_NU, LineBreak_AL, LineBreak_ID, LineBreak_IN, LineBreak_HY, + LineBreak_BA, LineBreak_BB, LineBreak_B2, LineBreak_ZW, LineBreak_CM, + LineBreak_WJ, LineBreak_H2, LineBreak_H3, LineBreak_JL, LineBreak_JV, + LineBreak_JT, LineBreak_SA, LineBreak_SG, + LineBreak_SP, LineBreak_CR, LineBreak_LF, LineBreak_BK + + , LineBreak_Unassigned +}; + +static QHash line_break_map; + +static void initLineBreak() +{ + // ### Classes XX and AI are left out and mapped to AL for now; + // ### Class NL is ignored and mapped to AL as well. + struct LineBreakList { + LineBreakClass brk; + const char *name; + } breaks[] = { + { LineBreak_BK, "BK" }, + { LineBreak_CR, "CR" }, + { LineBreak_LF, "LF" }, + { LineBreak_CM, "CM" }, + { LineBreak_AL, "NL" }, + { LineBreak_SG, "SG" }, + { LineBreak_WJ, "WJ" }, + { LineBreak_ZW, "ZW" }, + { LineBreak_GL, "GL" }, + { LineBreak_SP, "SP" }, + { LineBreak_B2, "B2" }, + { LineBreak_BA, "BA" }, + { LineBreak_BB, "BB" }, + { LineBreak_HY, "HY" }, + { LineBreak_AL, "CB" }, // ### + { LineBreak_CL, "CL" }, + { LineBreak_EX, "EX" }, + { LineBreak_IN, "IN" }, + { LineBreak_NS, "NS" }, + { LineBreak_OP, "OP" }, + { LineBreak_QU, "QU" }, + { LineBreak_IS, "IS" }, + { LineBreak_NU, "NU" }, + { LineBreak_PO, "PO" }, + { LineBreak_PR, "PR" }, + { LineBreak_SY, "SY" }, + { LineBreak_AL, "AI" }, + { LineBreak_AL, "AL" }, + { LineBreak_H2, "H2" }, + { LineBreak_H3, "H3" }, + { LineBreak_ID, "ID" }, + { LineBreak_JL, "JL" }, + { LineBreak_JV, "JV" }, + { LineBreak_JT, "JT" }, + { LineBreak_SA, "SA" }, + { LineBreak_AL, "XX" }, + { LineBreak_Unassigned, 0 } + }; + LineBreakList *d = breaks; + while (d->name) { + line_break_map.insert(d->name, d->brk); + ++d; + } +} + + // Keep this one in sync with the code in createPropertyInfo static const char *property_string = " struct Properties {\n" @@ -402,7 +470,7 @@ struct UnicodeData { p.age = QChar::Unicode_Unassigned; p.mirrorDiff = 0; p.digitValue = -1; - p.line_break_class = QUnicodeTables::LineBreak_AL; + p.line_break_class = LineBreak_AL; // XX -> AL p.lowerCaseDiff = 0; p.upperCaseDiff = 0; p.titleCaseDiff = 0; @@ -1022,49 +1090,9 @@ static void readLineBreak() if (cl.size() == 2) to = cl[1].toInt(&ok, 16); - // ### Classes XX and AI are left out and mapped to AL for now - QUnicodeTables::LineBreakClass lb = QUnicodeTables::LineBreak_AL; - QByteArray ba = l[1]; - - if (ba == "AI") lb = QUnicodeTables::LineBreak_AL; - else if (ba == "XX") lb = QUnicodeTables::LineBreak_AL; - else if (ba == "NL") lb = QUnicodeTables::LineBreak_AL; - else if (ba == "OP") lb = QUnicodeTables::LineBreak_OP; - else if (ba == "CL") lb = QUnicodeTables::LineBreak_CL; - else if (ba == "QU") lb = QUnicodeTables::LineBreak_QU; - else if (ba == "GL") lb = QUnicodeTables::LineBreak_GL; - else if (ba == "NS") lb = QUnicodeTables::LineBreak_NS; - else if (ba == "EX") lb = QUnicodeTables::LineBreak_EX; - else if (ba == "SY") lb = QUnicodeTables::LineBreak_SY; - else if (ba == "IS") lb = QUnicodeTables::LineBreak_IS; - else if (ba == "PR") lb = QUnicodeTables::LineBreak_PR; - else if (ba == "PO") lb = QUnicodeTables::LineBreak_PO; - else if (ba == "NU") lb = QUnicodeTables::LineBreak_NU; - else if (ba == "AL") lb = QUnicodeTables::LineBreak_AL; - else if (ba == "ID") lb = QUnicodeTables::LineBreak_ID; - else if (ba == "IN") lb = QUnicodeTables::LineBreak_IN; - else if (ba == "HY") lb = QUnicodeTables::LineBreak_HY; - else if (ba == "BA") lb = QUnicodeTables::LineBreak_BA; - else if (ba == "BB") lb = QUnicodeTables::LineBreak_BB; - else if (ba == "B2") lb = QUnicodeTables::LineBreak_B2; - else if (ba == "ZW") lb = QUnicodeTables::LineBreak_ZW; - else if (ba == "CM") lb = QUnicodeTables::LineBreak_CM; - else if (ba == "SA") lb = QUnicodeTables::LineBreak_SA; - else if (ba == "BK") lb = QUnicodeTables::LineBreak_BK; - else if (ba == "CR") lb = QUnicodeTables::LineBreak_CR; - else if (ba == "LF") lb = QUnicodeTables::LineBreak_LF; - else if (ba == "SG") lb = QUnicodeTables::LineBreak_SG; - else if (ba == "CB") lb = QUnicodeTables::LineBreak_AL; - else if (ba == "SP") lb = QUnicodeTables::LineBreak_SP; - else if (ba == "WJ") lb = QUnicodeTables::LineBreak_WJ; - else if (ba == "H2") lb = QUnicodeTables::LineBreak_H2; - else if (ba == "H3") lb = QUnicodeTables::LineBreak_H3; - else if (ba == "JL") lb = QUnicodeTables::LineBreak_JL; - else if (ba == "JV") lb = QUnicodeTables::LineBreak_JV; - else if (ba == "JT") lb = QUnicodeTables::LineBreak_JT; - else { - qDebug() << "unhandled line break class:" << ba; - } + LineBreakClass lb = line_break_map.value(l[1].trimmed(), LineBreak_Unassigned); + if (lb == LineBreak_Unassigned) + qFatal("unassigned line break class: %s", l[1].constData()); for (int codepoint = from; codepoint <= to; ++codepoint) { UnicodeData d = unicodeData.value(codepoint, UnicodeData(codepoint)); @@ -2453,13 +2481,13 @@ int main(int, char **) initGraphemeBreak(); initWordBreak(); initSentenceBreak(); + initLineBreak(); readUnicodeData(); readBidiMirroring(); readArabicShaping(); readDerivedAge(); readCompositionExclusion(); - readLineBreak(); readSpecialCasing(); readCaseFolding(); // readBlocks(); @@ -2467,6 +2495,7 @@ int main(int, char **) readGraphemeBreak(); readWordBreak(); readSentenceBreak(); + readLineBreak(); computeUniqueProperties(); QByteArray properties = createPropertyInfo(); -- cgit v0.12 From 4fcaacef2450b462f62adb14f44055dff53ec577 Mon Sep 17 00:00:00 2001 From: Ritt Konstantin Date: Wed, 24 Feb 2010 20:13:36 +0100 Subject: avoid using of qunicodetables_p.h in generator we can do that after last changes Merge-request: 480 Reviewed-by: Thiago Macieira --- util/unicode/main.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/util/unicode/main.cpp b/util/unicode/main.cpp index 917cc5a..59617b4 100644 --- a/util/unicode/main.cpp +++ b/util/unicode/main.cpp @@ -45,9 +45,11 @@ #include #include #include -#include #include #include +#if 0 +#include +#endif #define DATA_VERSION_S "5.0" #define DATA_VERSION_STR "QChar::Unicode_5_0" -- cgit v0.12 From 89e974545b9fdf810344553f0e1035fd01d190e4 Mon Sep 17 00:00:00 2001 From: Ritt Konstantin Date: Wed, 24 Feb 2010 20:13:39 +0100 Subject: improve error reporting for unassigned grapheme/word/sentence break classes Merge-request: 480 Reviewed-by: Thiago Macieira --- util/unicode/main.cpp | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/util/unicode/main.cpp b/util/unicode/main.cpp index 59617b4..591845a 100644 --- a/util/unicode/main.cpp +++ b/util/unicode/main.cpp @@ -109,6 +109,8 @@ enum GraphemeBreak { GraphemeBreakT, GraphemeBreakLV, GraphemeBreakLVT + + , GraphemeBreak_Unassigned }; static QHash grapheme_break_map; @@ -129,7 +131,7 @@ static void initGraphemeBreak() { GraphemeBreakT, "T" }, { GraphemeBreakLV, "LV" }, { GraphemeBreakLVT, "LVT" }, - { GraphemeBreakOther, 0 } + { GraphemeBreak_Unassigned, 0 } }; GraphemeBreakList *d = breaks; while (d->name) { @@ -160,6 +162,8 @@ enum WordBreak { WordBreakMidNum, WordBreakNumeric, WordBreakExtendNumLet + + , WordBreak_Unassigned }; static QHash word_break_map; @@ -178,7 +182,7 @@ static void initWordBreak() { WordBreakMidNum, "MidNum" }, { WordBreakNumeric, "Numeric" }, { WordBreakExtendNumLet, "ExtendNumLet" }, - { WordBreakFormat, 0 } + { WordBreak_Unassigned, 0 } }; WordBreakList *d = breaks; while (d->name) { @@ -215,6 +219,8 @@ enum SentenceBreak { SentenceBreakATerm, SentenceBreakSTerm, SentenceBreakClose + + , SentenceBreak_Unassigned }; static QHash sentence_break_map; @@ -236,7 +242,7 @@ static void initSentenceBreak() { SentenceBreakATerm, "ATerm" }, { SentenceBreakSTerm, "STerm" }, { SentenceBreakClose, "Close" }, - { SentenceBreakOther, 0 } + { SentenceBreak_Unassigned, 0 } }; SentenceBreakList *d = breaks; while (d->name) { @@ -1293,7 +1299,9 @@ static void readGraphemeBreak() Q_ASSERT(ok); } - GraphemeBreak brk = grapheme_break_map.value(l[1].trimmed(), GraphemeBreakOther); + GraphemeBreak brk = grapheme_break_map.value(l[1].trimmed(), GraphemeBreak_Unassigned); + if (brk == GraphemeBreak_Unassigned) + qFatal("unassigned grapheme break class: %s", l[1].constData()); for (int codepoint = from; codepoint <= to; ++codepoint) { UnicodeData ud = unicodeData.value(codepoint, UnicodeData(codepoint)); @@ -1340,8 +1348,9 @@ static void readWordBreak() Q_ASSERT(ok); } - WordBreak brk = word_break_map.value(l[1].trimmed(), WordBreakOther); - Q_ASSERT(brk != WordBreakOther); + WordBreak brk = word_break_map.value(l[1].trimmed(), WordBreak_Unassigned); + if (brk == WordBreak_Unassigned) + qFatal("unassigned word break class: %s", l[1].constData()); for (int codepoint = from; codepoint <= to; ++codepoint) { UnicodeData ud = unicodeData.value(codepoint, UnicodeData(codepoint)); @@ -1388,8 +1397,9 @@ static void readSentenceBreak() Q_ASSERT(ok); } - SentenceBreak brk = sentence_break_map.value(l[1].trimmed(), SentenceBreakOther); - Q_ASSERT(brk != SentenceBreakOther); + SentenceBreak brk = sentence_break_map.value(l[1].trimmed(), SentenceBreak_Unassigned); + if (brk == SentenceBreak_Unassigned) + qFatal("unassigned sentence break class: %s", l[1].constData()); for (int codepoint = from; codepoint <= to; ++codepoint) { UnicodeData ud = unicodeData.value(codepoint, UnicodeData(codepoint)); -- cgit v0.12 From 873883e83943918c344122f4da4291e8e71f0b5f Mon Sep 17 00:00:00 2001 From: Ritt Konstantin Date: Wed, 24 Feb 2010 20:13:41 +0100 Subject: check if string to int conversions were done w/o errors Merge-request: 480 Reviewed-by: Thiago Macieira --- util/unicode/main.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/util/unicode/main.cpp b/util/unicode/main.cpp index 591845a..a7553e8 100644 --- a/util/unicode/main.cpp +++ b/util/unicode/main.cpp @@ -705,6 +705,7 @@ static void readUnicodeData() QList properties = line.split(';'); bool ok; int codepoint = properties[UD_Value].toInt(&ok, 16); + Q_ASSERT(ok); int lastCodepoint = codepoint; QByteArray name = properties[UD_Name]; @@ -714,6 +715,7 @@ static void readUnicodeData() f.readLine(nextLine.data(), 1024); QList properties = nextLine.split(';'); lastCodepoint = properties[UD_Value].toInt(&ok, 16); + Q_ASSERT(ok); } UnicodeData data(codepoint); @@ -778,8 +780,10 @@ static void readUnicodeData() } else { data.decompositionType = QChar::Canonical; } - for (int i = 0; i < d.size(); ++i) + for (int i = 0; i < d.size(); ++i) { data.decomposition.append(d[i].toInt(&ok, 16)); + Q_ASSERT(ok); + } if (!decompositionLength.contains(data.decomposition.size())) decompositionLength[data.decomposition.size()] = 1; else @@ -821,7 +825,9 @@ static void readBidiMirroring() bool ok; int codepoint = pair[0].toInt(&ok, 16); + Q_ASSERT(ok); int mirror = pair[1].toInt(&ok, 16); + Q_ASSERT(ok); UnicodeData d = unicodeData.value(codepoint, UnicodeData(codepoint)); d.mirroredChar = mirror; @@ -858,6 +864,8 @@ static void readArabicShaping() bool ok; int codepoint = shaping[0].toInt(&ok, 16); + Q_ASSERT(ok); + QChar::Joining j = QChar::OtherJoining; QByteArray shape = shaping[2].trimmed(); if (shape == "R") @@ -904,9 +912,12 @@ static void readDerivedAge() bool ok; int from = cl[0].toInt(&ok, 16); + Q_ASSERT(ok); int to = from; - if (cl.size() == 2) + if (cl.size() == 2) { to = cl[1].toInt(&ok, 16); + Q_ASSERT(ok); + } QChar::UnicodeVersion age = age_map.value(l[1].trimmed(), QChar::Unicode_Unassigned); //qDebug() << hex << from << ".." << to << ba << age; @@ -948,6 +959,7 @@ static void readCompositionExclusion() bool ok; int codepoint = line.toInt(&ok, 16); + Q_ASSERT(ok); UnicodeData d = unicodeData.value(codepoint, UnicodeData(codepoint)); d.excludedComposition = true; @@ -1094,9 +1106,12 @@ static void readLineBreak() bool ok; int from = cl[0].toInt(&ok, 16); + Q_ASSERT(ok); int to = from; - if (cl.size() == 2) + if (cl.size() == 2) { to = cl[1].toInt(&ok, 16); + Q_ASSERT(ok); + } LineBreakClass lb = line_break_map.value(l[1].trimmed(), LineBreak_Unassigned); if (lb == LineBreak_Unassigned) -- cgit v0.12 From 455fac38c5a8ec9ef5c531ec7860a17b05ccfd07 Mon Sep 17 00:00:00 2001 From: Ritt Konstantin Date: Wed, 24 Feb 2010 20:13:43 +0100 Subject: fix incorect condition Merge-request: 480 Reviewed-by: Thiago Macieira --- util/unicode/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/unicode/main.cpp b/util/unicode/main.cpp index a7553e8..86da8a4 100644 --- a/util/unicode/main.cpp +++ b/util/unicode/main.cpp @@ -1259,7 +1259,7 @@ static void readCaseFolding() UnicodeData ud = unicodeData.value(codepoint, UnicodeData(codepoint)); if (foldMap.size() == 1) { ud.p.caseFoldDiff = foldMap.at(0) - codepoint; - maxCaseFoldDiff = qMax(maxCaseFoldDiff, ud.p.caseFoldDiff); + maxCaseFoldDiff = qMax(maxCaseFoldDiff, qAbs(ud.p.caseFoldDiff)); if (codepoint > 0xffff) { // if the condition below doesn't hold anymore we need to modify our case folding code //qDebug() << codepoint << QChar::highSurrogate(codepoint) << QChar::highSurrogate(foldMap.at(0)); -- cgit v0.12 From 5cea1e11166998fc5862a782af4aa502f2b7be6a Mon Sep 17 00:00:00 2001 From: Ritt Konstantin Date: Wed, 24 Feb 2010 20:13:45 +0100 Subject: improve error reporting warn on upperCaseDiff/lowerCaseDiff/titleCaseDiff/caseFoldDiff 's value exceeds signed short bounds Merge-request: 480 Reviewed-by: Thiago Macieira --- util/unicode/main.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/util/unicode/main.cpp b/util/unicode/main.cpp index 86da8a4..84b50e1 100644 --- a/util/unicode/main.cpp +++ b/util/unicode/main.cpp @@ -732,6 +732,8 @@ static void readUnicodeData() if (!properties[UD_UpperCase].isEmpty()) { int upperCase = properties[UD_UpperCase].toInt(&ok, 16); Q_ASSERT(ok); + if (qAbs(upperCase - codepoint) >= (1<<14)) + qWarning() << "upperCaseDiff exceeded (" << hex << codepoint << "->" << upperCase << ")"; data.p.upperCaseDiff = upperCase - codepoint; maxUpperCaseDiff = qMax(maxUpperCaseDiff, qAbs(data.p.upperCaseDiff)); if (codepoint > 0xffff) { @@ -743,6 +745,8 @@ static void readUnicodeData() if (!properties[UD_LowerCase].isEmpty()) { int lowerCase = properties[UD_LowerCase].toInt(&ok, 16); Q_ASSERT(ok); + if (qAbs(lowerCase - codepoint) >= (1<<14)) + qWarning() << "lowerCaseDiff exceeded (" << hex << codepoint << "->" << lowerCase << ")"; data.p.lowerCaseDiff = lowerCase - codepoint; maxLowerCaseDiff = qMax(maxLowerCaseDiff, qAbs(data.p.lowerCaseDiff)); if (codepoint > 0xffff) { @@ -757,6 +761,8 @@ static void readUnicodeData() if (!properties[UD_TitleCase].isEmpty()) { int titleCase = properties[UD_TitleCase].toInt(&ok, 16); Q_ASSERT(ok); + if (qAbs(titleCase - codepoint) >= (1<<14)) + qWarning() << "titleCaseDiff exceeded (" << hex << codepoint << "->" << titleCase << ")"; data.p.titleCaseDiff = titleCase - codepoint; maxTitleCaseDiff = qMax(maxTitleCaseDiff, qAbs(data.p.titleCaseDiff)); if (codepoint > 0xffff) { @@ -1258,6 +1264,8 @@ static void readCaseFolding() UnicodeData ud = unicodeData.value(codepoint, UnicodeData(codepoint)); if (foldMap.size() == 1) { + if (qAbs(foldMap.at(0) - codepoint) >= (1<<14)) + qWarning() << "caseFoldDiff exceeded (" << hex << codepoint << "->" << foldMap.at(0) << ")"; ud.p.caseFoldDiff = foldMap.at(0) - codepoint; maxCaseFoldDiff = qMax(maxCaseFoldDiff, qAbs(ud.p.caseFoldDiff)); if (codepoint > 0xffff) { -- cgit v0.12 From 76eb4f454073a30ef62d8bb85862589a13415605 Mon Sep 17 00:00:00 2001 From: Ritt Konstantin Date: Wed, 24 Feb 2010 20:13:47 +0100 Subject: improve error reporting a bit more Merge-request: 480 Reviewed-by: Thiago Macieira --- util/unicode/main.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/util/unicode/main.cpp b/util/unicode/main.cpp index 84b50e1..368cd83 100644 --- a/util/unicode/main.cpp +++ b/util/unicode/main.cpp @@ -706,6 +706,7 @@ static void readUnicodeData() bool ok; int codepoint = properties[UD_Value].toInt(&ok, 16); Q_ASSERT(ok); + Q_ASSERT(codepoint <= LAST_CODEPOINT); int lastCodepoint = codepoint; QByteArray name = properties[UD_Name]; @@ -714,12 +715,16 @@ static void readUnicodeData() nextLine.resize(1024); f.readLine(nextLine.data(), 1024); QList properties = nextLine.split(';'); + Q_ASSERT(properties[UD_Name].startsWith('<') && properties[UD_Name].contains("Last")); lastCodepoint = properties[UD_Value].toInt(&ok, 16); Q_ASSERT(ok); + Q_ASSERT(lastCodepoint <= LAST_CODEPOINT); } UnicodeData data(codepoint); data.p.category = categoryMap.value(properties[UD_Category], QChar::NoCategory); + if (data.p.category == QChar::NoCategory) + qFatal("unassigned char category: %s", properties[UD_Category].constData()); data.p.combiningClass = properties[UD_CombiningClass].toInt(); if (!combiningClassUsage.contains(data.p.combiningClass)) @@ -781,7 +786,9 @@ static void readUnicodeData() highestComposedCharacter = qMax(highestComposedCharacter, codepoint); QList d = decomposition.split(' '); if (d[0].contains('<')) { - data.decompositionType = decompositionMap.value(d[0], QChar::Canonical); + data.decompositionType = decompositionMap.value(d[0], QChar::NoDecomposition); + if (data.decompositionType == QChar::NoDecomposition) + qFatal("unassigned decomposition type: %s", d[0].constData()); d.takeFirst(); } else { data.decompositionType = QChar::Canonical; -- cgit v0.12 From 5c3c63768ab7d042c62d35f3f254d9723c87c83e Mon Sep 17 00:00:00 2001 From: Ritt Konstantin Date: Wed, 24 Feb 2010 20:13:48 +0100 Subject: prefer DerivedNormalizationProps.txt over CompositionExclusions.txt 1) http://www.unicode.org/reports/tr44/ :2.1 > Implementations should simply use the derived properties, > and should not try to rederive them from lists of simple > properties and collections of rules, because of the chances > for error and divergence when doing so. 2) DerivedNormalizationProps.txt file also provides additional info that can be used for Normalization Form Quick Check algorithm implementation some later Note: this commit *must not* change anything in the (re)generated data; any change in generated data will point to the data inconsistency between CompositionExclusions.txt, DerivedNormalizationProps.txt and UnicodeData.txt files Merge-request: 480 Reviewed-by: Thiago Macieira --- util/unicode/data/CompositionExclusions.txt | 197 ---------------------------- util/unicode/main.cpp | 39 ++++-- 2 files changed, 28 insertions(+), 208 deletions(-) delete mode 100644 util/unicode/data/CompositionExclusions.txt diff --git a/util/unicode/data/CompositionExclusions.txt b/util/unicode/data/CompositionExclusions.txt deleted file mode 100644 index 8a9b7be..0000000 --- a/util/unicode/data/CompositionExclusions.txt +++ /dev/null @@ -1,197 +0,0 @@ -# CompositionExclusions-5.0.0.txt -# Date: 2006-05-23, 12:42:00 PST [KW] -# -# This file lists the characters for the Composition Exclusion Table -# defined in UAX #15, Unicode Normalization Forms. -# -# This file is a normative contributory data file in the -# Unicode Character Database. -# -# Copyright (c) 1991-2006 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# -# For more information, see -# http://www.unicode.org/unicode/reports/tr15/#Primary Exclusion List Table -# -# For a full derivation of composition exclusions, see the derived property -# Full_Composition_Exclusion in DerivedNormalizationProps.txt -# - -# ================================================ -# (1) Script Specifics -# -# This list of characters cannot be derived from the UnicodeData.txt file. -# ================================================ - -0958 # DEVANAGARI LETTER QA -0959 # DEVANAGARI LETTER KHHA -095A # DEVANAGARI LETTER GHHA -095B # DEVANAGARI LETTER ZA -095C # DEVANAGARI LETTER DDDHA -095D # DEVANAGARI LETTER RHA -095E # DEVANAGARI LETTER FA -095F # DEVANAGARI LETTER YYA -09DC # BENGALI LETTER RRA -09DD # BENGALI LETTER RHA -09DF # BENGALI LETTER YYA -0A33 # GURMUKHI LETTER LLA -0A36 # GURMUKHI LETTER SHA -0A59 # GURMUKHI LETTER KHHA -0A5A # GURMUKHI LETTER GHHA -0A5B # GURMUKHI LETTER ZA -0A5E # GURMUKHI LETTER FA -0B5C # ORIYA LETTER RRA -0B5D # ORIYA LETTER RHA -0F43 # TIBETAN LETTER GHA -0F4D # TIBETAN LETTER DDHA -0F52 # TIBETAN LETTER DHA -0F57 # TIBETAN LETTER BHA -0F5C # TIBETAN LETTER DZHA -0F69 # TIBETAN LETTER KSSA -0F76 # TIBETAN VOWEL SIGN VOCALIC R -0F78 # TIBETAN VOWEL SIGN VOCALIC L -0F93 # TIBETAN SUBJOINED LETTER GHA -0F9D # TIBETAN SUBJOINED LETTER DDHA -0FA2 # TIBETAN SUBJOINED LETTER DHA -0FA7 # TIBETAN SUBJOINED LETTER BHA -0FAC # TIBETAN SUBJOINED LETTER DZHA -0FB9 # TIBETAN SUBJOINED LETTER KSSA -FB1D # HEBREW LETTER YOD WITH HIRIQ -FB1F # HEBREW LIGATURE YIDDISH YOD YOD PATAH -FB2A # HEBREW LETTER SHIN WITH SHIN DOT -FB2B # HEBREW LETTER SHIN WITH SIN DOT -FB2C # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT -FB2D # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT -FB2E # HEBREW LETTER ALEF WITH PATAH -FB2F # HEBREW LETTER ALEF WITH QAMATS -FB30 # HEBREW LETTER ALEF WITH MAPIQ -FB31 # HEBREW LETTER BET WITH DAGESH -FB32 # HEBREW LETTER GIMEL WITH DAGESH -FB33 # HEBREW LETTER DALET WITH DAGESH -FB34 # HEBREW LETTER HE WITH MAPIQ -FB35 # HEBREW LETTER VAV WITH DAGESH -FB36 # HEBREW LETTER ZAYIN WITH DAGESH -FB38 # HEBREW LETTER TET WITH DAGESH -FB39 # HEBREW LETTER YOD WITH DAGESH -FB3A # HEBREW LETTER FINAL KAF WITH DAGESH -FB3B # HEBREW LETTER KAF WITH DAGESH -FB3C # HEBREW LETTER LAMED WITH DAGESH -FB3E # HEBREW LETTER MEM WITH DAGESH -FB40 # HEBREW LETTER NUN WITH DAGESH -FB41 # HEBREW LETTER SAMEKH WITH DAGESH -FB43 # HEBREW LETTER FINAL PE WITH DAGESH -FB44 # HEBREW LETTER PE WITH DAGESH -FB46 # HEBREW LETTER TSADI WITH DAGESH -FB47 # HEBREW LETTER QOF WITH DAGESH -FB48 # HEBREW LETTER RESH WITH DAGESH -FB49 # HEBREW LETTER SHIN WITH DAGESH -FB4A # HEBREW LETTER TAV WITH DAGESH -FB4B # HEBREW LETTER VAV WITH HOLAM -FB4C # HEBREW LETTER BET WITH RAFE -FB4D # HEBREW LETTER KAF WITH RAFE -FB4E # HEBREW LETTER PE WITH RAFE - -# Total code points: 67 - -# ================================================ -# (2) Post Composition Version precomposed characters -# -# These characters cannot be derived solely from the UnicodeData.txt file -# in this version of Unicode. -# -# Note that characters added to the standard after the -# Composition Version and which have canonical decomposition mappings -# are not automatically added to this list of Post Composition -# Version precomposed characters. -# ================================================ - -2ADC # FORKING -1D15E # MUSICAL SYMBOL HALF NOTE -1D15F # MUSICAL SYMBOL QUARTER NOTE -1D160 # MUSICAL SYMBOL EIGHTH NOTE -1D161 # MUSICAL SYMBOL SIXTEENTH NOTE -1D162 # MUSICAL SYMBOL THIRTY-SECOND NOTE -1D163 # MUSICAL SYMBOL SIXTY-FOURTH NOTE -1D164 # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE -1D1BB # MUSICAL SYMBOL MINIMA -1D1BC # MUSICAL SYMBOL MINIMA BLACK -1D1BD # MUSICAL SYMBOL SEMIMINIMA WHITE -1D1BE # MUSICAL SYMBOL SEMIMINIMA BLACK -1D1BF # MUSICAL SYMBOL FUSA WHITE -1D1C0 # MUSICAL SYMBOL FUSA BLACK - -# Total code points: 14 - -# ================================================ -# (3) Singleton Decompositions -# -# These characters can be derived from the UnicodeData.txt file -# by including all characters whose canonical decomposition -# consists of a single character. -# -# These characters are simply quoted here for reference. -# See also Full_Composition_Exclusion in DerivedNormalizationProps.txt -# ================================================ - -# 0340..0341 [2] COMBINING GRAVE TONE MARK..COMBINING ACUTE TONE MARK -# 0343 COMBINING GREEK KORONIS -# 0374 GREEK NUMERAL SIGN -# 037E GREEK QUESTION MARK -# 0387 GREEK ANO TELEIA -# 1F71 GREEK SMALL LETTER ALPHA WITH OXIA -# 1F73 GREEK SMALL LETTER EPSILON WITH OXIA -# 1F75 GREEK SMALL LETTER ETA WITH OXIA -# 1F77 GREEK SMALL LETTER IOTA WITH OXIA -# 1F79 GREEK SMALL LETTER OMICRON WITH OXIA -# 1F7B GREEK SMALL LETTER UPSILON WITH OXIA -# 1F7D GREEK SMALL LETTER OMEGA WITH OXIA -# 1FBB GREEK CAPITAL LETTER ALPHA WITH OXIA -# 1FBE GREEK PROSGEGRAMMENI -# 1FC9 GREEK CAPITAL LETTER EPSILON WITH OXIA -# 1FCB GREEK CAPITAL LETTER ETA WITH OXIA -# 1FD3 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA -# 1FDB GREEK CAPITAL LETTER IOTA WITH OXIA -# 1FE3 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA -# 1FEB GREEK CAPITAL LETTER UPSILON WITH OXIA -# 1FEE..1FEF [2] GREEK DIALYTIKA AND OXIA..GREEK VARIA -# 1FF9 GREEK CAPITAL LETTER OMICRON WITH OXIA -# 1FFB GREEK CAPITAL LETTER OMEGA WITH OXIA -# 1FFD GREEK OXIA -# 2000..2001 [2] EN QUAD..EM QUAD -# 2126 OHM SIGN -# 212A..212B [2] KELVIN SIGN..ANGSTROM SIGN -# 2329 LEFT-POINTING ANGLE BRACKET -# 232A RIGHT-POINTING ANGLE BRACKET -# F900..FA0D [270] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA0D -# FA10 CJK COMPATIBILITY IDEOGRAPH-FA10 -# FA12 CJK COMPATIBILITY IDEOGRAPH-FA12 -# FA15..FA1E [10] CJK COMPATIBILITY IDEOGRAPH-FA15..CJK COMPATIBILITY IDEOGRAPH-FA1E -# FA20 CJK COMPATIBILITY IDEOGRAPH-FA20 -# FA22 CJK COMPATIBILITY IDEOGRAPH-FA22 -# FA25..FA26 [2] CJK COMPATIBILITY IDEOGRAPH-FA25..CJK COMPATIBILITY IDEOGRAPH-FA26 -# FA2A..FA2D [4] CJK COMPATIBILITY IDEOGRAPH-FA2A..CJK COMPATIBILITY IDEOGRAPH-FA2D -# FA30..FA6A [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A -# FA70..FAD9 [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 -# 2F800..2FA1D [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D - -# Total code points: 924 - -# ================================================ -# (4) Non-Starter Decompositions -# -# These characters can be derived from the UnicodeData file -# by including all characters whose canonical decomposition consists -# of a sequence of characters, the first of which has a non-zero -# combining class. -# -# These characters are simply quoted here for reference. -# See also Full_Composition_Exclusion in DerivedNormalizationProps.txt -# ================================================ - -# 0344 COMBINING GREEK DIALYTIKA TONOS -# 0F73 TIBETAN VOWEL SIGN II -# 0F75 TIBETAN VOWEL SIGN UU -# 0F81 TIBETAN VOWEL SIGN REVERSED II - -# Total code points: 4 - diff --git a/util/unicode/main.cpp b/util/unicode/main.cpp index 368cd83..c5d04c0 100644 --- a/util/unicode/main.cpp +++ b/util/unicode/main.cpp @@ -946,11 +946,11 @@ static void readDerivedAge() } -static void readCompositionExclusion() +static void readDerivedNormalizationProps() { - QFile f("data/CompositionExclusions.txt"); + QFile f("data/DerivedNormalizationProps.txt"); if (!f.exists()) - qFatal("Couldn't find CompositionExclusions.txt"); + qFatal("Couldn't find DerivedNormalizationProps.txt"); f.open(QFile::ReadOnly); @@ -963,20 +963,36 @@ static void readCompositionExclusion() int comment = line.indexOf('#'); if (comment >= 0) line = line.left(comment); - line.replace(" ", ""); - if (line.isEmpty()) + if (line.trimmed().isEmpty()) continue; - Q_ASSERT(!line.contains("..")); + QList l = line.split(';'); + Q_ASSERT(l.size() == 2); + + QByteArray propName = l[1].trimmed(); + if (propName != "Full_Composition_Exclusion") + // ### + continue; + + QByteArray codes = l[0].trimmed(); + codes.replace("..", "."); + QList cl = codes.split('.'); bool ok; - int codepoint = line.toInt(&ok, 16); + int from = cl[0].toInt(&ok, 16); Q_ASSERT(ok); + int to = from; + if (cl.size() == 2) { + to = cl[1].toInt(&ok, 16); + Q_ASSERT(ok); + } - UnicodeData d = unicodeData.value(codepoint, UnicodeData(codepoint)); - d.excludedComposition = true; - unicodeData.insert(codepoint, d); + for (int codepoint = from; codepoint <= to; ++codepoint) { + UnicodeData d = unicodeData.value(codepoint, UnicodeData(codepoint)); + d.excludedComposition = true; + unicodeData.insert(codepoint, d); + } } for (int codepoint = 0; codepoint <= LAST_CODEPOINT; ++codepoint) { @@ -1000,6 +1016,7 @@ static void readCompositionExclusion() } } + struct NormalizationCorrection { uint codepoint; uint mapped; @@ -2529,7 +2546,7 @@ int main(int, char **) readBidiMirroring(); readArabicShaping(); readDerivedAge(); - readCompositionExclusion(); + readDerivedNormalizationProps(); readSpecialCasing(); readCaseFolding(); // readBlocks(); -- cgit v0.12 From b4466fdf5c1d982f3ac740ea01fe77ac3d9ff8e5 Mon Sep 17 00:00:00 2001 From: Ritt Konstantin Date: Wed, 24 Feb 2010 20:13:50 +0100 Subject: finish last commit don't skip non-starters in composition exclusions code; warn & exit instead Merge-request: 480 Reviewed-by: Thiago Macieira --- util/unicode/main.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/util/unicode/main.cpp b/util/unicode/main.cpp index c5d04c0..5a2f45e 100644 --- a/util/unicode/main.cpp +++ b/util/unicode/main.cpp @@ -1004,9 +1004,10 @@ static void readDerivedNormalizationProps() uint part1 = d.decomposition.at(0); uint part2 = d.decomposition.at(1); - UnicodeData first = unicodeData.value(part1, UnicodeData(part1)); - if (first.p.combiningClass != 0) - continue; + + // all non-starters are listed in DerivedNormalizationProps.txt + // and already excluded from composition + Q_ASSERT(unicodeData.value(part1, UnicodeData(part1)).p.combiningClass == 0); ++numLigatures; highestLigature = qMax(highestLigature, (int)part1); -- cgit v0.12 From 05260bc05647b77da090e3d64ca38bbdb1533c58 Mon Sep 17 00:00:00 2001 From: Ritt Konstantin Date: Wed, 24 Feb 2010 20:13:52 +0100 Subject: qchar.cpp: fix identation no actual changes Merge-request: 480 Reviewed-by: Thiago Macieira --- src/corelib/tools/qchar.cpp | 243 ++++++++++++++++++++++---------------------- 1 file changed, 123 insertions(+), 120 deletions(-) diff --git a/src/corelib/tools/qchar.cpp b/src/corelib/tools/qchar.cpp index 08cb863..3d55a58 100644 --- a/src/corelib/tools/qchar.cpp +++ b/src/corelib/tools/qchar.cpp @@ -42,10 +42,10 @@ // Don't define it while compiling this module, or USERS of Qt will // not be able to link. #ifdef QT_NO_CAST_FROM_ASCII -#undef QT_NO_CAST_FROM_ASCII +# undef QT_NO_CAST_FROM_ASCII #endif #ifdef QT_NO_CAST_TO_ASCII -#undef QT_NO_CAST_TO_ASCII +# undef QT_NO_CAST_TO_ASCII #endif #include "qchar.h" #include "qdatastream.h" @@ -60,14 +60,15 @@ QT_BEGIN_NAMESPACE #define LAST_UNICODE_CHAR 0x10ffff #ifndef QT_NO_CODEC_FOR_C_STRINGS -#ifdef QT_NO_TEXTCODEC -#define QT_NO_CODEC_FOR_C_STRINGS -#endif +# ifdef QT_NO_TEXTCODEC +# define QT_NO_CODEC_FOR_C_STRINGS +# endif #endif #define FLAG(x) (1 << (x)) -/*! \class QLatin1Char +/*! + \class QLatin1Char \brief The QLatin1Char class provides an 8-bit ASCII/Latin-1 character. \ingroup string-processing @@ -550,7 +551,7 @@ bool QChar::isSpace() const /*! Returns true if the character is a mark (Mark_* categories); otherwise returns false. - + See QChar::Category for more information regarding marks. */ bool QChar::isMark() const @@ -647,45 +648,44 @@ bool QChar::isSymbol() const } /*! - \fn bool QChar::isHighSurrogate() const + \fn bool QChar::isHighSurrogate() const - Returns true if the QChar is the high part of a utf16 surrogate - (ie. if its code point is between 0xd800 and 0xdbff). + Returns true if the QChar is the high part of a utf16 surrogate + (ie. if its code point is between 0xd800 and 0xdbff). */ /*! - \fn bool QChar::isLowSurrogate() const + \fn bool QChar::isLowSurrogate() const - Returns true if the QChar is the low part of a utf16 surrogate - (ie. if its code point is between 0xdc00 and 0xdfff). + Returns true if the QChar is the low part of a utf16 surrogate + (ie. if its code point is between 0xdc00 and 0xdfff). */ /*! - \fn static uint QChar::surrogateToUcs4(ushort high, ushort low) + \fn static uint QChar::surrogateToUcs4(ushort high, ushort low) - Converts a UTF16 surrogate pair with the given \a high and \a low values - to its UCS-4 code point. + Converts a UTF16 surrogate pair with the given \a high and \a low values + to its UCS-4 code point. */ /*! - \fn static uint QChar::surrogateToUcs4(QChar high, QChar low) + \fn static uint QChar::surrogateToUcs4(QChar high, QChar low) - Converts a utf16 surrogate pair (\a high, \a low) to its ucs4 code - point. + Converts a utf16 surrogate pair (\a high, \a low) to its ucs4 code point. */ /*! - \fn static ushort QChar::highSurrogate(uint ucs4) + \fn static ushort QChar::highSurrogate(uint ucs4) - Returns the high surrogate value of a ucs4 code point. - The returned result is undefined if \a ucs4 is smaller than 0x10000. + Returns the high surrogate value of a ucs4 code point. + The returned result is undefined if \a ucs4 is smaller than 0x10000. */ /*! - \fn static ushort QChar::lowSurrogate(uint ucs4) + \fn static ushort QChar::lowSurrogate(uint ucs4) - Returns the low surrogate value of a ucs4 code point. - The returned result is undefined if \a ucs4 is smaller than 0x10000. + Returns the low surrogate value of a ucs4 code point. + The returned result is undefined if \a ucs4 is smaller than 0x10000. */ /*! @@ -727,11 +727,11 @@ QChar::Category QChar::category() const return (QChar::Category) qGetProp(ucs)->category; } -/*! +/*! \overload \since 4.3 Returns the category of the UCS-4-encoded character specified by \a ucs4. - */ +*/ QChar::Category QChar::category(uint ucs4) { if (ucs4 > LAST_UNICODE_CHAR) @@ -739,10 +739,10 @@ QChar::Category QChar::category(uint ucs4) return (QChar::Category) qGetProp(ucs4)->category; } -/*! +/*! \overload Returns the category of the UCS-2-encoded character specified by \a ucs2. - */ +*/ QChar::Category QChar::category(ushort ucs2) { return (QChar::Category) qGetProp(ucs2)->category; @@ -757,10 +757,10 @@ QChar::Direction QChar::direction() const return (QChar::Direction) qGetProp(ucs)->direction; } -/*! -\overload -Returns the direction of the UCS-4-encoded character specified by \a ucs4. - */ +/*! + \overload + Returns the direction of the UCS-4-encoded character specified by \a ucs4. +*/ QChar::Direction QChar::direction(uint ucs4) { if (ucs4 > LAST_UNICODE_CHAR) @@ -768,10 +768,10 @@ QChar::Direction QChar::direction(uint ucs4) return (QChar::Direction) qGetProp(ucs4)->direction; } -/*! -\overload -Returns the direction of the UCS-2-encoded character specified by \a ucs2. - */ +/*! + \overload + Returns the direction of the UCS-2-encoded character specified by \a ucs2. +*/ QChar::Direction QChar::direction(ushort ucs2) { return (QChar::Direction) qGetProp(ucs2)->direction; @@ -786,12 +786,12 @@ QChar::Joining QChar::joining() const return (QChar::Joining) qGetProp(ucs)->joining; } -/*! -\overload -Returns information about the joining properties of the UCS-4-encoded -character specified by \a ucs4 (needed for certain languages such as -Arabic). - */ +/*! + \overload + Returns information about the joining properties of the UCS-4-encoded + character specified by \a ucs4 (needed for certain languages such as + Arabic). +*/ QChar::Joining QChar::joining(uint ucs4) { if (ucs4 > LAST_UNICODE_CHAR) @@ -799,12 +799,12 @@ QChar::Joining QChar::joining(uint ucs4) return (QChar::Joining) qGetProp(ucs4)->joining; } -/*! -\overload -Returns information about the joining properties of the UCS-2-encoded -character specified by \a ucs2 (needed for certain languages such as -Arabic). - */ +/*! + \overload + Returns information about the joining properties of the UCS-2-encoded + character specified by \a ucs2 (needed for certain languages such as + Arabic). +*/ QChar::Joining QChar::joining(ushort ucs2) { return (QChar::Joining) qGetProp(ucs2)->joining; @@ -863,12 +863,13 @@ QChar QChar::mirroredChar() const return ucs + qGetProp(ucs)->mirrorDiff; } -/*! \overload -Returns the mirrored character if the UCS-4-encoded character specified -by \a ucs4 is a mirrored character; otherwise returns the character itself. +/*! + \overload + Returns the mirrored character if the UCS-4-encoded character specified + by \a ucs4 is a mirrored character; otherwise returns the character itself. -\sa hasMirrored() - */ + \sa hasMirrored() +*/ uint QChar::mirroredChar(uint ucs4) { if (ucs4 > LAST_UNICODE_CHAR) @@ -876,13 +877,13 @@ uint QChar::mirroredChar(uint ucs4) return ucs4 + qGetProp(ucs4)->mirrorDiff; } -/*! -\overload -Returns the mirrored character if the UCS-2-encoded character specified -by \a ucs2 is a mirrored character; otherwise returns the character itself. +/*! + \overload + Returns the mirrored character if the UCS-2-encoded character specified + by \a ucs2 is a mirrored character; otherwise returns the character itself. -\sa hasMirrored() - */ + \sa hasMirrored() +*/ ushort QChar::mirroredChar(ushort ucs2) { return ucs2 + qGetProp(ucs2)->mirrorDiff; @@ -936,11 +937,11 @@ QString QChar::decomposition() const return decomposition(ucs); } -/*! -\overload -Decomposes the UCS-4-encoded character specified by \a ucs4 into its -constituent parts. Returns an empty string if no decomposition exists. - */ +/*! + \overload + Decomposes the UCS-4-encoded character specified by \a ucs4 into its + constituent parts. Returns an empty string if no decomposition exists. +*/ QString QChar::decomposition(uint ucs4) { unsigned short buffer[3]; @@ -959,11 +960,11 @@ QChar::Decomposition QChar::decompositionTag() const return decompositionTag(ucs); } -/*! -\overload -Returns the tag defining the composition of the UCS-4-encoded character -specified by \a ucs4. Returns QChar::Single if no decomposition exists. - */ +/*! + \overload + Returns the tag defining the composition of the UCS-4-encoded character + specified by \a ucs4. Returns QChar::Single if no decomposition exists. +*/ QChar::Decomposition QChar::decompositionTag(uint ucs4) { if (ucs4 > LAST_UNICODE_CHAR) @@ -987,10 +988,11 @@ unsigned char QChar::combiningClass() const return (unsigned char) qGetProp(ucs)->combiningClass; } -/*! \overload -Returns the combining class for the UCS-4-encoded character specified by -\a ucs4, as defined in the Unicode standard. - */ +/*! + \overload + Returns the combining class for the UCS-4-encoded character specified by + \a ucs4, as defined in the Unicode standard. +*/ unsigned char QChar::combiningClass(uint ucs4) { if (ucs4 > LAST_UNICODE_CHAR) @@ -998,16 +1000,16 @@ unsigned char QChar::combiningClass(uint ucs4) return (unsigned char) qGetProp(ucs4)->combiningClass; } -/*! \overload -Returns the combining class for the UCS-2-encoded character specified by -\a ucs2, as defined in the Unicode standard. - */ +/*! + \overload + Returns the combining class for the UCS-2-encoded character specified by + \a ucs2, as defined in the Unicode standard. +*/ unsigned char QChar::combiningClass(ushort ucs2) { return (unsigned char) qGetProp(ucs2)->combiningClass; } - /*! Returns the Unicode version that introduced this character. */ @@ -1016,10 +1018,11 @@ QChar::UnicodeVersion QChar::unicodeVersion() const return (QChar::UnicodeVersion) qGetProp(ucs)->unicodeVersion; } -/*! \overload -Returns the Unicode version that introduced the character specified in -its UCS-4-encoded form as \a ucs4. - */ +/*! + \overload + Returns the Unicode version that introduced the character specified in + its UCS-4-encoded form as \a ucs4. +*/ QChar::UnicodeVersion QChar::unicodeVersion(uint ucs4) { if (ucs4 > LAST_UNICODE_CHAR) @@ -1027,10 +1030,11 @@ QChar::UnicodeVersion QChar::unicodeVersion(uint ucs4) return (QChar::UnicodeVersion) qGetProp(ucs4)->unicodeVersion; } -/*! \overload -Returns the Unicode version that introduced the character specified in -its UCS-2-encoded form as \a ucs2. - */ +/*! + \overload + Returns the Unicode version that introduced the character specified in + its UCS-2-encoded form as \a ucs2. +*/ QChar::UnicodeVersion QChar::unicodeVersion(ushort ucs2) { return (QChar::UnicodeVersion) qGetProp(ucs2)->unicodeVersion; @@ -1049,11 +1053,12 @@ QChar QChar::toLower() const return ucs; } -/*! \overload -Returns the lowercase equivalent of the UCS-4-encoded character specified -by \a ucs4 if the character is uppercase or titlecase; otherwise returns -the character itself. - */ +/*! + \overload + Returns the lowercase equivalent of the UCS-4-encoded character specified + by \a ucs4 if the character is uppercase or titlecase; otherwise returns + the character itself. +*/ uint QChar::toLower(uint ucs4) { if (ucs4 > LAST_UNICODE_CHAR) @@ -1064,11 +1069,12 @@ uint QChar::toLower(uint ucs4) return ucs4; } -/*! \overload -Returns the lowercase equivalent of the UCS-2-encoded character specified -by \a ucs2 if the character is uppercase or titlecase; otherwise returns -the character itself. - */ +/*! + \overload + Returns the lowercase equivalent of the UCS-2-encoded character specified + by \a ucs2 if the character is uppercase or titlecase; otherwise returns + the character itself. +*/ ushort QChar::toLower(ushort ucs2) { const QUnicodeTables::Properties *p = qGetProp(ucs2); @@ -1089,11 +1095,12 @@ QChar QChar::toUpper() const return ucs; } -/*! \overload -Returns the uppercase equivalent of the UCS-4-encoded character specified -by \a ucs4 if the character is lowercase or titlecase; otherwise returns -the character itself. - */ +/*! + \overload + Returns the uppercase equivalent of the UCS-4-encoded character specified + by \a ucs4 if the character is lowercase or titlecase; otherwise returns + the character itself. +*/ uint QChar::toUpper(uint ucs4) { if (ucs4 > LAST_UNICODE_CHAR) @@ -1104,11 +1111,12 @@ uint QChar::toUpper(uint ucs4) return ucs4; } -/*! \overload -Returns the uppercase equivalent of the UCS-2-encoded character specified -by \a ucs2 if the character is lowercase or titlecase; otherwise returns -the character itself. - */ +/*! + \overload + Returns the uppercase equivalent of the UCS-2-encoded character specified + by \a ucs2 if the character is lowercase or titlecase; otherwise returns + the character itself. +*/ ushort QChar::toUpper(ushort ucs2) { const QUnicodeTables::Properties *p = qGetProp(ucs2); @@ -1292,28 +1300,25 @@ QChar QChar::fromAscii(char c) #ifndef QT_NO_DATASTREAM /*! - \relates QChar - - Writes the char \a chr to the stream \a out. + \relates QChar - \sa {Format of the QDataStream operators} - */ + Writes the char \a chr to the stream \a out. + \sa {Format of the QDataStream operators} +*/ QDataStream &operator<<(QDataStream &out, const QChar &chr) { out << quint16(chr.unicode()); return out; } - /*! - \relates QChar - - Reads a char from the stream \a in into char \a chr. + \relates QChar - \sa {Format of the QDataStream operators} - */ + Reads a char from the stream \a in into char \a chr. + \sa {Format of the QDataStream operators} +*/ QDataStream &operator>>(QDataStream &in, QChar &chr) { quint16 u; @@ -1602,11 +1607,9 @@ int QT_FASTCALL QUnicodeTables::script(unsigned int uc) return script; } - Q_CORE_EXPORT QUnicodeTables::LineBreakClass QT_FASTCALL QUnicodeTables::lineBreakClass(uint ucs4) { return (QUnicodeTables::LineBreakClass) qGetProp(ucs4)->line_break_class; } - QT_END_NAMESPACE -- cgit v0.12 From 5b05cdccda99d5889c6a3db41d5c494d25798840 Mon Sep 17 00:00:00 2001 From: Ritt Konstantin Date: Wed, 24 Feb 2010 20:13:55 +0100 Subject: add some usefull definitions to qunicodetables_p.h * CURRENT_VERSION macro in qunicodetables.cpp was renamed to UNICODE_DATA_VERSION and it's definition was moved to qunicodetables_p.h * LAST_UNICODE_CHAR macro in qchar.cpp was renamed to UNICODE_LAST_CODEPOINT and it's definition was moved to qunicodetables_p.h Merge-request: 480 Reviewed-by: Thiago Macieira --- src/corelib/tools/qchar.cpp | 28 +++++++++++++--------------- src/corelib/tools/qstring.cpp | 4 ++-- util/unicode/main.cpp | 5 +++-- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/corelib/tools/qchar.cpp b/src/corelib/tools/qchar.cpp index 3d55a58..2bc5347 100644 --- a/src/corelib/tools/qchar.cpp +++ b/src/corelib/tools/qchar.cpp @@ -57,8 +57,6 @@ QT_BEGIN_NAMESPACE -#define LAST_UNICODE_CHAR 0x10ffff - #ifndef QT_NO_CODEC_FOR_C_STRINGS # ifdef QT_NO_TEXTCODEC # define QT_NO_CODEC_FOR_C_STRINGS @@ -714,7 +712,7 @@ int QChar::digitValue(ushort ucs2) */ int QChar::digitValue(uint ucs4) { - if (ucs4 > LAST_UNICODE_CHAR) + if (ucs4 > UNICODE_LAST_CODEPOINT) return 0; return qGetProp(ucs4)->digitValue; } @@ -734,7 +732,7 @@ QChar::Category QChar::category() const */ QChar::Category QChar::category(uint ucs4) { - if (ucs4 > LAST_UNICODE_CHAR) + if (ucs4 > UNICODE_LAST_CODEPOINT) return QChar::NoCategory; return (QChar::Category) qGetProp(ucs4)->category; } @@ -763,7 +761,7 @@ QChar::Direction QChar::direction() const */ QChar::Direction QChar::direction(uint ucs4) { - if (ucs4 > LAST_UNICODE_CHAR) + if (ucs4 > UNICODE_LAST_CODEPOINT) return QChar::DirL; return (QChar::Direction) qGetProp(ucs4)->direction; } @@ -794,7 +792,7 @@ QChar::Joining QChar::joining() const */ QChar::Joining QChar::joining(uint ucs4) { - if (ucs4 > LAST_UNICODE_CHAR) + if (ucs4 > UNICODE_LAST_CODEPOINT) return QChar::OtherJoining; return (QChar::Joining) qGetProp(ucs4)->joining; } @@ -872,7 +870,7 @@ QChar QChar::mirroredChar() const */ uint QChar::mirroredChar(uint ucs4) { - if (ucs4 > LAST_UNICODE_CHAR) + if (ucs4 > UNICODE_LAST_CODEPOINT) return ucs4; return ucs4 + qGetProp(ucs4)->mirrorDiff; } @@ -907,7 +905,7 @@ static const unsigned short * QT_FASTCALL decompositionHelper (uint ucs4, int *length, int *tag, unsigned short *buffer) { *length = 0; - if (ucs4 > LAST_UNICODE_CHAR) + if (ucs4 > UNICODE_LAST_CODEPOINT) return 0; if (ucs4 >= Hangul_SBase && ucs4 < Hangul_SBase + Hangul_SCount) { int SIndex = ucs4 - Hangul_SBase; @@ -967,7 +965,7 @@ QChar::Decomposition QChar::decompositionTag() const */ QChar::Decomposition QChar::decompositionTag(uint ucs4) { - if (ucs4 > LAST_UNICODE_CHAR) + if (ucs4 > UNICODE_LAST_CODEPOINT) return QChar::NoDecomposition; const unsigned short index = GET_DECOMPOSITION_INDEX(ucs4); if (index == 0xffff) @@ -995,7 +993,7 @@ unsigned char QChar::combiningClass() const */ unsigned char QChar::combiningClass(uint ucs4) { - if (ucs4 > LAST_UNICODE_CHAR) + if (ucs4 > UNICODE_LAST_CODEPOINT) return 0; return (unsigned char) qGetProp(ucs4)->combiningClass; } @@ -1025,7 +1023,7 @@ QChar::UnicodeVersion QChar::unicodeVersion() const */ QChar::UnicodeVersion QChar::unicodeVersion(uint ucs4) { - if (ucs4 > LAST_UNICODE_CHAR) + if (ucs4 > UNICODE_LAST_CODEPOINT) return QChar::Unicode_Unassigned; return (QChar::UnicodeVersion) qGetProp(ucs4)->unicodeVersion; } @@ -1061,7 +1059,7 @@ QChar QChar::toLower() const */ uint QChar::toLower(uint ucs4) { - if (ucs4 > LAST_UNICODE_CHAR) + if (ucs4 > UNICODE_LAST_CODEPOINT) return ucs4; const QUnicodeTables::Properties *p = qGetProp(ucs4); if (!p->lowerCaseSpecial) @@ -1103,7 +1101,7 @@ QChar QChar::toUpper() const */ uint QChar::toUpper(uint ucs4) { - if (ucs4 > LAST_UNICODE_CHAR) + if (ucs4 > UNICODE_LAST_CODEPOINT) return ucs4; const QUnicodeTables::Properties *p = qGetProp(ucs4); if (!p->upperCaseSpecial) @@ -1145,7 +1143,7 @@ QChar QChar::toTitleCase() const */ uint QChar::toTitleCase(uint ucs4) { - if (ucs4 > LAST_UNICODE_CHAR) + if (ucs4 > UNICODE_LAST_CODEPOINT) return ucs4; const QUnicodeTables::Properties *p = qGetProp(ucs4); if (!p->titleCaseSpecial) @@ -1206,7 +1204,7 @@ QChar QChar::toCaseFolded() const */ uint QChar::toCaseFolded(uint ucs4) { - if (ucs4 > LAST_UNICODE_CHAR) + if (ucs4 > UNICODE_LAST_CODEPOINT) return ucs4; return ucs4 + qGetProp(ucs4)->caseFoldDiff; } diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index 703ec67..9ab0970 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -6191,7 +6191,7 @@ QStringList QString::split(const QRegExp &rx, SplitBehavior behavior) const */ QString QString::normalized(QString::NormalizationForm mode) const { - return normalized(mode, CURRENT_VERSION); + return normalized(mode, UNICODE_DATA_VERSION); } /*! @@ -6273,7 +6273,7 @@ void qt_string_normalize(QString *data, QString::NormalizationForm mode, QChar:: return; QString &s = *data; - if (version != CURRENT_VERSION) { + if (version != UNICODE_DATA_VERSION) { for (int i = 0; i < NumNormalizationCorrections; ++i) { const NormalizationCorrection &n = uc_normalization_corrections[i]; if (n.version > version) { diff --git a/util/unicode/main.cpp b/util/unicode/main.cpp index 5a2f45e..521dcb0 100644 --- a/util/unicode/main.cpp +++ b/util/unicode/main.cpp @@ -55,6 +55,7 @@ #define DATA_VERSION_STR "QChar::Unicode_5_0" #define LAST_CODEPOINT 0x10ffff +#define LAST_CODEPOINT_STR "0x10ffff" static QHash age_map; @@ -2167,8 +2168,6 @@ static QByteArray createPropertyInfo() " return uc_properties + index;\n" "}\n\n"; - out += "#define CURRENT_VERSION "DATA_VERSION_STR"\n\n"; - out += "static const ushort specialCaseMap[] = {\n "; for (int i = 0; i < specialCaseMap.size(); ++i) { out += QByteArray(" 0x") + QByteArray::number(specialCaseMap.at(i), 16); @@ -2644,6 +2643,8 @@ int main(int, char **) "#define QUNICODETABLES_P_H\n\n" "#include \n\n" "QT_BEGIN_NAMESPACE\n\n"); + f.write("#define UNICODE_DATA_VERSION "DATA_VERSION_STR"\n\n"); + f.write("#define UNICODE_LAST_CODEPOINT "LAST_CODEPOINT_STR"\n\n"); f.write("namespace QUnicodeTables {\n\n"); f.write(property_string); f.write("\n"); -- cgit v0.12 From a6f95ce9146f5c9f8276a915252c84f8c7d18383 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 24 Feb 2010 20:18:50 +0100 Subject: Fix the code after merge: DerivedNormalizationProps has two or more columns --- util/unicode/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/unicode/main.cpp b/util/unicode/main.cpp index 521dcb0..f2ebe7c 100644 --- a/util/unicode/main.cpp +++ b/util/unicode/main.cpp @@ -969,7 +969,7 @@ static void readDerivedNormalizationProps() continue; QList l = line.split(';'); - Q_ASSERT(l.size() == 2); + Q_ASSERT(l.size() >= 2); QByteArray propName = l[1].trimmed(); if (propName != "Full_Composition_Exclusion") -- cgit v0.12 From 46cd6cdabae70c2a4ee7ec62b7c5b6ca3ddf03de Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 3 Mar 2010 11:22:26 +0100 Subject: Re-generate the Unicode tables after updates to the program that generates them --- src/corelib/tools/qunicodetables.cpp | 3694 +++++++++++++++++----------------- src/corelib/tools/qunicodetables_p.h | 55 +- 2 files changed, 1907 insertions(+), 1842 deletions(-) diff --git a/src/corelib/tools/qunicodetables.cpp b/src/corelib/tools/qunicodetables.cpp index 97afdf5..9df31e5 100644 --- a/src/corelib/tools/qunicodetables.cpp +++ b/src/corelib/tools/qunicodetables.cpp @@ -44,7 +44,7 @@ QT_BEGIN_NAMESPACE static const unsigned short uc_property_trie[] = { - // 0x11000 + // 0 - 0x11000 6256, 6288, 6320, 6352, 6384, 6416, 6448, 6480, 6512, 6544, 6576, 6608, 6640, 6672, 6704, 6736, @@ -1777,42 +1777,42 @@ static const unsigned short uc_property_trie[] = { 42, 42, 560, 561, 562, 160, 563, 564, 565, 565, 565, 565, 566, 42, 42, 42, - 492, 492, 567, 568, 160, 160, 569, 570, - 493, 493, 571, 571, 160, 42, 42, 42, - - 492, 492, 572, 573, 574, 182, 575, 576, - 493, 493, 577, 577, 578, 42, 42, 42, - 160, 160, 579, 580, 581, 160, 582, 583, - 584, 584, 585, 585, 586, 42, 42, 160, - - 587, 587, 587, 587, 587, 587, 587, 588, - 587, 587, 587, 589, 590, 591, 592, 593, - 594, 595, 594, 594, 596, 597, 14, 14, - 598, 599, 600, 601, 598, 602, 600, 601, - - 14, 14, 14, 14, 603, 603, 603, 604, - 605, 606, 607, 608, 609, 610, 611, 612, - 13, 13, 13, 13, 13, 613, 613, 613, - 14, 598, 602, 14, 614, 614, 14, 43, - - 43, 14, 14, 14, 615, 16, 17, 616, - 617, 617, 432, 432, 432, 432, 618, 618, - 618, 618, 185, 619, 620, 621, 622, 618, - 622, 622, 622, 622, 621, 622, 622, 623, - - 624, 625, 625, 625, 160, 160, 160, 160, - 160, 160, 626, 626, 626, 626, 626, 626, - 627, 628, 160, 160, 629, 630, 631, 632, - 633, 634, 635, 635, 36, 16, 17, 50, - - 627, 60, 55, 56, 629, 630, 631, 632, - 633, 634, 635, 635, 36, 16, 17, 160, + 492, 492, 567, 166, 160, 160, 568, 569, + 493, 493, 570, 570, 160, 42, 42, 42, + + 492, 492, 571, 169, 572, 182, 573, 574, + 493, 493, 575, 575, 576, 42, 42, 42, + 160, 160, 577, 578, 579, 160, 580, 581, + 582, 582, 583, 583, 584, 42, 42, 160, + + 585, 585, 585, 585, 585, 585, 585, 586, + 585, 585, 585, 587, 588, 589, 590, 591, + 592, 593, 592, 592, 594, 595, 14, 14, + 596, 597, 598, 599, 596, 600, 598, 599, + + 14, 14, 14, 14, 601, 601, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, + 13, 13, 13, 13, 13, 611, 611, 611, + 14, 596, 600, 14, 612, 612, 14, 43, + + 43, 14, 14, 14, 613, 16, 17, 614, + 615, 615, 432, 432, 432, 432, 616, 616, + 616, 616, 185, 617, 618, 619, 620, 616, + 620, 620, 620, 620, 619, 620, 620, 621, + + 622, 623, 623, 623, 160, 160, 160, 160, + 160, 160, 624, 624, 624, 624, 624, 624, + 625, 626, 160, 160, 627, 628, 629, 630, + 631, 632, 633, 633, 36, 16, 17, 50, + + 625, 60, 55, 56, 627, 628, 629, 630, + 631, 632, 633, 633, 36, 16, 17, 160, 484, 484, 484, 484, 484, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 12, 12, 12, 12, 12, 12, 12, 48, - 12, 12, 12, 636, 637, 429, 429, 429, - 638, 638, 639, 639, 639, 639, 160, 160, + 12, 12, 12, 634, 635, 429, 429, 429, + 636, 636, 637, 637, 637, 637, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, @@ -1820,32 +1820,32 @@ static const unsigned short uc_property_trie[] = { 139, 139, 144, 144, 139, 139, 139, 139, 144, 144, 144, 139, 139, 273, 273, 273, - 273, 139, 195, 195, 640, 641, 641, 159, - 642, 159, 641, 643, 299, 299, 299, 299, + 273, 139, 195, 195, 638, 639, 639, 159, + 640, 159, 639, 641, 299, 299, 299, 299, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 49, 49, 175, 644, 49, 49, 49, 175, - 49, 644, 50, 175, 175, 175, 50, 50, - 175, 175, 175, 50, 49, 175, 645, 49, + 49, 49, 175, 642, 49, 49, 49, 175, + 49, 642, 50, 175, 175, 175, 50, 50, + 175, 175, 175, 50, 49, 175, 643, 49, 49, 175, 175, 175, 175, 175, 49, 49, - 49, 49, 49, 49, 175, 49, 646, 49, - 175, 49, 647, 648, 175, 175, 649, 50, - 175, 175, 650, 175, 50, 90, 90, 90, - 90, 131, 651, 239, 103, 628, 652, 652, + 49, 49, 49, 49, 175, 49, 644, 49, + 175, 49, 645, 646, 175, 175, 647, 50, + 175, 175, 648, 175, 50, 90, 90, 90, + 90, 131, 649, 239, 103, 626, 650, 650, - 185, 185, 185, 185, 185, 652, 628, 628, - 628, 628, 653, 185, 418, 301, 654, 160, + 185, 185, 185, 185, 185, 650, 626, 626, + 626, 626, 651, 185, 418, 301, 652, 160, 160, 160, 160, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 655, 655, 655, 655, 655, 655, 655, 655, - 655, 655, 655, 655, 655, 655, 655, 655, - 656, 656, 656, 656, 656, 656, 656, 656, - 656, 656, 656, 656, 656, 656, 656, 656, + 653, 653, 653, 653, 653, 653, 653, 653, + 653, 653, 653, 653, 653, 653, 653, 653, + 654, 654, 654, 654, 654, 654, 654, 654, + 654, 654, 654, 654, 654, 654, 654, 654, - 657, 657, 657, 99, 109, 160, 160, 160, + 655, 655, 655, 99, 109, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 36, 36, 36, 36, 36, 49, 49, 49, 49, 49, 36, 36, 49, 49, 49, 49, @@ -1861,52 +1861,52 @@ static const unsigned short uc_property_trie[] = { 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 651, 651, 651, 651, 651, - 651, 651, 651, 651, 185, 185, 185, 185, + 49, 49, 49, 649, 649, 649, 649, 649, + 649, 649, 649, 649, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 36, 36, 36, 36, 36, 36, 36, 36, - 658, 658, 658, 659, 659, 659, 36, 36, - 36, 36, 18, 54, 36, 660, 36, 36, + 656, 656, 656, 657, 657, 657, 36, 36, + 36, 36, 18, 54, 36, 658, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 661, 662, 36, 36, + 36, 36, 36, 36, 659, 660, 36, 36, - 36, 36, 36, 663, 36, 36, 36, 36, + 36, 36, 36, 661, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 661, 662, 661, 662, 36, 36, + 36, 36, 659, 660, 659, 660, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 661, 662, 661, 662, - 661, 662, 661, 662, 36, 36, 661, 662, - 661, 662, 661, 662, 661, 662, 661, 662, - 661, 662, 661, 662, 661, 662, 661, 662, + 36, 36, 36, 36, 659, 660, 659, 660, + 659, 660, 659, 660, 36, 36, 659, 660, + 659, 660, 659, 660, 659, 660, 659, 660, + 659, 660, 659, 660, 659, 660, 659, 660, - 661, 662, 661, 662, 661, 662, 661, 662, - 661, 662, 661, 662, 36, 36, 36, 661, - 662, 661, 662, 36, 36, 36, 36, 36, - 664, 36, 36, 36, 36, 36, 36, 36, + 659, 660, 659, 660, 659, 660, 659, 660, + 659, 660, 659, 660, 36, 36, 36, 659, + 660, 659, 660, 36, 36, 36, 36, 36, + 662, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 661, 662, 36, 36, 665, 36, - 666, 667, 36, 667, 36, 36, 36, 36, - 661, 662, 661, 662, 661, 662, 661, 662, + 36, 36, 659, 660, 36, 36, 663, 36, + 664, 665, 36, 665, 36, 36, 36, 36, + 659, 660, 659, 660, 659, 660, 659, 660, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 661, 662, 661, 662, 668, 36, 36, - 661, 662, 36, 36, 36, 36, 661, 662, - 661, 662, 661, 662, 661, 662, 661, 662, + 36, 659, 660, 659, 660, 666, 36, 36, + 659, 660, 36, 36, 36, 36, 659, 660, + 659, 660, 659, 660, 659, 660, 659, 660, - 661, 662, 661, 662, 661, 662, 661, 662, - 661, 662, 661, 662, 661, 662, 36, 36, - 661, 662, 669, 669, 669, 185, 670, 670, - 185, 185, 671, 671, 671, 672, 672, 185, + 659, 660, 659, 660, 659, 660, 659, 660, + 659, 660, 659, 660, 659, 660, 36, 36, + 659, 660, 667, 667, 667, 185, 668, 668, + 185, 185, 669, 669, 669, 670, 670, 185, - 49, 651, 49, 49, 49, 49, 49, 49, - 661, 662, 661, 662, 49, 49, 49, 49, + 49, 649, 49, 49, 49, 49, 49, 49, + 659, 660, 659, 660, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, @@ -1923,24 +1923,24 @@ static const unsigned short uc_property_trie[] = { 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, - 194, 194, 194, 651, 185, 651, 651, 651, + 194, 194, 194, 649, 185, 649, 649, 649, - 651, 651, 651, 651, 651, 651, 651, 651, - 651, 651, 651, 651, 651, 651, 651, 651, - 651, 651, 651, 651, 651, 381, 651, 651, - 651, 651, 651, 185, 185, 185, 185, 185, + 649, 649, 649, 649, 649, 649, 649, 649, + 649, 649, 649, 649, 649, 649, 649, 649, + 649, 649, 649, 649, 649, 381, 649, 649, + 649, 649, 649, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, - 185, 185, 185, 185, 653, 653, 653, 653, - 653, 653, 653, 653, 653, 653, 653, 653, + 185, 185, 185, 185, 651, 651, 651, 651, + 651, 651, 651, 651, 651, 651, 651, 651, - 653, 653, 653, 653, 653, 653, 653, 653, - 653, 653, 653, 653, 653, 653, 653, 239, + 651, 651, 651, 651, 651, 651, 651, 651, + 651, 651, 651, 651, 651, 651, 651, 239, 239, 418, 418, 418, 418, 418, 418, 418, - 418, 418, 418, 418, 673, 673, 673, 673, + 418, 418, 418, 418, 671, 671, 671, 671, - 673, 673, 301, 301, 301, 301, 301, 301, + 671, 671, 301, 301, 301, 301, 301, 301, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, @@ -1950,7 +1950,7 @@ static const unsigned short uc_property_trie[] = { 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 651, 651, 160, + 49, 49, 49, 49, 49, 649, 649, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, @@ -1960,35 +1960,35 @@ static const unsigned short uc_property_trie[] = { 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 674, 675, 676, 677, 678, 679, 680, 681, - 682, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 674, 675, 676, 677, - 678, 679, 680, 681, 682, 62, 62, 62, + 672, 673, 674, 675, 676, 677, 678, 679, + 680, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 672, 673, 674, 675, + 676, 677, 678, 679, 680, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 60, 55, 56, 629, 630, 631, 632, 633, - 634, 683, 683, 683, 683, 683, 683, 683, - 683, 683, 683, 683, 194, 194, 194, 194, + 60, 55, 56, 627, 628, 629, 630, 631, + 632, 681, 681, 681, 681, 681, 681, 681, + 681, 681, 681, 681, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, - 194, 194, 194, 194, 194, 194, 684, 684, - 684, 684, 684, 684, 684, 684, 684, 684, + 194, 194, 194, 194, 194, 194, 682, 682, + 682, 682, 682, 682, 682, 682, 682, 682, - 684, 684, 684, 684, 684, 684, 684, 684, - 684, 684, 684, 684, 684, 684, 684, 684, - 685, 685, 685, 685, 685, 685, 685, 685, - 685, 685, 685, 685, 685, 685, 685, 685, + 682, 682, 682, 682, 682, 682, 682, 682, + 682, 682, 682, 682, 682, 682, 682, 682, + 683, 683, 683, 683, 683, 683, 683, 683, + 683, 683, 683, 683, 683, 683, 683, 683, - 685, 685, 685, 685, 685, 685, 685, 685, - 685, 685, 686, 687, 687, 687, 687, 687, - 687, 687, 687, 687, 687, 688, 689, 690, - 691, 692, 693, 694, 695, 696, 687, 697, + 683, 683, 683, 683, 683, 683, 683, 683, + 683, 683, 684, 685, 685, 685, 685, 685, + 685, 685, 685, 685, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 685, 695, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 653, 653, - 653, 653, 653, 653, 653, 653, 653, 653, + 49, 49, 49, 49, 49, 49, 651, 651, + 651, 651, 651, 651, 651, 651, 651, 651, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, @@ -2002,21 +2002,21 @@ static const unsigned short uc_property_trie[] = { 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 651, 651, 651, 651, 651, 651, 651, 651, + 649, 649, 649, 649, 649, 649, 649, 649, 185, 185, 185, 185, 185, 185, 185, 185, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 239, 239, 653, 653, - 418, 651, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 239, 239, 651, 651, + 418, 649, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 36, - 651, 651, 653, 653, 653, 653, 653, 653, - 653, 653, 653, 653, 653, 653, 418, 418, + 649, 649, 651, 651, 651, 651, 651, 651, + 651, 651, 651, 651, 651, 651, 418, 418, - 653, 653, 653, 653, 653, 653, 653, 653, - 653, 653, 239, 239, 239, 239, 239, 239, + 651, 651, 651, 651, 651, 651, 651, 651, + 651, 651, 239, 239, 239, 239, 239, 239, 239, 239, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 160, 160, 160, @@ -2038,16 +2038,16 @@ static const unsigned short uc_property_trie[] = { 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 160, 49, 160, 49, 49, 49, 49, 160, 160, 160, 49, 160, - 49, 49, 49, 698, 698, 698, 698, 160, + 49, 49, 49, 696, 696, 696, 696, 160, - 160, 49, 699, 699, 49, 49, 49, 49, - 700, 701, 700, 701, 700, 701, 700, 701, - 700, 701, 700, 701, 700, 701, 674, 675, - 676, 677, 678, 679, 680, 681, 682, 62, + 160, 49, 697, 697, 49, 49, 49, 49, + 698, 699, 698, 699, 698, 699, 698, 699, + 698, 699, 698, 699, 698, 699, 672, 673, + 674, 675, 676, 677, 678, 679, 680, 62, - 674, 675, 676, 677, 678, 679, 680, 681, - 682, 62, 674, 675, 676, 677, 678, 679, - 680, 681, 682, 62, 49, 160, 160, 160, + 672, 673, 674, 675, 676, 677, 678, 679, + 680, 62, 672, 673, 674, 675, 676, 677, + 678, 679, 680, 62, 49, 160, 160, 160, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, @@ -2055,13 +2055,13 @@ static const unsigned short uc_property_trie[] = { 160, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 160, - 702, 702, 702, 703, 704, 705, 706, 673, - 673, 673, 673, 160, 160, 160, 160, 160, - 185, 185, 185, 185, 185, 707, 708, 185, - 185, 185, 185, 185, 185, 707, 708, 185, + 700, 700, 700, 701, 702, 703, 704, 671, + 671, 671, 671, 160, 160, 160, 160, 160, + 185, 185, 185, 185, 185, 705, 706, 185, + 185, 185, 185, 185, 185, 705, 706, 185, - 185, 185, 707, 708, 707, 708, 700, 701, - 700, 701, 700, 701, 160, 160, 160, 160, + 185, 185, 705, 706, 705, 706, 698, 699, + 698, 699, 698, 699, 160, 160, 160, 160, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, @@ -2075,55 +2075,55 @@ static const unsigned short uc_property_trie[] = { 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, - 185, 185, 185, 700, 701, 700, 701, 700, - 701, 700, 701, 700, 701, 709, 710, 711, - 712, 700, 701, 700, 701, 700, 701, 700, - 701, 185, 185, 185, 185, 185, 185, 185, + 185, 185, 185, 698, 699, 698, 699, 698, + 699, 698, 699, 698, 699, 707, 708, 709, + 710, 698, 699, 698, 699, 698, 699, 698, + 699, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, - 713, 185, 185, 185, 185, 185, 185, 185, + 711, 185, 185, 185, 185, 185, 185, 185, - 707, 708, 185, 185, 707, 708, 185, 185, - 185, 185, 185, 185, 185, 185, 185, 707, - 708, 707, 708, 185, 707, 708, 185, 185, - 700, 701, 700, 701, 185, 185, 185, 185, + 705, 706, 185, 185, 705, 706, 185, 185, + 185, 185, 185, 185, 185, 185, 185, 705, + 706, 705, 706, 185, 705, 706, 185, 185, + 698, 699, 698, 699, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, - 185, 185, 185, 185, 185, 714, 185, 185, - 707, 708, 185, 185, 700, 701, 185, 185, + 185, 185, 185, 185, 185, 712, 185, 185, + 705, 706, 185, 185, 698, 699, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, - 185, 185, 185, 707, 708, 707, 708, 185, - 185, 185, 185, 185, 707, 708, 185, 185, - 185, 185, 185, 185, 707, 708, 185, 185, + 185, 185, 185, 705, 706, 705, 706, 185, + 185, 185, 185, 185, 705, 706, 185, 185, + 185, 185, 185, 185, 705, 706, 185, 185, - 185, 185, 185, 185, 707, 708, 185, 185, + 185, 185, 185, 185, 705, 706, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, - 185, 707, 708, 185, 185, 707, 708, 707, + 185, 705, 706, 185, 185, 705, 706, 705, - 708, 707, 708, 707, 708, 185, 185, 185, - 185, 185, 185, 707, 708, 185, 185, 185, - 185, 707, 708, 707, 708, 707, 708, 707, - 708, 707, 708, 707, 708, 185, 185, 185, + 706, 705, 706, 705, 706, 185, 185, 185, + 185, 185, 185, 705, 706, 185, 185, 185, + 185, 705, 706, 705, 706, 705, 706, 705, + 706, 705, 706, 705, 706, 185, 185, 185, - 185, 707, 708, 185, 185, 185, 707, 708, - 707, 708, 707, 708, 707, 708, 185, 707, - 708, 185, 185, 707, 708, 185, 185, 185, - 185, 185, 185, 707, 708, 707, 708, 707, + 185, 705, 706, 185, 185, 185, 705, 706, + 705, 706, 705, 706, 705, 706, 185, 705, + 706, 185, 185, 705, 706, 185, 185, 185, + 185, 185, 185, 705, 706, 705, 706, 705, - 708, 707, 708, 707, 708, 707, 708, 185, - 185, 185, 185, 185, 185, 707, 708, 707, - 708, 707, 708, 707, 708, 707, 708, 185, - 185, 185, 185, 185, 185, 185, 715, 185, + 706, 705, 706, 705, 706, 705, 706, 185, + 185, 185, 185, 185, 185, 705, 706, 705, + 706, 705, 706, 705, 706, 705, 706, 185, + 185, 185, 185, 185, 185, 185, 713, 185, - 185, 185, 185, 716, 717, 716, 185, 185, - 185, 185, 185, 185, 707, 708, 185, 185, - 185, 185, 185, 185, 185, 185, 185, 707, - 708, 707, 708, 185, 185, 185, 185, 185, + 185, 185, 185, 714, 715, 714, 185, 185, + 185, 185, 185, 185, 705, 706, 185, 185, + 185, 185, 185, 185, 185, 185, 185, 705, + 706, 705, 706, 185, 185, 185, 185, 185, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 418, 418, @@ -2135,24 +2135,24 @@ static const unsigned short uc_property_trie[] = { 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 718, 718, 718, 718, 718, 718, 718, 718, - 718, 718, 718, 718, 718, 718, 718, 718, - 718, 718, 718, 718, 718, 718, 718, 718, - 718, 718, 718, 718, 718, 718, 718, 718, + 716, 716, 716, 716, 716, 716, 716, 716, + 716, 716, 716, 716, 716, 716, 716, 716, + 716, 716, 716, 716, 716, 716, 716, 716, + 716, 716, 716, 716, 716, 716, 716, 716, - 718, 718, 718, 718, 718, 718, 718, 718, - 718, 718, 718, 718, 718, 718, 718, 160, - 719, 719, 719, 719, 719, 719, 719, 719, - 719, 719, 719, 719, 719, 719, 719, 719, + 716, 716, 716, 716, 716, 716, 716, 716, + 716, 716, 716, 716, 716, 716, 716, 160, + 717, 717, 717, 717, 717, 717, 717, 717, + 717, 717, 717, 717, 717, 717, 717, 717, - 719, 719, 719, 719, 719, 719, 719, 719, - 719, 719, 719, 719, 719, 719, 719, 719, - 719, 719, 719, 719, 719, 719, 719, 719, - 719, 719, 719, 719, 719, 719, 719, 160, + 717, 717, 717, 717, 717, 717, 717, 717, + 717, 717, 717, 717, 717, 717, 717, 717, + 717, 717, 717, 717, 717, 717, 717, 717, + 717, 717, 717, 717, 717, 717, 717, 160, - 113, 109, 720, 721, 722, 723, 724, 113, + 113, 109, 718, 719, 720, 721, 722, 113, 109, 113, 109, 113, 109, 160, 160, 160, - 160, 160, 160, 160, 725, 113, 109, 725, + 160, 160, 160, 160, 723, 113, 109, 723, 160, 160, 160, 160, 160, 160, 160, 160, 105, 106, 105, 106, 105, 106, 105, 106, @@ -2163,14 +2163,14 @@ static const unsigned short uc_property_trie[] = { 105, 106, 105, 106, 103, 418, 418, 418, 418, 418, 418, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 160, 622, 622, 622, 622, 726, 622, 622, + 160, 620, 620, 620, 620, 724, 620, 620, - 727, 727, 727, 727, 727, 727, 727, 727, - 727, 727, 727, 727, 727, 727, 727, 727, - 727, 727, 727, 727, 727, 727, 727, 727, - 727, 727, 727, 727, 727, 727, 727, 727, + 725, 725, 725, 725, 725, 725, 725, 725, + 725, 725, 725, 725, 725, 725, 725, 725, + 725, 725, 725, 725, 725, 725, 725, 725, + 725, 725, 725, 725, 725, 725, 725, 725, - 727, 727, 727, 727, 727, 727, 160, 160, + 725, 725, 725, 725, 725, 725, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, @@ -2195,227 +2195,227 @@ static const unsigned short uc_property_trie[] = { 323, 323, 323, 323, 323, 323, 323, 160, 323, 323, 323, 323, 323, 323, 323, 160, - 728, 728, 729, 730, 729, 730, 728, 728, - 728, 729, 730, 728, 729, 730, 622, 622, - 622, 622, 622, 622, 622, 622, 621, 731, - 160, 160, 160, 160, 729, 730, 160, 160, + 726, 726, 727, 728, 727, 728, 726, 726, + 726, 727, 728, 726, 727, 728, 620, 620, + 620, 620, 620, 620, 620, 620, 619, 729, + 160, 160, 160, 160, 727, 728, 160, 160, - 732, 732, 732, 732, 732, 732, 732, 732, - 732, 732, 732, 732, 732, 732, 732, 732, - 732, 732, 732, 732, 732, 732, 732, 732, - 732, 732, 160, 732, 732, 732, 732, 732, + 730, 730, 730, 730, 730, 730, 730, 730, + 730, 730, 730, 730, 730, 730, 730, 730, + 730, 730, 730, 730, 730, 730, 730, 730, + 730, 730, 160, 730, 730, 730, 730, 730, - 732, 732, 732, 732, 732, 732, 732, 732, - 732, 732, 732, 732, 732, 732, 732, 732, - 732, 732, 732, 732, 732, 732, 732, 732, - 732, 732, 732, 732, 732, 732, 732, 732, + 730, 730, 730, 730, 730, 730, 730, 730, + 730, 730, 730, 730, 730, 730, 730, 730, + 730, 730, 730, 730, 730, 730, 730, 730, + 730, 730, 730, 730, 730, 730, 730, 730, - 732, 732, 732, 732, 732, 732, 732, 732, - 732, 732, 732, 732, 732, 732, 732, 732, - 732, 732, 732, 732, 160, 160, 160, 160, + 730, 730, 730, 730, 730, 730, 730, 730, + 730, 730, 730, 730, 730, 730, 730, 730, + 730, 730, 730, 730, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 732, 732, 732, 732, 732, 732, 732, 732, - 732, 732, 732, 732, 732, 732, 732, 732, - 732, 732, 732, 732, 732, 732, 160, 160, + 730, 730, 730, 730, 730, 730, 730, 730, + 730, 730, 730, 730, 730, 730, 730, 730, + 730, 730, 730, 730, 730, 730, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 732, 732, 732, 732, 732, 732, 732, 732, - 732, 732, 732, 732, 160, 160, 160, 160, + 730, 730, 730, 730, 730, 730, 730, 730, + 730, 730, 730, 730, 160, 160, 160, 160, - 733, 734, 735, 736, 737, 738, 739, 740, + 731, 732, 733, 734, 735, 736, 737, 738, 16, 17, 16, 17, 16, 17, 16, 17, - 16, 17, 737, 737, 16, 17, 16, 17, - 16, 17, 16, 17, 741, 16, 17, 742, - - 737, 740, 740, 740, 740, 740, 740, 740, - 740, 740, 743, 744, 140, 745, 746, 746, - 747, 748, 748, 748, 748, 748, 737, 737, - 749, 749, 749, 750, 751, 752, 732, 737, - - 160, 753, 739, 753, 739, 753, 739, 753, - 739, 753, 739, 739, 739, 739, 739, 739, - 739, 739, 739, 739, 739, 739, 739, 739, - 739, 739, 739, 739, 739, 739, 739, 739, - - 739, 739, 739, 753, 739, 739, 739, 739, - 739, 739, 739, 739, 739, 739, 739, 739, - 739, 739, 739, 739, 739, 739, 739, 739, - 739, 739, 739, 739, 739, 739, 739, 739, - - 739, 739, 739, 753, 739, 753, 739, 753, - 739, 739, 739, 739, 739, 739, 753, 739, - 739, 739, 739, 739, 739, 754, 754, 160, - 160, 755, 755, 756, 756, 757, 757, 758, - - 759, 760, 761, 760, 761, 760, 761, 760, - 761, 760, 761, 761, 761, 761, 761, 761, - 761, 761, 761, 761, 761, 761, 761, 761, - 761, 761, 761, 761, 761, 761, 761, 761, - - 761, 761, 761, 760, 761, 761, 761, 761, - 761, 761, 761, 761, 761, 761, 761, 761, - 761, 761, 761, 761, 761, 761, 761, 761, - 761, 761, 761, 761, 761, 761, 761, 761, - - 761, 761, 761, 760, 761, 760, 761, 760, - 761, 761, 761, 761, 761, 761, 760, 761, - 761, 761, 761, 761, 761, 760, 760, 761, - 761, 761, 761, 762, 763, 763, 763, 764, - - 160, 160, 160, 160, 160, 765, 765, 765, - 765, 765, 765, 765, 765, 765, 765, 765, - 765, 765, 765, 765, 765, 765, 765, 765, - 765, 765, 765, 765, 765, 765, 765, 765, - - 765, 765, 765, 765, 765, 765, 765, 765, - 765, 765, 765, 765, 765, 160, 160, 160, - 160, 765, 765, 765, 765, 765, 765, 765, - 765, 765, 765, 765, 765, 765, 765, 765, - - 765, 765, 765, 765, 765, 765, 765, 765, - 765, 765, 765, 765, 765, 765, 765, 765, - 765, 765, 765, 765, 765, 765, 765, 765, - 765, 765, 765, 765, 765, 765, 765, 765, + 16, 17, 735, 735, 16, 17, 16, 17, + 16, 17, 16, 17, 739, 16, 17, 740, + + 735, 738, 738, 738, 738, 738, 738, 738, + 738, 738, 741, 742, 140, 743, 744, 744, + 745, 746, 746, 746, 746, 746, 735, 735, + 747, 747, 747, 748, 749, 750, 730, 735, + + 160, 751, 737, 751, 737, 751, 737, 751, + 737, 751, 737, 737, 737, 737, 737, 737, + 737, 737, 737, 737, 737, 737, 737, 737, + 737, 737, 737, 737, 737, 737, 737, 737, + + 737, 737, 737, 751, 737, 737, 737, 737, + 737, 737, 737, 737, 737, 737, 737, 737, + 737, 737, 737, 737, 737, 737, 737, 737, + 737, 737, 737, 737, 737, 737, 737, 737, + + 737, 737, 737, 751, 737, 751, 737, 751, + 737, 737, 737, 737, 737, 737, 751, 737, + 737, 737, 737, 737, 737, 752, 752, 160, + 160, 753, 753, 754, 754, 755, 755, 756, + + 757, 758, 759, 758, 759, 758, 759, 758, + 759, 758, 759, 759, 759, 759, 759, 759, + 759, 759, 759, 759, 759, 759, 759, 759, + 759, 759, 759, 759, 759, 759, 759, 759, + + 759, 759, 759, 758, 759, 759, 759, 759, + 759, 759, 759, 759, 759, 759, 759, 759, + 759, 759, 759, 759, 759, 759, 759, 759, + 759, 759, 759, 759, 759, 759, 759, 759, + + 759, 759, 759, 758, 759, 758, 759, 758, + 759, 759, 759, 759, 759, 759, 758, 759, + 759, 759, 759, 759, 759, 758, 758, 759, + 759, 759, 759, 760, 761, 761, 761, 762, + + 160, 160, 160, 160, 160, 763, 763, 763, + 763, 763, 763, 763, 763, 763, 763, 763, + 763, 763, 763, 763, 763, 763, 763, 763, + 763, 763, 763, 763, 763, 763, 763, 763, + + 763, 763, 763, 763, 763, 763, 763, 763, + 763, 763, 763, 763, 763, 160, 160, 160, + 160, 763, 763, 763, 763, 763, 763, 763, + 763, 763, 763, 763, 763, 763, 763, 763, + + 763, 763, 763, 763, 763, 763, 763, 763, + 763, 763, 763, 763, 763, 763, 763, 763, + 763, 763, 763, 763, 763, 763, 763, 763, + 763, 763, 763, 763, 763, 763, 763, 763, + + 763, 763, 763, 763, 763, 763, 763, 763, + 763, 763, 763, 763, 763, 763, 763, 160, + 764, 764, 765, 765, 765, 765, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, - 765, 765, 765, 765, 765, 765, 765, 765, - 765, 765, 765, 765, 765, 765, 765, 160, - 766, 766, 767, 767, 767, 767, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, - - 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, + 766, 766, 766, 766, 766, 766, 766, 766, + 766, 766, 766, 766, 766, 766, 766, 766, 160, 160, 160, 160, 160, 160, 160, 160, - 769, 769, 769, 769, 769, 769, 769, 769, - 769, 769, 769, 769, 769, 769, 769, 769, + 767, 767, 767, 767, 767, 767, 767, 767, + 767, 767, 767, 767, 767, 767, 767, 767, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 770, 770, 770, 770, 770, 770, 770, 770, - 770, 770, 770, 770, 770, 770, 770, 770, + 768, 768, 768, 768, 768, 768, 768, 768, + 768, 768, 768, 768, 768, 768, 768, 768, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 766, 771, 771, 160, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 769, 769, 160, - 767, 767, 767, 767, 767, 767, 767, 767, - 767, 767, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 766, 766, 766, 766, + 765, 765, 765, 765, 765, 765, 765, 765, + 765, 765, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, - 766, 766, 766, 766, 160, 160, 160, 160, + 764, 764, 764, 764, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 771, 772, 772, 772, 772, 772, 772, 772, - 772, 772, 772, 772, 772, 772, 772, 772, + 769, 770, 770, 770, 770, 770, 770, 770, + 770, 770, 770, 770, 770, 770, 770, 770, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 771, 771, 769, 766, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 769, 769, 767, 764, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 772, 772, 772, 772, 772, 772, 772, - 772, 772, 772, 772, 772, 772, 772, 772, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 770, 770, 770, 770, 770, 770, 770, + 770, 770, 770, 770, 770, 770, 770, 770, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 771, 771, 771, 771, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 766, 766, 766, 766, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 769, 769, 769, 769, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 766, 766, 766, 160, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 160, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 766, 766, 766, 766, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 766, 766, 766, 771, - 771, 771, 771, 766, 766, 766, 766, 766, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 769, + 769, 769, 769, 764, 764, 764, 764, 764, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 766, 766, 771, 771, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 769, 769, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 766, 766, 766, 766, - 766, 766, 766, 766, 766, 766, 766, 771, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 764, + 764, 764, 764, 764, 764, 764, 764, 769, - 773, 773, 773, 773, 773, 773, 773, 773, - 773, 773, 773, 773, 773, 773, 773, 773, - 773, 773, 773, 773, 773, 773, 773, 773, - 773, 773, 773, 773, 773, 773, 773, 773, + 771, 771, 771, 771, 771, 771, 771, 771, + 771, 771, 771, 771, 771, 771, 771, 771, + 771, 771, 771, 771, 771, 771, 771, 771, + 771, 771, 771, 771, 771, 771, 771, 771, - 773, 773, 773, 773, 773, 773, 773, 773, - 773, 773, 773, 773, 773, 773, 773, 773, - 773, 773, 773, 773, 773, 773, 160, 160, + 771, 771, 771, 771, 771, 771, 771, 771, + 771, 771, 771, 771, 771, 771, 771, 771, + 771, 771, 771, 771, 771, 771, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 739, 739, 739, 739, 739, 739, 739, 739, - 739, 739, 739, 739, 739, 739, 739, 739, - 739, 739, 739, 739, 739, 739, 739, 739, - 739, 739, 739, 739, 739, 739, 739, 739, + 737, 737, 737, 737, 737, 737, 737, 737, + 737, 737, 737, 737, 737, 737, 737, 737, + 737, 737, 737, 737, 737, 737, 737, 737, + 737, 737, 737, 737, 737, 737, 737, 737, - 739, 739, 739, 739, 739, 739, 774, 774, - 774, 774, 774, 774, 774, 774, 774, 774, - 774, 774, 774, 774, 774, 774, 774, 774, - 774, 774, 774, 774, 160, 160, 160, 160, + 737, 737, 737, 737, 737, 737, 772, 772, + 772, 772, 772, 772, 772, 772, 772, 772, + 772, 772, 772, 772, 772, 772, 772, 772, + 772, 772, 772, 772, 160, 160, 160, 160, - 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 775, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, + 766, 766, 766, 766, 766, 766, 766, 766, + 766, 766, 766, 766, 766, 766, 766, 766, + 766, 766, 766, 766, 766, 773, 766, 766, + 766, 766, 766, 766, 766, 766, 766, 766, - 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, + 766, 766, 766, 766, 766, 766, 766, 766, + 766, 766, 766, 766, 766, 766, 766, 766, + 766, 766, 766, 766, 766, 766, 766, 766, + 766, 766, 766, 766, 766, 766, 766, 766, - 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 160, 160, 160, - 732, 732, 732, 732, 732, 732, 732, 732, - 732, 732, 732, 732, 732, 732, 732, 732, + 766, 766, 766, 766, 766, 766, 766, 766, + 766, 766, 766, 766, 766, 160, 160, 160, + 730, 730, 730, 730, 730, 730, 730, 730, + 730, 730, 730, 730, 730, 730, 730, 730, - 732, 732, 776, 776, 732, 732, 732, 732, - 732, 732, 732, 732, 732, 732, 732, 732, - 732, 732, 732, 732, 776, 732, 732, 732, - 732, 732, 732, 732, 732, 732, 732, 732, + 730, 730, 774, 774, 730, 730, 730, 730, + 730, 730, 730, 730, 730, 730, 730, 730, + 730, 730, 730, 730, 774, 730, 730, 730, + 730, 730, 730, 730, 730, 730, 730, 730, - 732, 776, 732, 732, 732, 776, 732, 160, + 730, 774, 730, 730, 730, 774, 730, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 777, 777, 777, 777, 777, 777, 777, 777, - 777, 777, 777, 777, 777, 777, 777, 777, - 777, 777, 777, 777, 777, 777, 777, 778, - 778, 778, 778, 160, 160, 160, 160, 160, + 775, 775, 775, 775, 775, 775, 775, 775, + 775, 775, 775, 775, 775, 775, 775, 775, + 775, 775, 775, 775, 775, 775, 775, 776, + 776, 776, 776, 160, 160, 160, 160, 160, - 779, 779, 160, 160, 160, 160, 160, 160, + 777, 777, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 323, 323, 780, 323, 323, 323, 781, 323, - 323, 323, 323, 782, 323, 323, 323, 323, + 323, 323, 778, 323, 323, 323, 779, 323, + 323, 323, 323, 780, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, - 323, 323, 323, 464, 464, 782, 782, 464, + 323, 323, 323, 464, 464, 780, 780, 464, 418, 418, 418, 418, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, @@ -2427,91 +2427,91 @@ static const unsigned short uc_property_trie[] = { 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, - 322, 322, 322, 322, 783, 783, 304, 304, + 322, 322, 322, 322, 781, 781, 304, 304, 160, 160, 160, 160, 160, 160, 160, 160, - 784, 785, 785, 785, 785, 785, 785, 785, - 785, 785, 785, 785, 785, 785, 785, 785, - 785, 785, 785, 785, 785, 785, 785, 785, - 785, 785, 785, 785, 784, 785, 785, 785, + 782, 783, 783, 783, 783, 783, 783, 783, + 783, 783, 783, 783, 783, 783, 783, 783, + 783, 783, 783, 783, 783, 783, 783, 783, + 783, 783, 783, 783, 782, 783, 783, 783, - 785, 785, 785, 785, 785, 785, 785, 785, - 785, 785, 785, 785, 785, 785, 785, 785, - 785, 785, 785, 785, 785, 785, 785, 785, - 784, 785, 785, 785, 785, 785, 785, 785, + 783, 783, 783, 783, 783, 783, 783, 783, + 783, 783, 783, 783, 783, 783, 783, 783, + 783, 783, 783, 783, 783, 783, 783, 783, + 782, 783, 783, 783, 783, 783, 783, 783, - 785, 785, 785, 785, 785, 785, 785, 785, - 785, 785, 785, 785, 785, 785, 785, 785, - 785, 785, 785, 785, 784, 785, 785, 785, - 785, 785, 785, 785, 785, 785, 785, 785, + 783, 783, 783, 783, 783, 783, 783, 783, + 783, 783, 783, 783, 783, 783, 783, 783, + 783, 783, 783, 783, 782, 783, 783, 783, + 783, 783, 783, 783, 783, 783, 783, 783, - 785, 785, 785, 785, 785, 785, 785, 785, - 785, 785, 785, 785, 785, 785, 785, 785, - 784, 785, 785, 785, 785, 785, 785, 785, - 785, 785, 785, 785, 785, 785, 785, 785, + 783, 783, 783, 783, 783, 783, 783, 783, + 783, 783, 783, 783, 783, 783, 783, 783, + 782, 783, 783, 783, 783, 783, 783, 783, + 783, 783, 783, 783, 783, 783, 783, 783, - 785, 785, 785, 785, 785, 785, 785, 785, - 785, 785, 785, 785, 784, 785, 785, 785, - 785, 785, 785, 785, 785, 785, 785, 785, - 785, 785, 785, 785, 785, 785, 785, 785, + 783, 783, 783, 783, 783, 783, 783, 783, + 783, 783, 783, 783, 782, 783, 783, 783, + 783, 783, 783, 783, 783, 783, 783, 783, + 783, 783, 783, 783, 783, 783, 783, 783, - 785, 785, 785, 785, 785, 785, 785, 785, - 784, 785, 785, 785, 785, 785, 785, 785, - 785, 785, 785, 785, 785, 785, 785, 785, - 785, 785, 785, 785, 785, 785, 785, 785, + 783, 783, 783, 783, 783, 783, 783, 783, + 782, 783, 783, 783, 783, 783, 783, 783, + 783, 783, 783, 783, 783, 783, 783, 783, + 783, 783, 783, 783, 783, 783, 783, 783, - 785, 785, 785, 785, 784, 785, 785, 785, - 785, 785, 785, 785, 785, 785, 785, 785, - 785, 785, 785, 785, 785, 785, 785, 785, - 785, 785, 785, 785, 785, 785, 785, 785, + 783, 783, 783, 783, 782, 783, 783, 783, + 783, 783, 783, 783, 783, 783, 783, 783, + 783, 783, 783, 783, 783, 783, 783, 783, + 783, 783, 783, 783, 783, 783, 783, 783, - 785, 785, 785, 785, 160, 160, 160, 160, + 783, 783, 783, 783, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, + 784, 784, 784, 784, 784, 784, 784, 784, + 784, 784, 784, 784, 784, 784, 784, 784, + 784, 784, 784, 784, 784, 784, 784, 784, + 784, 784, 784, 784, 784, 784, 784, 784, + + 785, 785, 785, 785, 785, 785, 785, 785, + 785, 785, 785, 785, 785, 785, 785, 785, + 785, 785, 785, 785, 785, 785, 785, 785, + 785, 785, 785, 785, 785, 785, 785, 785, + + 737, 737, 737, 737, 737, 737, 737, 737, + 737, 737, 737, 737, 737, 737, 160, 160, + 786, 786, 786, 786, 786, 786, 786, 786, + 786, 786, 786, 786, 786, 786, 786, 786, + 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, 786, - 787, 787, 787, 787, 787, 787, 787, 787, - 787, 787, 787, 787, 787, 787, 787, 787, - 787, 787, 787, 787, 787, 787, 787, 787, - 787, 787, 787, 787, 787, 787, 787, 787, - - 739, 739, 739, 739, 739, 739, 739, 739, - 739, 739, 739, 739, 739, 739, 160, 160, - 788, 788, 788, 788, 788, 788, 788, 788, - 788, 788, 788, 788, 788, 788, 788, 788, - - 788, 788, 788, 788, 788, 788, 788, 788, - 788, 788, 788, 788, 788, 788, 788, 788, - 788, 788, 788, 788, 788, 788, 788, 788, - 788, 788, 788, 788, 788, 788, 788, 788, - - 788, 788, 788, 788, 788, 788, 788, 788, - 788, 788, 788, 160, 160, 160, 160, 160, - 774, 774, 774, 774, 774, 774, 774, 774, - 774, 774, 774, 774, 774, 774, 774, 774, + 786, 786, 786, 786, 786, 786, 786, 786, + 786, 786, 786, 160, 160, 160, 160, 160, + 772, 772, 772, 772, 772, 772, 772, 772, + 772, 772, 772, 772, 772, 772, 772, 772, - 774, 774, 774, 774, 774, 774, 774, 774, - 774, 774, 774, 774, 774, 774, 774, 774, - 774, 774, 774, 774, 774, 774, 774, 774, - 774, 774, 774, 774, 774, 774, 774, 774, + 772, 772, 772, 772, 772, 772, 772, 772, + 772, 772, 772, 772, 772, 772, 772, 772, + 772, 772, 772, 772, 772, 772, 772, 772, + 772, 772, 772, 772, 772, 772, 772, 772, - 774, 774, 774, 774, 774, 774, 774, 774, - 774, 774, 774, 774, 774, 774, 774, 774, - 774, 774, 774, 774, 774, 774, 774, 774, - 774, 774, 160, 160, 160, 160, 160, 160, + 772, 772, 772, 772, 772, 772, 772, 772, + 772, 772, 772, 772, 772, 772, 772, 772, + 772, 772, 772, 772, 772, 772, 772, 772, + 772, 772, 160, 160, 160, 160, 160, 160, - 789, 790, 791, 792, 793, 794, 795, 160, + 787, 788, 789, 790, 791, 792, 792, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 796, 797, 798, 799, 800, - 160, 160, 160, 160, 160, 801, 802, 231, + 160, 160, 160, 793, 794, 795, 796, 797, + 160, 160, 160, 160, 160, 798, 799, 231, 231, 231, 231, 231, 231, 231, 231, 231, - 231, 635, 231, 231, 231, 231, 231, 231, + 231, 633, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 205, 231, 231, 231, 231, 231, 205, 231, 205, @@ -2538,7 +2538,7 @@ static const unsigned short uc_property_trie[] = { 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, - 243, 243, 243, 243, 243, 243, 600, 742, + 243, 243, 243, 243, 243, 243, 598, 740, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, @@ -2552,63 +2552,63 @@ static const unsigned short uc_property_trie[] = { 243, 243, 243, 243, 243, 243, 243, 243, 235, 235, 235, 235, 235, 235, 235, 235, - 803, 803, 803, 803, 803, 803, 803, 803, - 803, 803, 803, 803, 803, 803, 803, 803, + 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, - 803, 803, 803, 803, 803, 803, 803, 803, - 803, 803, 803, 803, 803, 803, 803, 803, + 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 243, 243, 243, 243, 243, 243, 243, 243, - 243, 243, 243, 243, 804, 239, 235, 235, + 243, 243, 243, 243, 801, 239, 235, 235, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, - 805, 806, 806, 805, 805, 807, 807, 808, - 809, 810, 160, 160, 160, 160, 160, 160, + 802, 803, 803, 802, 802, 804, 804, 805, + 806, 807, 160, 160, 160, 160, 160, 160, 139, 139, 139, 139, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 736, 747, 747, 811, 811, 600, 742, 600, - 742, 600, 742, 600, 742, 600, 742, 600, + 734, 745, 745, 808, 808, 598, 740, 598, + 740, 598, 740, 598, 740, 598, 740, 598, - 742, 600, 742, 600, 742, 752, 752, 812, - 813, 736, 736, 736, 736, 811, 811, 811, - 814, 736, 815, 160, 762, 816, 9, 9, - 747, 16, 17, 16, 17, 16, 17, 817, + 740, 598, 740, 598, 740, 750, 750, 809, + 810, 734, 734, 734, 734, 808, 808, 808, + 811, 734, 812, 160, 760, 813, 9, 9, + 745, 16, 17, 16, 17, 16, 17, 814, - 736, 736, 818, 819, 820, 821, 822, 160, - 736, 12, 13, 736, 160, 160, 160, 160, + 734, 734, 815, 816, 817, 818, 819, 160, + 734, 12, 13, 734, 160, 160, 160, 160, 243, 243, 243, 286, 243, 235, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, - 243, 243, 243, 243, 243, 235, 235, 823, - - 160, 9, 736, 817, 12, 13, 736, 736, - 16, 17, 736, 818, 814, 819, 815, 824, - 825, 826, 827, 828, 829, 830, 831, 832, - 833, 834, 816, 762, 835, 822, 836, 9, + 243, 243, 243, 243, 243, 235, 235, 820, + + 160, 9, 734, 814, 12, 13, 734, 734, + 16, 17, 734, 815, 811, 816, 812, 821, + 822, 823, 824, 825, 826, 827, 828, 829, + 830, 831, 813, 760, 832, 819, 833, 9, + + 734, 834, 834, 834, 834, 834, 834, 834, + 834, 834, 834, 834, 834, 834, 834, 834, + 834, 834, 834, 834, 834, 834, 834, 834, + 834, 834, 834, 39, 734, 41, 835, 808, + + 835, 836, 836, 836, 836, 836, 836, 836, + 836, 836, 836, 836, 836, 836, 836, 836, + 836, 836, 836, 836, 836, 836, 836, 836, + 836, 836, 836, 39, 819, 41, 819, 698, + + 699, 733, 16, 17, 732, 760, 837, 758, + 758, 758, 758, 758, 758, 758, 758, 758, + 761, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 837, 837, - 736, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, - 837, 837, 837, 39, 736, 41, 838, 811, - - 838, 839, 839, 839, 839, 839, 839, 839, - 839, 839, 839, 839, 839, 839, 839, 839, - 839, 839, 839, 839, 839, 839, 839, 839, - 839, 839, 839, 39, 822, 41, 822, 700, - - 701, 735, 16, 17, 734, 762, 840, 760, - 760, 760, 760, 760, 760, 760, 760, 760, - 763, 840, 840, 840, 840, 840, 840, 840, - 840, 840, 840, 840, 840, 840, 840, 840, - - 840, 840, 840, 840, 840, 840, 840, 840, - 840, 840, 840, 840, 840, 840, 840, 840, - 840, 840, 840, 840, 840, 840, 840, 840, - 840, 840, 840, 840, 840, 840, 763, 763, + 837, 837, 837, 837, 837, 837, 837, 837, + 837, 837, 837, 837, 837, 837, 761, 761, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, @@ -2620,10 +2620,10 @@ static const unsigned short uc_property_trie[] = { 160, 160, 90, 90, 90, 90, 90, 90, 160, 160, 90, 90, 90, 160, 160, 160, - 48, 12, 822, 838, 737, 12, 12, 160, + 48, 12, 819, 835, 735, 12, 12, 160, 49, 36, 36, 36, 36, 49, 49, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 160, 841, 841, 841, 842, 49, 843, 843, + 160, 838, 838, 838, 839, 49, 840, 840, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 160, 308, 308, 308, @@ -2650,68 +2650,68 @@ static const unsigned short uc_property_trie[] = { 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 160, 160, 160, 160, 160, - 844, 845, 846, 160, 160, 160, 160, 847, - 847, 847, 847, 847, 847, 847, 847, 847, - 847, 847, 847, 847, 847, 847, 847, 847, - 847, 847, 847, 847, 847, 847, 847, 847, + 841, 842, 843, 160, 160, 160, 160, 844, + 844, 844, 844, 844, 844, 844, 844, 844, + 844, 844, 844, 844, 844, 844, 844, 844, + 844, 844, 844, 844, 844, 844, 844, 844, - 847, 847, 847, 847, 847, 847, 847, 847, - 847, 847, 847, 847, 847, 847, 847, 847, - 847, 847, 847, 847, 160, 160, 160, 848, - 848, 848, 848, 848, 848, 848, 848, 848, + 844, 844, 844, 844, 844, 844, 844, 844, + 844, 844, 844, 844, 844, 844, 844, 844, + 844, 844, 844, 844, 160, 160, 160, 845, + 845, 845, 845, 845, 845, 845, 845, 845, - 849, 849, 849, 849, 849, 849, 849, 849, - 849, 849, 849, 849, 849, 849, 849, 849, - 849, 849, 849, 849, 849, 849, 849, 849, - 849, 849, 849, 849, 849, 849, 849, 849, + 846, 846, 846, 846, 846, 846, 846, 846, + 846, 846, 846, 846, 846, 846, 846, 846, + 846, 846, 846, 846, 846, 846, 846, 846, + 846, 846, 846, 846, 846, 846, 846, 846, - 849, 849, 849, 849, 849, 849, 849, 849, - 849, 849, 849, 849, 849, 849, 849, 849, - 849, 849, 849, 849, 849, 726, 726, 726, - 726, 418, 418, 418, 418, 418, 418, 418, + 846, 846, 846, 846, 846, 846, 846, 846, + 846, 846, 846, 846, 846, 846, 846, 846, + 846, 846, 846, 846, 846, 724, 724, 724, + 724, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, - 418, 418, 726, 160, 160, 160, 160, 160, + 418, 418, 724, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 850, 850, 850, 850, 850, 850, 850, 850, - 850, 850, 850, 850, 850, 850, 850, 850, - 850, 850, 850, 850, 850, 850, 850, 850, - 850, 850, 850, 850, 850, 850, 850, 160, + 847, 847, 847, 847, 847, 847, 847, 847, + 847, 847, 847, 847, 847, 847, 847, 847, + 847, 847, 847, 847, 847, 847, 847, 847, + 847, 847, 847, 847, 847, 847, 847, 160, - 851, 851, 851, 851, 160, 160, 160, 160, + 848, 848, 848, 848, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 850, 850, 850, 850, 850, 850, 850, 850, - 850, 850, 850, 850, 850, 850, 850, 850, + 847, 847, 847, 847, 847, 847, 847, 847, + 847, 847, 847, 847, 847, 847, 847, 847, - 850, 852, 850, 850, 850, 850, 850, 850, - 850, 850, 852, 160, 160, 160, 160, 160, + 847, 849, 847, 847, 847, 847, 847, 847, + 847, 847, 849, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, - 308, 308, 308, 308, 308, 308, 160, 844, + 308, 308, 308, 308, 308, 308, 160, 841, 323, 323, 323, 323, 160, 160, 160, 160, 323, 323, 323, 323, 323, 323, 323, 323, - 465, 853, 853, 853, 853, 853, 160, 160, + 465, 850, 850, 850, 850, 850, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 854, 854, 854, 854, 854, 854, 854, 854, - 854, 854, 854, 854, 854, 854, 854, 854, - 854, 854, 854, 854, 854, 854, 854, 854, - 854, 854, 854, 854, 854, 854, 854, 854, + 851, 851, 851, 851, 851, 851, 851, 851, + 851, 851, 851, 851, 851, 851, 851, 851, + 851, 851, 851, 851, 851, 851, 851, 851, + 851, 851, 851, 851, 851, 851, 851, 851, - 854, 854, 854, 854, 854, 854, 855, 855, - 856, 856, 856, 856, 856, 856, 856, 856, - 856, 856, 856, 856, 856, 856, 856, 856, - 856, 856, 856, 856, 856, 856, 856, 856, + 851, 851, 851, 851, 851, 851, 852, 852, + 853, 853, 853, 853, 853, 853, 853, 853, + 853, 853, 853, 853, 853, 853, 853, 853, + 853, 853, 853, 853, 853, 853, 853, 853, - 856, 856, 856, 856, 856, 856, 856, 856, - 856, 856, 856, 856, 856, 856, 857, 857, + 853, 853, 853, 853, 853, 853, 853, 853, + 853, 853, 853, 853, 853, 853, 854, 854, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, @@ -2725,35 +2725,35 @@ static const unsigned short uc_property_trie[] = { 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 858, 858, 858, 858, 858, 858, 205, 205, - 858, 205, 858, 858, 858, 858, 858, 858, - 858, 858, 858, 858, 858, 858, 858, 858, - 858, 858, 858, 858, 858, 858, 858, 858, + 855, 855, 855, 855, 855, 855, 205, 205, + 855, 205, 855, 855, 855, 855, 855, 855, + 855, 855, 855, 855, 855, 855, 855, 855, + 855, 855, 855, 855, 855, 855, 855, 855, - 858, 858, 858, 858, 858, 858, 858, 858, - 858, 858, 858, 858, 858, 858, 858, 858, - 858, 858, 858, 858, 858, 858, 205, 858, - 858, 205, 205, 205, 858, 205, 205, 858, + 855, 855, 855, 855, 855, 855, 855, 855, + 855, 855, 855, 855, 855, 855, 855, 855, + 855, 855, 855, 855, 855, 855, 205, 855, + 855, 205, 205, 205, 855, 205, 205, 855, - 859, 859, 859, 859, 859, 859, 859, 859, - 859, 859, 859, 859, 859, 859, 859, 859, - 859, 859, 859, 859, 859, 859, 860, 860, - 860, 860, 205, 205, 205, 205, 205, 861, + 856, 856, 856, 856, 856, 856, 856, 856, + 856, 856, 856, 856, 856, 856, 856, 856, + 856, 856, 856, 856, 856, 856, 857, 857, + 857, 857, 205, 205, 205, 205, 205, 858, - 862, 782, 782, 782, 205, 782, 782, 205, - 205, 205, 205, 205, 782, 152, 782, 153, - 862, 862, 862, 862, 205, 862, 862, 862, - 205, 862, 862, 862, 862, 862, 862, 862, + 859, 780, 780, 780, 205, 780, 780, 205, + 205, 205, 205, 205, 780, 152, 780, 153, + 859, 859, 859, 859, 205, 859, 859, 859, + 205, 859, 859, 859, 859, 859, 859, 859, - 862, 862, 862, 862, 862, 862, 862, 862, - 862, 862, 862, 862, 862, 862, 862, 862, - 862, 862, 862, 862, 205, 205, 205, 205, - 153, 643, 152, 205, 205, 205, 205, 781, + 859, 859, 859, 859, 859, 859, 859, 859, + 859, 859, 859, 859, 859, 859, 859, 859, + 859, 859, 859, 859, 205, 205, 205, 205, + 153, 641, 152, 205, 205, 205, 205, 779, - 863, 864, 865, 866, 867, 867, 867, 867, + 860, 861, 862, 863, 864, 864, 864, 864, 205, 205, 205, 205, 205, 205, 205, 205, - 868, 868, 868, 868, 868, 868, 868, 868, - 869, 205, 205, 205, 205, 205, 205, 205, + 865, 865, 865, 865, 865, 865, 865, 865, + 866, 205, 205, 205, 205, 205, 205, 205, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, @@ -2854,19 +2854,19 @@ static const unsigned short uc_property_trie[] = { 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 870, 870, 870, 870, 870, - 870, 870, 870, 160, 160, 160, 160, 160, + 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 481, 481, 481, 481, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, @@ -2887,67 +2887,67 @@ static const unsigned short uc_property_trie[] = { 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 160, 160, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 160, - 160, 160, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 872, 873, 874, - 874, 874, 871, 871, 871, 875, 872, 872, - 872, 872, 872, 876, 876, 876, 876, 876, - 876, 876, 876, 877, 877, 877, 877, 877, - 877, 877, 877, 871, 871, 878, 878, 878, - 878, 878, 877, 877, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 878, 878, 878, 878, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 871, 160, 160, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 160, + 160, 160, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 869, 870, 871, + 871, 871, 868, 868, 868, 872, 869, 869, + 869, 869, 869, 873, 873, 873, 873, 873, + 873, 873, 873, 874, 874, 874, 874, 874, + 874, 874, 874, 868, 868, 875, 875, 875, + 875, 875, 874, 874, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 875, 875, 875, 875, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, @@ -2998,169 +2998,169 @@ static const unsigned short uc_property_trie[] = { 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 879, 879, 879, 879, 879, 879, 879, 879, - 879, 879, 879, 879, 879, 879, 879, 879, - 879, 879, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 881, 881, - 881, 881, 881, 881, 881, 160, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 880, 160, 880, 880, - 160, 160, 880, 160, 160, 880, 880, 160, - 160, 880, 880, 880, 880, 160, 880, 880, - 880, 880, 880, 880, 880, 880, 881, 881, - 881, 881, 160, 881, 160, 881, 881, 881, - 881, 102, 881, 881, 160, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - - 881, 881, 881, 881, 880, 880, 160, 880, - 880, 880, 880, 160, 160, 880, 880, 880, - 880, 880, 880, 880, 880, 160, 880, 880, - 880, 880, 880, 880, 880, 160, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 880, 880, 160, 880, 880, 880, 880, 160, - 880, 880, 880, 880, 880, 160, 880, 160, - 160, 160, 880, 880, 880, 880, 880, 880, - 880, 160, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, + 876, 876, 876, 876, 876, 876, 876, 876, + 876, 876, 876, 876, 876, 876, 876, 876, + 876, 876, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 878, 878, + 878, 878, 878, 878, 878, 160, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 877, 160, 877, 877, + 160, 160, 877, 160, 160, 877, 877, 160, + 160, 877, 877, 877, 877, 160, 877, 877, + 877, 877, 877, 877, 877, 877, 878, 878, + 878, 878, 160, 878, 160, 878, 878, 878, + 878, 102, 878, 878, 160, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + + 878, 878, 878, 878, 877, 877, 160, 877, + 877, 877, 877, 160, 160, 877, 877, 877, + 877, 877, 877, 877, 877, 160, 877, 877, + 877, 877, 877, 877, 877, 160, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 877, 877, 160, 877, 877, 877, 877, 160, + 877, 877, 877, 877, 877, 160, 877, 160, + 160, 160, 877, 877, 877, 877, 877, 877, + 877, 160, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, - 881, 881, 881, 881, 881, 881, 881, 881, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 103, 103, 160, 160, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 882, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 882, 881, 881, 881, 881, - 881, 881, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 882, 881, 881, 881, 881, - - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 882, 881, 881, - 881, 881, 881, 881, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 882, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 882, - 881, 881, 881, 881, 881, 881, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 882, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 882, 881, 881, 881, 881, 881, 881, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 880, 880, 880, 880, 880, 880, 880, - 880, 882, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 881, 881, 881, 881, 881, - 881, 881, 881, 882, 881, 881, 881, 881, - 881, 881, 883, 725, 160, 160, 884, 885, - 886, 887, 888, 889, 890, 891, 892, 893, - 884, 885, 886, 887, 888, 889, 890, 891, - 892, 893, 884, 885, 886, 887, 888, 889, - 890, 891, 892, 893, 884, 885, 886, 887, - 888, 889, 890, 891, 892, 893, 884, 885, - 886, 887, 888, 889, 890, 891, 892, 893, - - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, + 878, 878, 878, 878, 878, 878, 878, 878, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 103, 103, 160, 160, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 879, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 879, 878, 878, 878, 878, + 878, 878, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 879, 878, 878, 878, 878, + + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 879, 878, 878, + 878, 878, 878, 878, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 879, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 879, + 878, 878, 878, 878, 878, 878, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 879, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 879, 878, 878, 878, 878, 878, 878, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, + 877, 879, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 878, 878, 878, 878, 878, + 878, 878, 878, 879, 878, 878, 878, 878, + 878, 878, 880, 723, 160, 160, 881, 882, + 883, 884, 885, 886, 887, 888, 889, 890, + 881, 882, 883, 884, 885, 886, 887, 888, + 889, 890, 881, 882, 883, 884, 885, 886, + 887, 888, 889, 890, 881, 882, 883, 884, + 885, 886, 887, 888, 889, 890, 881, 882, + 883, 884, 885, 886, 887, 888, 889, 890, + + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, @@ -3182,78 +3182,78 @@ static const unsigned short uc_property_trie[] = { 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 894, 894, + 160, 160, 160, 160, 160, 160, 891, 891, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 160, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 160, 160, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 892, 892, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, @@ -3283,22 +3283,22 @@ static const unsigned short uc_property_trie[] = { 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 160, 876, 160, 160, 160, 160, 160, 160, + 160, 873, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 876, 876, 876, 876, 876, 876, 876, 876, - 876, 876, 876, 876, 876, 876, 876, 876, - 876, 876, 876, 876, 876, 876, 876, 876, - 876, 876, 876, 876, 876, 876, 876, 876, - 876, 876, 876, 876, 876, 876, 876, 876, - 876, 876, 876, 876, 876, 876, 876, 876, - 876, 876, 876, 876, 876, 876, 876, 876, - 876, 876, 876, 876, 876, 876, 876, 876, - 876, 876, 876, 876, 876, 876, 876, 876, - 876, 876, 876, 876, 876, 876, 876, 876, - 876, 876, 876, 876, 876, 876, 876, 876, - 876, 876, 876, 876, 876, 876, 876, 876, + 873, 873, 873, 873, 873, 873, 873, 873, + 873, 873, 873, 873, 873, 873, 873, 873, + 873, 873, 873, 873, 873, 873, 873, 873, + 873, 873, 873, 873, 873, 873, 873, 873, + 873, 873, 873, 873, 873, 873, 873, 873, + 873, 873, 873, 873, 873, 873, 873, 873, + 873, 873, 873, 873, 873, 873, 873, 873, + 873, 873, 873, 873, 873, 873, 873, 873, + 873, 873, 873, 873, 873, 873, 873, 873, + 873, 873, 873, 873, 873, 873, 873, 873, + 873, 873, 873, 873, 873, 873, 873, 873, + 873, 873, 873, 873, 873, 873, 873, 873, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, @@ -3349,71 +3349,71 @@ static const unsigned short uc_property_trie[] = { 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 896, 896, - 896, 896, 896, 896, 896, 896, 894, 894, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 893, 893, + 893, 893, 893, 893, 893, 893, 891, 891, }; #define GET_PROP_INDEX(ucs4) \ @@ -3424,904 +3424,901 @@ static const unsigned short uc_property_trie[] = { #define GET_PROP_INDEX_UCS2(ucs2) \ (uc_property_trie[uc_property_trie[ucs2>>5] + (ucs2 & 0x1f)]) -static const QUnicodeTables::Properties uc_properties [] = { - { 10, 19, 18, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0}, - { 10, 15, 8, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3}, - { 10, 30, 7, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1}, - { 10, 31, 8, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3}, - { 10, 31, 9, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3}, - { 10, 29, 7, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1}, - { 10, 19, 7, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0}, - { 10, 19, 8, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0}, - { 7, 28, 9, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3}, - { 26, 5, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9}, - { 26, 2, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10}, - { 26, 11, 4, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 28, 8, 4, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 9, 4, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 2, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10}, - { 22, 0, 10, 0, 0, -1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10}, - { 23, 1, 10, 0, 0, -1, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 10}, - { 27, 8, 3, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 7, 6, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0}, - { 21, 14, 3, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 7, 6, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8}, - { 26, 6, 6, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 4, 10, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 2, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 2, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 2, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 2, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 2, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 2, 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 2, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 2, 0, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 26, 7, 6, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0}, - { 26, 7, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0}, - { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 32, 0, 0, 32, 0, 3, 5}, - { 22, 0, 10, 0, 0, -1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 10}, - { 26, 8, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 23, 1, 10, 0, 0, -1, 1, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 10}, - { 29, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 20, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -32, -32, 0, 0, 3, 4}, - { 27, 15, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 10, 11, 7, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1}, - { 7, 3, 6, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6}, - { 28, 9, 4, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 30, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4}, - { 24, 2, 10, 0, 0, -1, 1, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 10}, - { 11, 15, 18, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2}, - { 30, 9, 4, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 27, 8, 4, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 2, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 2, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 29, 16, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 743, 743, 775, 0, 3, 4}, - { 26, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0}, - { 6, 11, 2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 25, 2, 10, 0, 0, -1, 1, 0, 0, 0, 0, -16, 0, 0, 0, 0, 0, 0, 10}, - { 6, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 3, 0, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 121, 121, 0, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 1, 1, 0, 0, 0, 0, 6, 0, 0, 0, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -232, -232, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 91, 88, 0, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -121, 0, 0, -121, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -300, -300, -268, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 195, 195, 0, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 210, 0, 0, 210, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 206, 0, 0, 206, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 205, 0, 0, 205, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 79, 0, 0, 79, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 202, 0, 0, 202, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 203, 0, 0, 203, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 207, 0, 0, 207, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 97, 97, 0, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 211, 0, 0, 211, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 209, 0, 0, 209, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 163, 163, 0, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 213, 0, 0, 213, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 130, 130, 0, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 214, 0, 0, 214, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 218, 0, 0, 218, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 217, 0, 0, 217, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 219, 0, 0, 219, 0, 3, 5}, - { 19, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 56, 56, 0, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 2, 0, 1, 2, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 1, -1, 0, 1, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -2, -1, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -79, -79, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 113, 110, 0, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, -97, 0, 0, -97, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, -56, 0, 0, -56, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, -130, 0, 0, -130, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 10795, 0, 0, 10795, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, -163, 0, 0, -163, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 10792, 0, 0, 10792, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, -195, 0, 0, -195, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 69, 0, 0, 69, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 71, 0, 0, 71, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -210, -210, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -206, -206, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -205, -205, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -202, -202, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -203, -203, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -207, -207, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -209, -209, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -211, -211, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 10743, 10743, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -213, -213, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -214, -214, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 10727, 10727, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -218, -218, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -69, -69, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -217, -217, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -71, -71, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -219, -219, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4}, - { 18, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4}, - { 18, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 18, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 18, 16, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 29, 11, 10, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 18, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 29, 11, 10, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 1, 19, 17, 230, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 232, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 220, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 216, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 202, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 1, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 240, 0, -1, 1, 0, 0, 0, 0, 0, 0, 84, 84, 116, 4, 1, 0}, - { 1, 19, 17, 230, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 220, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 3, 17, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 230, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 220, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 232, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 220, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 230, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 3, 17, 233, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 3, 17, 234, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 3, 17, 233, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 3, 17, 234, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 3, 17, 233, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 230, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 0, 11, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 16, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 130, 130, 0, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 38, 0, 0, 38, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 37, 0, 0, 37, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 64, 0, 0, 64, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 63, 0, 0, 63, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 98, 94, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -38, -38, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -37, -37, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 106, 102, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -31, -31, 1, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -64, -64, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -63, -63, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -62, -62, -30, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -57, -57, -25, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -47, -47, -15, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -54, -54, -22, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -86, -86, -54, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -80, -80, -48, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, -60, 0, 0, -60, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, -96, -96, -64, 0, 3, 4}, - { 27, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 15, 11, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, -7, 0, 0, -7, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, -130, 0, 0, -130, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 80, 0, 0, 80, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 80, 0, 0, 80, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, -80, -80, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -80, -80, 0, 0, 3, 4}, - { 30, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 3, 19, 17, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 15, 0, 0, 15, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, -15, -15, 0, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 48, 0, 0, 48, 0, 3, 5}, - { 26, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -48, -48, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 55, 52, 0, 0, 3, 4}, - { 26, 7, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 9}, - { 21, 15, 10, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 0, 11, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 1, 19, 17, 220, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 230, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 222, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 228, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 10, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 11, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 12, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 13, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 14, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 15, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 16, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 17, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 18, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 19, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 19, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 20, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 21, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 22, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 26, 15, 1, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 1, 19, 17, 23, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 26, 11, 1, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 1, 19, 17, 24, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 25, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 26, 5, 1, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 1, 19, 17, 18, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 19, 11, 1, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 26, 11, 1, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 26, 11, 1, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0}, - { 11, 11, 13, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2}, - { 0, 11, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 28, 9, 13, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 5, 6, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 7, 13, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0}, - { 30, 11, 10, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 5, 13, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 5, 13, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 5, 13, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9}, - { 19, 11, 13, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 19, 11, 13, 0, 2, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 19, 11, 13, 0, 1, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 18, 11, 13, 0, 3, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 1, 19, 17, 27, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 28, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 29, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 30, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 31, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 32, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 33, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 34, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 4, 10, 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 5, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 5, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 5, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 5, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 5, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 5, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 5, 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 5, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 5, 0, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 26, 5, 4, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 10, 5, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 26, 11, 13, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 19, 11, 13, 0, 1, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 1, 19, 17, 35, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 19, 11, 13, 0, 1, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 19, 11, 13, 0, 2, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 11, 11, 13, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2}, - { 3, 19, 17, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 18, 11, 13, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 19, 11, 13, 0, 2, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 30, 11, 13, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 19, 11, 13, 0, 1, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 26, 11, 13, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9}, - { 26, 11, 13, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 11, 11, 18, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2}, - { 1, 19, 17, 36, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 19, 11, 13, 0, 1, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 19, 11, 13, 0, 2, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 19, 11, 13, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 1, 19, 17, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 19, 11, 13, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 4, 10, 1, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 1, 0, 0, 1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 1, 0, 0, 2, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 1, 0, 0, 3, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 1, 0, 0, 4, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 1, 0, 0, 5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 1, 0, 0, 6, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 1, 0, 0, 7, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 1, 0, 0, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 1, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 19, 11, 1, 0, 1, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 1, 19, 17, 230, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 220, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 18, 11, 1, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 30, 11, 10, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 11, 10, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 7, 10, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0}, - { 26, 5, 10, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9}, - { 18, 11, 1, 0, 3, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 1, 19, 17, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 2, 19, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 19, 11, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 1, 19, 17, 7, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 9, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 26, 15, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9}, - { 4, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 19, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 19, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 2, 19, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 6, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 1, 19, 17, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 2, 19, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 28, 8, 4, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 4, 10, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 1, 19, 17, 84, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 91, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 7, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 2, 19, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 19, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 1, 19, 17, 9, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 2, 19, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 26, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 19, 26, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6}, - { 1, 26, 17, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 26, 17, 103, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 26, 17, 9, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 18, 26, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6}, - { 1, 26, 17, 107, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 26, 15, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 1, 26, 17, 118, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 26, 17, 122, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 19, 11, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 30, 16, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 16, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 11, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 3, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 15, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 5, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 30, 11, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 30, 5, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 4, 10, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 6, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 7, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 9, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 6, 11, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 30, 15, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 1, 19, 17, 216, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 22, 0, 10, 0, 0, -1, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10}, - { 23, 1, 10, 0, 0, -1, 2, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 10}, - { 2, 19, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 1, 19, 17, 129, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 130, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 132, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 2, 15, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 1, 19, 17, 9, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 30, 15, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 30, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 16, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 19, 26, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6}, - { 2, 26, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6}, - { 1, 26, 17, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 26, 17, 7, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 26, 17, 9, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 4, 10, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 7, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 9, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 26, 15, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 7264, 0, 0, 7264, 0, 3, 5}, - { 19, 11, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 18, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 19, 23, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 3, 6}, - { 19, 24, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 6}, - { 19, 25, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 3, 6}, - { 30, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 15, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9}, - { 6, 11, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 0, 0, 0, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 0, 0, 0, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 0, 0, 0, 7, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 0, 0, 0, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 0, 0, 0, 9, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 30, 11, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 7, 15, 9, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3}, - { 22, 0, 10, 0, 0, -1, 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10}, - { 23, 1, 10, 0, 0, -1, 4, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 10}, - { 5, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 1, 19, 17, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 9, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 26, 15, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 11, 26, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2}, - { 26, 4, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 18, 26, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6}, - { 28, 8, 4, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 1, 26, 17, 230, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 6, 11, 10, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 11, 10, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 15, 10, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 15, 10, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9}, - { 21, 16, 10, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 7, 3, 9, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3}, - { 1, 19, 17, 228, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 2, 19, 17, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 1, 19, 17, 222, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 26, 5, 10, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9}, - { 4, 10, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 2, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 3, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 4, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 8, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 19, 26, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6}, - { 19, 26, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6}, - { 2, 26, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6}, - { 4, 10, 0, 0, 0, 1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 2, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 3, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 5, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 6, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 9, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 26, 26, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 2, 19, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 26, 15, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 2, 19, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 1, 19, 17, 7, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 2, 19, 0, 9, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 4, 10, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 2, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 3, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 4, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 6, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 7, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 26, 15, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9}, - { 26, 15, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 30, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 18, 11, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4}, - { 18, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 3814, 3814, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 119, 116, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 125, 122, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 131, 128, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 137, 134, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 143, 140, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, -59, -59, -58, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -8, 0, 0, -8, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 149, 146, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 156, 152, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 164, 160, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 172, 168, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 74, 74, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 86, 86, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 100, 100, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 128, 128, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 112, 112, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 126, 126, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 244, 8, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 247, 8, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 250, 8, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 253, 8, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 256, 8, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 259, 8, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 262, 8, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 265, 8, 0, 0, 3, 4}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 244, 0, -8, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 247, 0, -8, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 250, 0, -8, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 253, 0, -8, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 256, 0, -8, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 259, 0, -8, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 262, 0, -8, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 268, 0, -8, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 271, 8, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 274, 8, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 277, 8, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 280, 8, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 283, 8, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 286, 8, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 289, 8, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 292, 8, 0, 0, 3, 4}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 271, 0, -8, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 274, 0, -8, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 277, 0, -8, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 280, 0, -8, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 283, 0, -8, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 286, 0, -8, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 289, 0, -8, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 295, 0, -8, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 298, 8, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 301, 8, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 304, 8, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 307, 8, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 310, 8, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 313, 8, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 316, 8, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 319, 8, 0, 0, 3, 4}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 298, 0, -8, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 301, 0, -8, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 304, 0, -8, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 307, 0, -8, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 310, 0, -8, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 313, 0, -8, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 316, 0, -8, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 322, 0, -8, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 346, 343, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 325, 9, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 352, 349, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 179, 176, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 383, 379, 0, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -74, 0, 0, -74, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -9, 328, 0, -9, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -7205, -7205, -7173, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 358, 355, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 331, 9, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 364, 361, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 185, 182, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 391, 387, 0, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -86, 0, 0, -86, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -9, 334, 0, -9, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 192, 188, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 94, 94, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 199, 196, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 206, 202, 0, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -100, 0, 0, -100, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 214, 210, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 102, 102, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 221, 218, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 227, 224, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 234, 230, 0, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -112, 0, 0, -112, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -7, 0, 0, -7, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 370, 367, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 337, 9, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 376, 373, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 241, 238, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 399, 395, 0, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -128, 0, 0, -128, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -126, 0, 0, -126, 0, 3, 5}, - { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -9, 340, 0, -9, 0, 3, 5}, - { 7, 15, 9, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3}, - { 7, 3, 9, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3}, - { 11, 18, 18, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2}, - { 11, 19, 18, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 11, 19, 18, 0, 3, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 11, 19, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2}, - { 11, 19, 1, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2}, - { 21, 15, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 21, 3, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 21, 17, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 21, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 24, 2, 10, 0, 0, -1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10}, - { 25, 2, 10, 0, 0, -1, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 4, 10}, - { 22, 0, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10}, - { 24, 2, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10}, - { 25, 2, 10, 0, 0, -1, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 10}, - { 26, 13, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 15, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0}, - { 8, 31, 9, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1}, - { 9, 31, 7, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1}, - { 11, 19, 11, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2}, - { 11, 19, 14, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2}, - { 11, 19, 16, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2}, - { 11, 19, 12, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2}, - { 11, 19, 15, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2}, - { 7, 3, 6, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3}, - { 26, 9, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 4, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9}, - { 27, 7, 6, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0}, - { 26, 4, 10, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9}, - { 26, 4, 10, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9}, - { 26, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 11, 10, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 20, 11, 10, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0}, - { 26, 11, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 15, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 7, 15, 9, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3}, - { 11, 20, 18, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2}, - { 11, 11, 18, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2}, - { 11, 19, 18, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2}, - { 6, 11, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 16, 11, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4}, - { 6, 11, 2, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 2, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 2, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 2, 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 2, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 2, 0, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 3, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 28, 8, 4, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 28, 8, 4, 0, 0, -1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 28, 8, 4, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 28, 8, 4, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 3, 19, 17, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 1, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 220, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 1, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 30, 9, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 30, 8, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -7517, 0, 0, -7517, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -8383, 0, 0, -8383, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -8262, 0, 0, -8262, 0, 3, 5}, - { 30, 11, 4, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 28, 0, 0, 28, 0, 3, 5}, - { 30, 11, 10, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 15, 11, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5}, - { 30, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 16, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, -28, -28, 0, 0, 3, 4}, - { 5, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 3, 5}, - { 5, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -16, -16, 0, 0, 3, 4}, - { 5, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 2016, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 1824, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 2104, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 2108, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 2106, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, -138, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, -8, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, -7, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 10, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 10, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 10, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 10, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 10, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 10, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 10, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 10, 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 10, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 10, 0, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 2, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 30, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 26, 0, 0, 26, 0, 3, 5}, - { 30, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -26, -26, 0, 0, 3, 4}, - { 6, 11, 10, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 10, 0, 0, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 10, 0, 0, 2, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 10, 0, 0, 3, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 10, 0, 0, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 10, 0, 0, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 10, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 10, 0, 0, 7, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 10, 0, 0, 8, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 10, 0, 0, 9, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 10, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 30, 2, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10}, - { 30, 5, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 22, 0, 10, 0, 0, -1, 6, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10}, - { 23, 1, 10, 0, 0, -1, 6, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 10}, - { 27, 11, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 10, 0, 0, -1, 8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 10, 0, 0, -1, 8, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0}, - { 22, 0, 10, 0, 0, -1, 8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10}, - { 23, 1, 10, 0, 0, -1, 8, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 10}, - { 27, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0}, - { 22, 0, 10, 0, 0, -1, 6, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 10}, - { 23, 1, 10, 0, 0, -1, 6, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10}, - { 22, 0, 10, 0, 0, -1, 6, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 10}, - { 23, 1, 10, 0, 0, -1, 6, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, 0, 10}, - { 27, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, -1824, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, -2016, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, -2104, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, -2106, 0, 0, 0, 0, 0, 0, 0}, - { 27, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, -2108, 0, 0, 0, 0, 0, 0, 0}, - { 15, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 48, 0, 0, 48, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, -48, -48, 0, 0, 3, 4}, - { 15, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, -10743, 0, 0, -10743, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, -3814, 0, 0, -3814, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, -10727, 0, 0, -10727, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, -10795, -10795, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, -10792, -10792, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4}, - { 6, 11, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 16, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, -7264, -7264, 0, 0, 3, 4}, - { 26, 2, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10}, - { 24, 2, 10, 0, 0, -1, 8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10}, - { 25, 2, 10, 0, 0, -1, 8, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 10}, - { 21, 15, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 30, 12, 10, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 7, 12, 9, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3}, - { 26, 1, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 1, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9}, - { 26, 12, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 30, 12, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 18, 4, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 19, 12, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6}, - { 5, 12, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6}, - { 21, 4, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 23, 1, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10}, - { 1, 19, 17, 218, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 228, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 222, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 224, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 21, 12, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 18, 12, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6}, - { 5, 12, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6}, - { 18, 4, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 19, 4, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 26, 12, 10, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 19, 4, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6}, - { 19, 4, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6}, - { 1, 19, 17, 8, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 29, 4, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0}, - { 18, 4, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6}, - { 19, 12, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6}, - { 21, 4, 10, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0}, - { 19, 4, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6}, - { 19, 12, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6}, - { 26, 4, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 18, 4, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6}, - { 19, 12, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6}, - { 19, 12, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 30, 12, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 12, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 19, 12, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 30, 12, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 19, 4, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6}, - { 30, 12, 10, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 12, 10, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 19, 12, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6}, - { 19, 12, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6}, - { 18, 4, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 30, 12, 10, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 29, 11, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 18, 11, 10, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 29, 11, 10, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 2, 19, 17, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 1, 19, 17, 9, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 26, 16, 10, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 19, 21, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 3, 6}, - { 19, 22, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 3, 6}, - { 12, 27, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 13, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 19, 12, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 12, 9, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 18, 15, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 24, 21, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 31, 27, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 39, 35, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 46, 43, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 49, 43, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 61, 58, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 67, 64, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 73, 70, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 79, 76, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 85, 82, 0, 0, 3, 4}, - { 19, 11, 1, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 1, 19, 17, 26, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 0, 11, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 28, 9, 13, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 7, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0}, - { 26, 1, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 5, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 22, 0, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10}, - { 23, 1, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10}, - { 26, 13, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 20, 12, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0}, - { 22, 0, 10, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10}, - { 23, 1, 10, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10}, - { 26, 1, 6, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 1, 6, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9}, - { 26, 4, 6, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 12, 4, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 27, 12, 3, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 21, 12, 3, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 27, 12, 10, 0, 0, -1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, - { 27, 12, 10, 0, 0, -1, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0}, - { 27, 12, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 11, 20, 18, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2}, - { 26, 12, 6, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 4, 12, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 4, 12, 2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 4, 12, 2, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 4, 12, 2, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 4, 12, 2, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 4, 12, 2, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 4, 12, 2, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 4, 12, 2, 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 4, 12, 2, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 4, 12, 2, 0, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 27, 12, 10, 0, 0, -1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0}, - { 27, 12, 10, 0, 0, -1, 1, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0}, - { 15, 12, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 32, 0, 0, 32, 0, 3, 5}, - { 29, 12, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 16, 12, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -32, -32, 0, 0, 3, 4}, - { 19, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6}, - { 11, 19, 10, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2}, - { 30, 11, 10, 0, 0, -1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 0, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 15, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 15, 10, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 30, 15, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 30, 11, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 5, 11, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 19, 11, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 6, 11, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 5, 11, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 5, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 15, 11, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 40, 0, 0, 40, 0, 3, 5}, - { 15, 11, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 40, 0, 0, 40, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, -40, -40, 0, 0, 3, 4}, - { 16, 11, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, -40, -40, 0, 0, 3, 4}, - { 19, 11, 1, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 19, 11, 1, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 6, 11, 1, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 15, 10, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 19, 11, 1, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 6, 11, 1, 0, 0, 1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 1, 0, 0, 2, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 1, 0, 0, 3, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 1, 0, 0, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 6, 11, 1, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 15, 1, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 26, 11, 1, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 5, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6}, - { 30, 11, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 2, 19, 0, 216, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 2, 19, 0, 216, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 1, 19, 17, 1, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 2, 19, 0, 226, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 11, 19, 18, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2}, - { 1, 19, 17, 220, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 1, 19, 17, 230, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0}, - { 6, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 15, 11, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5}, - { 16, 11, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4}, - { 27, 11, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 15, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5}, - { 4, 10, 2, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 2, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 2, 0, 0, 2, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 2, 0, 0, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 2, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 2, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 2, 0, 0, 6, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 2, 0, 0, 7, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 2, 0, 0, 8, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 4, 10, 2, 0, 0, 9, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7}, - { 0, 11, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 19, 12, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6}, - { 13, 11, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +static const QUnicodeTables::Properties uc_properties[] = { + { 10, 19, 18, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0 }, + { 10, 15, 8, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3 }, + { 10, 30, 7, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1 }, + { 10, 31, 8, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3 }, + { 10, 31, 9, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3 }, + { 10, 29, 7, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1 }, + { 10, 19, 7, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0 }, + { 10, 19, 8, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0 }, + { 7, 28, 9, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3 }, + { 26, 5, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9 }, + { 26, 2, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10 }, + { 26, 11, 4, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 28, 8, 4, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 9, 4, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 2, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10 }, + { 22, 0, 10, 0, 0, -1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10 }, + { 23, 1, 10, 0, 0, -1, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 10 }, + { 27, 8, 3, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 7, 6, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0 }, + { 21, 14, 3, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 7, 6, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8 }, + { 26, 6, 6, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 4, 10, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 2, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 2, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 2, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 2, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 2, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 2, 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 2, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 2, 0, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 26, 7, 6, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0 }, + { 26, 7, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0 }, + { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 32, 0, 0, 32, 0, 3, 5 }, + { 22, 0, 10, 0, 0, -1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 10 }, + { 26, 8, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 23, 1, 10, 0, 0, -1, 1, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 10 }, + { 29, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 20, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -32, -32, 0, 0, 3, 4 }, + { 27, 15, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 10, 11, 7, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1 }, + { 7, 3, 6, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6 }, + { 28, 9, 4, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 30, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4 }, + { 24, 2, 10, 0, 0, -1, 1, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 10 }, + { 11, 15, 18, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2 }, + { 30, 9, 4, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 8, 4, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 2, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 2, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 29, 16, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 743, 743, 775, 0, 3, 4 }, + { 26, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0 }, + { 6, 11, 2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 25, 2, 10, 0, 0, -1, 1, 0, 0, 0, 0, -16, 0, 0, 0, 0, 0, 0, 10 }, + { 6, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 3, 0, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 121, 121, 0, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 1, 1, 0, 0, 0, 0, 6, 0, 0, 0, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -232, -232, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 85, 85, 0, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -121, 0, 0, -121, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -300, -300, -268, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 195, 195, 0, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 210, 0, 0, 210, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 206, 0, 0, 206, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 205, 0, 0, 205, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 79, 0, 0, 79, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 202, 0, 0, 202, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 203, 0, 0, 203, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 207, 0, 0, 207, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 97, 97, 0, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 211, 0, 0, 211, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 209, 0, 0, 209, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 163, 163, 0, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 213, 0, 0, 213, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 130, 130, 0, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 214, 0, 0, 214, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 218, 0, 0, 218, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 217, 0, 0, 217, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 219, 0, 0, 219, 0, 3, 5 }, + { 19, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 56, 56, 0, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 2, 0, 1, 2, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 1, -1, 0, 1, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -2, -1, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -79, -79, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 96, 96, 0, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, -97, 0, 0, -97, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, -56, 0, 0, -56, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, -130, 0, 0, -130, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 10795, 0, 0, 10795, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, -163, 0, 0, -163, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 10792, 0, 0, 10792, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, -195, 0, 0, -195, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 69, 0, 0, 69, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 71, 0, 0, 71, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -210, -210, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -206, -206, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -205, -205, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -202, -202, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -203, -203, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -207, -207, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -209, -209, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -211, -211, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 10743, 10743, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -213, -213, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -214, -214, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 10727, 10727, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -218, -218, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -69, -69, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -217, -217, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -71, -71, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -219, -219, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4 }, + { 18, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4 }, + { 18, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 18, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 18, 16, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 29, 11, 10, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 18, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 29, 11, 10, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 19, 17, 230, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 232, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 220, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 216, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 202, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 1, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 240, 0, -1, 1, 0, 0, 0, 0, 0, 0, 84, 84, 116, 4, 1, 0 }, + { 1, 19, 17, 230, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 220, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 3, 17, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 230, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 220, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 232, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 220, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 230, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 3, 17, 233, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 3, 17, 234, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 3, 17, 233, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 3, 17, 234, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 3, 17, 233, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 230, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 14, 11, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 16, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 130, 130, 0, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 38, 0, 0, 38, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 37, 0, 0, 37, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 64, 0, 0, 64, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 63, 0, 0, 63, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 88, 88, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -38, -38, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -37, -37, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 92, 92, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -31, -31, 1, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -64, -64, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -63, -63, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -62, -62, -30, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -57, -57, -25, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -47, -47, -15, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -54, -54, -22, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -86, -86, -54, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -80, -80, -48, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, -60, 0, 0, -60, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, -96, -96, -64, 0, 3, 4 }, + { 27, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 15, 11, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, -7, 0, 0, -7, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, -130, 0, 0, -130, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 80, 0, 0, 80, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 80, 0, 0, 80, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, -80, -80, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -80, -80, 0, 0, 3, 4 }, + { 30, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 3, 19, 17, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 15, 0, 0, 15, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, -15, -15, 0, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 48, 0, 0, 48, 0, 3, 5 }, + { 26, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -48, -48, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 52, 49, 0, 0, 3, 4 }, + { 26, 7, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 9 }, + { 21, 15, 10, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 14, 11, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 19, 17, 220, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 230, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 222, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 228, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 10, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 11, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 12, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 13, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 14, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 15, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 16, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 17, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 18, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 19, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 19, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 20, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 21, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 22, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 26, 15, 1, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 19, 17, 23, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 26, 11, 1, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 19, 17, 24, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 25, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 26, 5, 1, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 19, 17, 18, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 19, 11, 1, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 26, 11, 1, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 26, 11, 1, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0 }, + { 11, 11, 13, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2 }, + { 14, 11, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 28, 9, 13, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 5, 6, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 7, 13, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0 }, + { 30, 11, 10, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 5, 13, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 5, 13, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 5, 13, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9 }, + { 19, 11, 13, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 19, 11, 13, 0, 2, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 19, 11, 13, 0, 1, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 18, 11, 13, 0, 3, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 1, 19, 17, 27, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 28, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 29, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 30, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 31, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 32, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 33, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 34, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 4, 10, 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 5, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 5, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 5, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 5, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 5, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 5, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 5, 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 5, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 5, 0, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 26, 5, 4, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 10, 5, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 26, 11, 13, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 19, 11, 13, 0, 1, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 1, 19, 17, 35, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 19, 11, 13, 0, 1, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 19, 11, 13, 0, 2, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 11, 11, 13, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2 }, + { 3, 19, 17, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 18, 11, 13, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 19, 11, 13, 0, 2, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 30, 11, 13, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 19, 11, 13, 0, 1, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 26, 11, 13, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9 }, + { 26, 11, 13, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 11, 11, 18, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2 }, + { 1, 19, 17, 36, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 19, 11, 13, 0, 1, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 19, 11, 13, 0, 2, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 19, 11, 13, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 1, 19, 17, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 19, 11, 13, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 4, 10, 1, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 1, 0, 0, 1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 1, 0, 0, 2, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 1, 0, 0, 3, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 1, 0, 0, 4, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 1, 0, 0, 5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 1, 0, 0, 6, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 1, 0, 0, 7, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 1, 0, 0, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 1, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 19, 11, 1, 0, 1, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 1, 19, 17, 230, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 220, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 18, 11, 1, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 30, 11, 10, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 11, 10, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 7, 10, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0 }, + { 26, 5, 10, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9 }, + { 18, 11, 1, 0, 3, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 1, 19, 17, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 2, 19, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 19, 11, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 1, 19, 17, 7, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 9, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 26, 15, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9 }, + { 4, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 19, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 19, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 2, 19, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 6, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 19, 17, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 2, 19, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 28, 8, 4, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 4, 10, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 1, 19, 17, 84, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 91, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 7, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 2, 19, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 19, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 1, 19, 17, 9, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 2, 19, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 26, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 19, 26, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6 }, + { 1, 26, 17, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 26, 17, 103, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 26, 17, 9, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 18, 26, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6 }, + { 1, 26, 17, 107, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 26, 15, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 26, 17, 118, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 26, 17, 122, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 19, 11, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 30, 16, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 16, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 11, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 3, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 15, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 5, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 30, 11, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 30, 5, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 4, 10, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 6, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 7, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 9, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 6, 11, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 30, 15, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 19, 17, 216, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 22, 0, 10, 0, 0, -1, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10 }, + { 23, 1, 10, 0, 0, -1, 2, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 10 }, + { 2, 19, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 19, 17, 129, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 130, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 132, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 2, 15, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 1, 19, 17, 9, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 30, 15, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 30, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 16, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 19, 26, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6 }, + { 2, 26, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6 }, + { 1, 26, 17, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 26, 17, 7, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 26, 17, 9, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 4, 10, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 7, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 9, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 26, 15, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 7264, 0, 0, 7264, 0, 3, 5 }, + { 19, 11, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 18, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 19, 23, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 3, 6 }, + { 19, 24, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 6 }, + { 19, 25, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 3, 6 }, + { 30, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 15, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9 }, + { 6, 11, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 0, 0, 0, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 0, 0, 0, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 0, 0, 0, 7, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 0, 0, 0, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 0, 0, 0, 9, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 30, 11, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 7, 15, 9, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3 }, + { 22, 0, 10, 0, 0, -1, 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10 }, + { 23, 1, 10, 0, 0, -1, 4, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 10 }, + { 5, 11, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 1, 19, 17, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 9, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 26, 15, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 11, 26, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2 }, + { 26, 4, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 18, 26, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6 }, + { 28, 8, 4, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 26, 17, 230, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 6, 11, 10, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 11, 10, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 15, 10, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 15, 10, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9 }, + { 21, 16, 10, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 7, 3, 9, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3 }, + { 1, 19, 17, 228, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 2, 19, 17, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 1, 19, 17, 222, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 26, 5, 10, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9 }, + { 4, 10, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 2, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 3, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 4, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 8, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 19, 26, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6 }, + { 19, 26, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6 }, + { 2, 26, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6 }, + { 4, 10, 0, 0, 0, 1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 2, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 3, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 5, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 6, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 9, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 26, 26, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 2, 19, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 26, 15, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 2, 19, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 1, 19, 17, 7, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 2, 19, 0, 9, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 4, 10, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 2, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 3, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 4, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 6, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 7, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 26, 15, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9 }, + { 26, 15, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 30, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 18, 11, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4 }, + { 18, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 3814, 3814, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 99, 99, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 102, 102, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 105, 105, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 108, 108, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 111, 111, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, -59, -59, -58, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -8, 0, 0, -8, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 114, 114, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 117, 117, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 121, 121, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 125, 125, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 74, 74, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 86, 86, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 100, 100, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 128, 128, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 112, 112, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 126, 126, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 163, 8, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 166, 8, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 169, 8, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 172, 8, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 175, 8, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 178, 8, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 181, 8, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 184, 8, 0, 0, 3, 4 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 163, 0, -8, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 166, 0, -8, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 169, 0, -8, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 172, 0, -8, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 175, 0, -8, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 178, 0, -8, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 181, 0, -8, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 184, 0, -8, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 187, 8, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 190, 8, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 193, 8, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 196, 8, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 199, 8, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 202, 8, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 205, 8, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 208, 8, 0, 0, 3, 4 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 187, 0, -8, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 190, 0, -8, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 193, 0, -8, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 196, 0, -8, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 199, 0, -8, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 202, 0, -8, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 205, 0, -8, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 208, 0, -8, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 211, 8, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 214, 8, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 217, 8, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 220, 8, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 223, 8, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 226, 8, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 229, 8, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 232, 8, 0, 0, 3, 4 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 211, 0, -8, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 214, 0, -8, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 217, 0, -8, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 220, 0, -8, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 223, 0, -8, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 226, 0, -8, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 229, 0, -8, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -8, 232, 0, -8, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 247, 244, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 235, 9, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 253, 250, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 129, 129, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 284, 280, 0, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -74, 0, 0, -74, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -9, 235, 0, -9, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -7205, -7205, -7173, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 259, 256, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 238, 9, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 265, 262, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 132, 132, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 292, 288, 0, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -86, 0, 0, -86, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -9, 238, 0, -9, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 135, 135, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 139, 139, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 142, 142, 0, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -100, 0, 0, -100, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 146, 146, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 150, 150, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 153, 153, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 156, 156, 0, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -112, 0, 0, -112, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -7, 0, 0, -7, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 271, 268, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, 0, 241, 9, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 277, 274, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 160, 160, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 300, 296, 0, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -128, 0, 0, -128, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -126, 0, 0, -126, 0, 3, 5 }, + { 17, 11, 0, 0, 0, -1, 1, 0, 1, 0, 0, 0, -9, 241, 0, -9, 0, 3, 5 }, + { 7, 15, 9, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3 }, + { 7, 3, 9, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3 }, + { 11, 18, 18, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2 }, + { 11, 19, 18, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 11, 19, 18, 0, 3, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 11, 19, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2 }, + { 11, 19, 1, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2 }, + { 21, 15, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 21, 3, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 21, 17, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 21, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 24, 2, 10, 0, 0, -1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10 }, + { 25, 2, 10, 0, 0, -1, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 4, 10 }, + { 22, 0, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10 }, + { 24, 2, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10 }, + { 25, 2, 10, 0, 0, -1, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 10 }, + { 26, 13, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 15, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0 }, + { 8, 31, 9, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1 }, + { 9, 31, 7, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1 }, + { 11, 19, 11, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2 }, + { 11, 19, 14, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2 }, + { 11, 19, 16, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2 }, + { 11, 19, 12, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2 }, + { 11, 19, 15, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2 }, + { 7, 3, 6, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3 }, + { 26, 9, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 4, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9 }, + { 27, 7, 6, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0 }, + { 26, 4, 10, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9 }, + { 26, 4, 10, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9 }, + { 26, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 11, 10, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 20, 11, 10, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0 }, + { 26, 11, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 15, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 7, 15, 9, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3 }, + { 11, 20, 18, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2 }, + { 11, 11, 18, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2 }, + { 11, 19, 18, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2 }, + { 6, 11, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 16, 11, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4 }, + { 6, 11, 2, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 2, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 2, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 2, 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 2, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 2, 0, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 3, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 28, 8, 4, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 28, 8, 4, 0, 0, -1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 28, 8, 4, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 28, 8, 4, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 3, 19, 17, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 1, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 220, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 1, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 30, 9, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 30, 8, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -7517, 0, 0, -7517, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -8383, 0, 0, -8383, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -8262, 0, 0, -8262, 0, 3, 5 }, + { 30, 11, 4, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 15, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 28, 0, 0, 28, 0, 3, 5 }, + { 30, 11, 10, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 15, 11, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5 }, + { 30, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 16, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, -28, -28, 0, 0, 3, 4 }, + { 5, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 3, 5 }, + { 5, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -16, -16, 0, 0, 3, 4 }, + { 5, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 2016, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 1824, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 2104, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 2108, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, 2106, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 10, 0, 0, -1, 1, 0, 0, 0, 0, -138, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, -8, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, -7, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 10, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 10, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 10, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 10, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 10, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 10, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 10, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 10, 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 10, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 10, 0, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 2, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 30, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 26, 0, 0, 26, 0, 3, 5 }, + { 30, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -26, -26, 0, 0, 3, 4 }, + { 6, 11, 10, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 10, 0, 0, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 10, 0, 0, 2, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 10, 0, 0, 3, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 10, 0, 0, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 10, 0, 0, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 10, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 10, 0, 0, 7, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 10, 0, 0, 8, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 10, 0, 0, 9, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 10, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 30, 2, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10 }, + { 30, 5, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 22, 0, 10, 0, 0, -1, 6, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10 }, + { 23, 1, 10, 0, 0, -1, 6, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 10 }, + { 27, 11, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 10, 0, 0, -1, 8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 10, 0, 0, -1, 8, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0 }, + { 22, 0, 10, 0, 0, -1, 8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10 }, + { 23, 1, 10, 0, 0, -1, 8, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 10 }, + { 27, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0 }, + { 22, 0, 10, 0, 0, -1, 6, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 10 }, + { 23, 1, 10, 0, 0, -1, 6, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10 }, + { 22, 0, 10, 0, 0, -1, 6, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 10 }, + { 23, 1, 10, 0, 0, -1, 6, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, 0, 10 }, + { 27, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, -1824, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, -2016, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, -2104, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, -2106, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 11, 10, 0, 0, -1, 6, 0, 0, 0, 0, -2108, 0, 0, 0, 0, 0, 0, 0 }, + { 15, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 48, 0, 0, 48, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, -48, -48, 0, 0, 3, 4 }, + { 15, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, -10743, 0, 0, -10743, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, -3814, 0, 0, -3814, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, -10727, 0, 0, -10727, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, -10795, -10795, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, -10792, -10792, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4 }, + { 6, 11, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 16, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, -7264, -7264, 0, 0, 3, 4 }, + { 26, 2, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10 }, + { 24, 2, 10, 0, 0, -1, 8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 10 }, + { 25, 2, 10, 0, 0, -1, 8, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 10 }, + { 21, 15, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 30, 12, 10, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 7, 12, 9, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3 }, + { 26, 1, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 1, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9 }, + { 26, 12, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 30, 12, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 18, 4, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 19, 12, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6 }, + { 5, 12, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6 }, + { 21, 4, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 23, 1, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10 }, + { 1, 19, 17, 218, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 228, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 222, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 224, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 21, 12, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 18, 12, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6 }, + { 5, 12, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6 }, + { 18, 4, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 19, 4, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 26, 12, 10, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 19, 4, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6 }, + { 19, 4, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6 }, + { 1, 19, 17, 8, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 29, 4, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0 }, + { 18, 4, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6 }, + { 19, 12, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6 }, + { 21, 4, 10, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0 }, + { 19, 4, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6 }, + { 19, 12, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6 }, + { 26, 4, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 18, 4, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6 }, + { 19, 12, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6 }, + { 19, 12, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 30, 12, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 12, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 19, 12, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 30, 12, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 19, 4, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6 }, + { 30, 12, 10, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 12, 10, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 19, 12, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6 }, + { 19, 12, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6 }, + { 18, 4, 0, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 30, 12, 10, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 29, 11, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 18, 11, 10, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 29, 11, 10, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 2, 19, 17, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 19, 17, 9, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 26, 16, 10, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 19, 21, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 3, 6 }, + { 19, 22, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 3, 6 }, + { 12, 27, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 13, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 19, 12, 0, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 12, 9, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 18, 15, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 24, 21, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 31, 27, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 39, 35, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 46, 43, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 58, 55, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 64, 61, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 70, 67, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 76, 73, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 1, 0, 1, 1, 0, 0, 0, 82, 79, 0, 0, 3, 4 }, + { 19, 11, 1, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 1, 19, 17, 26, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 14, 11, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 28, 9, 13, 0, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 7, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0 }, + { 26, 1, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 5, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 22, 0, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10 }, + { 23, 1, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10 }, + { 26, 13, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 20, 12, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0 }, + { 22, 0, 10, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10 }, + { 23, 1, 10, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10 }, + { 26, 1, 6, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 1, 6, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9 }, + { 26, 4, 6, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 12, 4, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 12, 3, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 21, 12, 3, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 12, 10, 0, 0, -1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 12, 10, 0, 0, -1, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 12, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 11, 20, 18, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2 }, + { 26, 12, 6, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 4, 12, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 4, 12, 2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 4, 12, 2, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 4, 12, 2, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 4, 12, 2, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 4, 12, 2, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 4, 12, 2, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 4, 12, 2, 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 4, 12, 2, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 4, 12, 2, 0, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 12, 10, 0, 0, -1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0 }, + { 27, 12, 10, 0, 0, -1, 1, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0 }, + { 15, 12, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 32, 0, 0, 32, 0, 3, 5 }, + { 29, 12, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 16, 12, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -32, -32, 0, 0, 3, 4 }, + { 19, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6 }, + { 11, 19, 10, 0, 0, -1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2 }, + { 30, 11, 10, 0, 0, -1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 14, 11, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 15, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 15, 10, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 30, 15, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 30, 11, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 5, 11, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 19, 11, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 6, 11, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 5, 11, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 5, 11, 0, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 15, 11, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 40, 0, 0, 40, 0, 3, 5 }, + { 15, 11, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 40, 0, 0, 40, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, -40, -40, 0, 0, 3, 4 }, + { 16, 11, 0, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, -40, -40, 0, 0, 3, 4 }, + { 19, 11, 1, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 19, 11, 1, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 6, 11, 1, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 15, 10, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 19, 11, 1, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 6, 11, 1, 0, 0, 1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 1, 0, 0, 2, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 1, 0, 0, 3, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 1, 0, 0, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 6, 11, 1, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 15, 1, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 26, 11, 1, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 5, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6 }, + { 30, 11, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 2, 19, 0, 216, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 2, 19, 0, 216, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 19, 17, 1, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 2, 19, 0, 226, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 11, 19, 18, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2 }, + { 1, 19, 17, 220, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 1, 19, 17, 230, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, + { 6, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 15, 11, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5 }, + { 16, 11, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4 }, + { 27, 11, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 15, 11, 0, 0, 0, -1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5 }, + { 4, 10, 2, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 2, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 2, 0, 0, 2, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 2, 0, 0, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 2, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 2, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 2, 0, 0, 6, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 2, 0, 0, 7, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 2, 0, 0, 8, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 4, 10, 2, 0, 0, 9, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7 }, + { 14, 11, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 19, 12, 0, 0, 0, -1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6 }, + { 13, 11, 0, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }; static inline const QUnicodeTables::Properties *qGetProp(uint ucs4) @@ -4348,35 +4345,103 @@ Q_CORE_EXPORT const QUnicodeTables::Properties * QT_FASTCALL QUnicodeTables::pro return uc_properties + index; } -#define CURRENT_VERSION QChar::Unicode_5_0 - -static const ushort specialCaseMap [] = { - 0x53, 0x73, 0x0, 0x53, 0x53, 0x0, 0x69, 0x307, 0x0, 0x46, 0x66, 0x0, 0x46, 0x46, 0x0, 0x46, - 0x69, 0x0, 0x46, 0x49, 0x0, 0x46, 0x6c, 0x0, 0x46, 0x4c, 0x0, 0x46, 0x66, 0x69, 0x0, 0x46, - 0x46, 0x49, 0x0, 0x46, 0x66, 0x6c, 0x0, 0x46, 0x46, 0x4c, 0x0, 0x53, 0x74, 0x0, 0x53, 0x54, - 0x0, 0x53, 0x54, 0x0, 0x535, 0x582, 0x0, 0x535, 0x552, 0x0, 0x544, 0x576, 0x0, 0x544, 0x546, 0x0, - 0x544, 0x565, 0x0, 0x544, 0x535, 0x0, 0x544, 0x56b, 0x0, 0x544, 0x53b, 0x0, 0x54e, 0x576, 0x0, 0x54e, - 0x546, 0x0, 0x544, 0x56d, 0x0, 0x544, 0x53d, 0x0, 0x2bc, 0x4e, 0x0, 0x2bc, 0x4e, 0x0, 0x399, 0x308, - 0x301, 0x0, 0x399, 0x308, 0x301, 0x0, 0x3a5, 0x308, 0x301, 0x0, 0x3a5, 0x308, 0x301, 0x0, 0x4a, 0x30c, - 0x0, 0x4a, 0x30c, 0x0, 0x48, 0x331, 0x0, 0x48, 0x331, 0x0, 0x54, 0x308, 0x0, 0x54, 0x308, 0x0, - 0x57, 0x30a, 0x0, 0x57, 0x30a, 0x0, 0x59, 0x30a, 0x0, 0x59, 0x30a, 0x0, 0x41, 0x2be, 0x0, 0x41, - 0x2be, 0x0, 0x3a5, 0x313, 0x0, 0x3a5, 0x313, 0x0, 0x3a5, 0x313, 0x300, 0x0, 0x3a5, 0x313, 0x300, 0x0, - 0x3a5, 0x313, 0x301, 0x0, 0x3a5, 0x313, 0x301, 0x0, 0x3a5, 0x313, 0x342, 0x0, 0x3a5, 0x313, 0x342, 0x0, - 0x391, 0x342, 0x0, 0x391, 0x342, 0x0, 0x397, 0x342, 0x0, 0x397, 0x342, 0x0, 0x399, 0x308, 0x300, 0x0, - 0x399, 0x308, 0x300, 0x0, 0x399, 0x342, 0x0, 0x399, 0x342, 0x0, 0x399, 0x308, 0x342, 0x0, 0x399, 0x308, - 0x342, 0x0, 0x3a5, 0x308, 0x300, 0x0, 0x3a5, 0x308, 0x300, 0x0, 0x3a1, 0x313, 0x0, 0x3a1, 0x313, 0x0, - 0x3a5, 0x342, 0x0, 0x3a5, 0x342, 0x0, 0x3a5, 0x308, 0x342, 0x0, 0x3a5, 0x308, 0x342, 0x0, 0x3a9, 0x342, - 0x0, 0x3a9, 0x342, 0x0, 0x1f08, 0x399, 0x0, 0x1f09, 0x399, 0x0, 0x1f0a, 0x399, 0x0, 0x1f0b, 0x399, 0x0, - 0x1f0c, 0x399, 0x0, 0x1f0d, 0x399, 0x0, 0x1f0e, 0x399, 0x0, 0x1f0f, 0x399, 0x0, 0x1f0f, 0x399, 0x0, 0x1f28, - 0x399, 0x0, 0x1f29, 0x399, 0x0, 0x1f2a, 0x399, 0x0, 0x1f2b, 0x399, 0x0, 0x1f2c, 0x399, 0x0, 0x1f2d, 0x399, - 0x0, 0x1f2e, 0x399, 0x0, 0x1f2f, 0x399, 0x0, 0x1f2f, 0x399, 0x0, 0x1f68, 0x399, 0x0, 0x1f69, 0x399, 0x0, - 0x1f6a, 0x399, 0x0, 0x1f6b, 0x399, 0x0, 0x1f6c, 0x399, 0x0, 0x1f6d, 0x399, 0x0, 0x1f6e, 0x399, 0x0, 0x1f6f, - 0x399, 0x0, 0x1f6f, 0x399, 0x0, 0x391, 0x399, 0x0, 0x391, 0x399, 0x0, 0x397, 0x399, 0x0, 0x397, 0x399, - 0x0, 0x3a9, 0x399, 0x0, 0x3a9, 0x399, 0x0, 0x1fba, 0x345, 0x0, 0x1fba, 0x399, 0x0, 0x386, 0x345, 0x0, - 0x386, 0x399, 0x0, 0x1fca, 0x345, 0x0, 0x1fca, 0x399, 0x0, 0x389, 0x345, 0x0, 0x389, 0x399, 0x0, 0x1ffa, - 0x345, 0x0, 0x1ffa, 0x399, 0x0, 0x38f, 0x345, 0x0, 0x38f, 0x399, 0x0, 0x391, 0x342, 0x345, 0x0, 0x391, - 0x342, 0x399, 0x0, 0x397, 0x342, 0x345, 0x0, 0x397, 0x342, 0x399, 0x0, 0x3a9, 0x342, 0x345, 0x0, 0x3a9, - 0x342, 0x399, 0x0 +static const ushort specialCaseMap[] = { + 0x53, 0x73, 0x0, + 0x53, 0x53, 0x0, + 0x69, 0x307, 0x0, + 0x46, 0x66, 0x0, + 0x46, 0x46, 0x0, + 0x46, 0x69, 0x0, + 0x46, 0x49, 0x0, + 0x46, 0x6c, 0x0, + 0x46, 0x4c, 0x0, + 0x46, 0x66, 0x69, 0x0, + 0x46, 0x46, 0x49, 0x0, + 0x46, 0x66, 0x6c, 0x0, + 0x46, 0x46, 0x4c, 0x0, + 0x53, 0x74, 0x0, + 0x53, 0x54, 0x0, + 0x535, 0x582, 0x0, + 0x535, 0x552, 0x0, + 0x544, 0x576, 0x0, + 0x544, 0x546, 0x0, + 0x544, 0x565, 0x0, + 0x544, 0x535, 0x0, + 0x544, 0x56b, 0x0, + 0x544, 0x53b, 0x0, + 0x54e, 0x576, 0x0, + 0x54e, 0x546, 0x0, + 0x544, 0x56d, 0x0, + 0x544, 0x53d, 0x0, + 0x2bc, 0x4e, 0x0, + 0x399, 0x308, 0x301, 0x0, + 0x3a5, 0x308, 0x301, 0x0, + 0x4a, 0x30c, 0x0, + 0x48, 0x331, 0x0, + 0x54, 0x308, 0x0, + 0x57, 0x30a, 0x0, + 0x59, 0x30a, 0x0, + 0x41, 0x2be, 0x0, + 0x3a5, 0x313, 0x0, + 0x3a5, 0x313, 0x300, 0x0, + 0x3a5, 0x313, 0x301, 0x0, + 0x3a5, 0x313, 0x342, 0x0, + 0x391, 0x342, 0x0, + 0x397, 0x342, 0x0, + 0x399, 0x308, 0x300, 0x0, + 0x399, 0x342, 0x0, + 0x399, 0x308, 0x342, 0x0, + 0x3a5, 0x308, 0x300, 0x0, + 0x3a1, 0x313, 0x0, + 0x3a5, 0x342, 0x0, + 0x3a5, 0x308, 0x342, 0x0, + 0x3a9, 0x342, 0x0, + 0x1f08, 0x399, 0x0, + 0x1f09, 0x399, 0x0, + 0x1f0a, 0x399, 0x0, + 0x1f0b, 0x399, 0x0, + 0x1f0c, 0x399, 0x0, + 0x1f0d, 0x399, 0x0, + 0x1f0e, 0x399, 0x0, + 0x1f0f, 0x399, 0x0, + 0x1f28, 0x399, 0x0, + 0x1f29, 0x399, 0x0, + 0x1f2a, 0x399, 0x0, + 0x1f2b, 0x399, 0x0, + 0x1f2c, 0x399, 0x0, + 0x1f2d, 0x399, 0x0, + 0x1f2e, 0x399, 0x0, + 0x1f2f, 0x399, 0x0, + 0x1f68, 0x399, 0x0, + 0x1f69, 0x399, 0x0, + 0x1f6a, 0x399, 0x0, + 0x1f6b, 0x399, 0x0, + 0x1f6c, 0x399, 0x0, + 0x1f6d, 0x399, 0x0, + 0x1f6e, 0x399, 0x0, + 0x1f6f, 0x399, 0x0, + 0x391, 0x399, 0x0, + 0x397, 0x399, 0x0, + 0x3a9, 0x399, 0x0, + 0x1fba, 0x345, 0x0, + 0x1fba, 0x399, 0x0, + 0x386, 0x345, 0x0, + 0x386, 0x399, 0x0, + 0x1fca, 0x345, 0x0, + 0x1fca, 0x399, 0x0, + 0x389, 0x345, 0x0, + 0x389, 0x399, 0x0, + 0x1ffa, 0x345, 0x0, + 0x1ffa, 0x399, 0x0, + 0x38f, 0x345, 0x0, + 0x38f, 0x399, 0x0, + 0x391, 0x342, 0x345, 0x0, + 0x391, 0x342, 0x399, 0x0, + 0x397, 0x342, 0x345, 0x0, + 0x397, 0x342, 0x399, 0x0, + 0x3a9, 0x342, 0x345, 0x0, + 0x3a9, 0x342, 0x399, 0x0 + }; #define SPECIAL_CASE_MAX_LEN 3 @@ -7700,7 +7765,7 @@ static const unsigned short uc_ligature_trie[] = { #define GET_LIGATURE_INDEX(u2) (u2 < 0x3100 ? uc_ligature_trie[uc_ligature_trie[u2>>5] + (u2 & 0x1f)] : 0xffff); -static const unsigned short uc_ligature_map [] = { +static const unsigned short uc_ligature_map[] = { 0x54, 0x41, 0xc0, 0x45, 0xc8, 0x49, 0xcc, 0x4e, 0x1f8, 0x4f, 0xd2, 0x55, 0xd9, 0x57, 0x1e80, 0x59, @@ -9401,5 +9466,4 @@ static const unsigned char uc_scripts[] = { } // namespace QUnicodeTables - QT_END_NAMESPACE diff --git a/src/corelib/tools/qunicodetables_p.h b/src/corelib/tools/qunicodetables_p.h index 9b0b7cf..5c7cc08 100644 --- a/src/corelib/tools/qunicodetables_p.h +++ b/src/corelib/tools/qunicodetables_p.h @@ -59,33 +59,37 @@ QT_BEGIN_NAMESPACE +#define UNICODE_DATA_VERSION QChar::Unicode_5_0 + +#define UNICODE_LAST_CODEPOINT 0x10ffff + namespace QUnicodeTables { + struct Properties { - ushort category : 8; - ushort line_break_class : 8; - ushort direction : 8; - ushort combiningClass :8; - ushort joining : 2; + ushort category : 8; /* 5 needed */ + ushort line_break_class : 8; /* 6 needed */ + ushort direction : 8; /* 5 needed */ + ushort combiningClass : 8; + ushort joining : 2; signed short digitValue : 6; /* 5 needed */ - ushort unicodeVersion : 4; + ushort unicodeVersion : 4; ushort lowerCaseSpecial : 1; ushort upperCaseSpecial : 1; ushort titleCaseSpecial : 1; - ushort caseFoldSpecial : 1; /* currently unused */ - signed short mirrorDiff : 16; + ushort caseFoldSpecial : 1; /* currently unused */ + signed short mirrorDiff : 16; signed short lowerCaseDiff : 16; signed short upperCaseDiff : 16; signed short titleCaseDiff : 16; - signed short caseFoldDiff : 16; - ushort graphemeBreak : 8; - ushort wordBreak : 8; - ushort sentenceBreak : 8; + signed short caseFoldDiff : 16; + ushort graphemeBreak : 8; /* 4 needed */ + ushort wordBreak : 8; /* 4 needed */ + ushort sentenceBreak : 8; /* 4 needed */ }; Q_CORE_EXPORT const Properties * QT_FASTCALL properties(uint ucs4); Q_CORE_EXPORT const Properties * QT_FASTCALL properties(ushort ucs2); // See http://www.unicode.org/reports/tr24/tr24-5.html - enum Script { Common, Greek, @@ -172,19 +176,8 @@ namespace QUnicodeTables { }; - Q_CORE_EXPORT QUnicodeTables::LineBreakClass QT_FASTCALL lineBreakClass(uint ucs4); - inline int lineBreakClass(const QChar &ch) { - return QUnicodeTables::lineBreakClass(ch.unicode()); - } - - Q_CORE_EXPORT int QT_FASTCALL script(uint ucs4); - inline int script(const QChar &ch) { - return script(ch.unicode()); - } - - enum GraphemeBreak { - GraphemeBreakOther, + GraphemeBreakOther, GraphemeBreakCR, GraphemeBreakLF, GraphemeBreakControl, @@ -224,8 +217,16 @@ namespace QUnicodeTables { }; -} + Q_CORE_EXPORT QUnicodeTables::LineBreakClass QT_FASTCALL lineBreakClass(uint ucs4); + inline int lineBreakClass(const QChar &ch) + { return lineBreakClass(ch.unicode()); } + + Q_CORE_EXPORT int QT_FASTCALL script(uint ucs4); + inline int script(const QChar &ch) + { return script(ch.unicode()); } + +} // namespace QUnicodeTables QT_END_NAMESPACE -#endif +#endif // QUNICODETABLES_P_H -- cgit v0.12 From a07f8f6eea05729376ca19d221a5f8113f97cdca Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 5 Mar 2010 16:56:59 +0100 Subject: check in MAC_APPLICATION_MENU translations these are stolen directly from mac and should not be altered. extracted from patch by Prasanth. Task-number: QTBUG-4463 --- translations/qt_da.ts | 23 +++++++++++++++++++++++ translations/qt_de.ts | 23 +++++++++++++++++++++++ translations/qt_es.ts | 23 +++++++++++++++++++++++ translations/qt_fr.ts | 23 +++++++++++++++++++++++ translations/qt_ja_JP.ts | 23 +++++++++++++++++++++++ translations/qt_pl.ts | 23 +++++++++++++++++++++++ translations/qt_pt.ts | 23 +++++++++++++++++++++++ translations/qt_ru.ts | 23 +++++++++++++++++++++++ translations/qt_sv.ts | 23 +++++++++++++++++++++++ translations/qt_zh_CN.ts | 23 +++++++++++++++++++++++ translations/qt_zh_TW.ts | 23 +++++++++++++++++++++++ 11 files changed, 253 insertions(+) diff --git a/translations/qt_da.ts b/translations/qt_da.ts index 6267bb2..515ed50 100644 --- a/translations/qt_da.ts +++ b/translations/qt_da.ts @@ -2,6 +2,29 @@ + MAC_APPLICATION_MENU + + + Services + Tjenester + + + + Hide %1 + Skjul %1 + + + + Hide Others + Skjul andre + + + + Show All + Vis alle + + + AudioOutput diff --git a/translations/qt_de.ts b/translations/qt_de.ts index f02a7bb..2108774 100644 --- a/translations/qt_de.ts +++ b/translations/qt_de.ts @@ -2,6 +2,29 @@ + MAC_APPLICATION_MENU + + + Services + Dienste + + + + Hide %1 + %1 ausblenden + + + + Hide Others + Andere ausblenden + + + + Show All + Alle anzeigen + + + CloseButton diff --git a/translations/qt_es.ts b/translations/qt_es.ts index e65f092..596864a 100644 --- a/translations/qt_es.ts +++ b/translations/qt_es.ts @@ -2,6 +2,29 @@ + MAC_APPLICATION_MENU + + + Services + Servicios + + + + Hide %1 + Ocultar %1 + + + + Hide Others + Ocultar otros + + + + Show All + Mostrar todo + + + AudioOutput diff --git a/translations/qt_fr.ts b/translations/qt_fr.ts index 3186a1f..322fb65 100644 --- a/translations/qt_fr.ts +++ b/translations/qt_fr.ts @@ -2,6 +2,29 @@ + MAC_APPLICATION_MENU + + + Services + Services + + + + Hide %1 + Masquer %1 + + + + Hide Others + Masquer les autres + + + + Show All + Tout afficher + + + AudioOutput diff --git a/translations/qt_ja_JP.ts b/translations/qt_ja_JP.ts index 493f3a2..f0dae3a 100644 --- a/translations/qt_ja_JP.ts +++ b/translations/qt_ja_JP.ts @@ -2,6 +2,29 @@ + MAC_APPLICATION_MENU + + + Services + サービス + + + + Hide %1 + %1を隠す + + + + Hide Others + ほかを隠す + + + + Show All + すべてを表示 + + + CloseButton diff --git a/translations/qt_pl.ts b/translations/qt_pl.ts index e219c9a..bf6e1fe 100644 --- a/translations/qt_pl.ts +++ b/translations/qt_pl.ts @@ -2,6 +2,29 @@ + MAC_APPLICATION_MENU + + + Services + Usługi + + + + Hide %1 + Ukryj %1 + + + + Hide Others + Ukryj pozostałe + + + + Show All + Pokaż wszystko + + + CloseButton diff --git a/translations/qt_pt.ts b/translations/qt_pt.ts index 101267c..7ca7fe7 100644 --- a/translations/qt_pt.ts +++ b/translations/qt_pt.ts @@ -2,6 +2,29 @@ + MAC_APPLICATION_MENU + + + Services + Serviços + + + + Hide %1 + Ocultar %1 + + + + Hide Others + Ocultar Outros + + + + Show All + Mostrar Tudo + + + AudioOutput diff --git a/translations/qt_ru.ts b/translations/qt_ru.ts index f2d1af2..9079a6b 100644 --- a/translations/qt_ru.ts +++ b/translations/qt_ru.ts @@ -2,6 +2,29 @@ + MAC_APPLICATION_MENU + + + Services + Службы + + + + Hide %1 + Скрыть %1 + + + + Hide Others + Скрыть остальные + + + + Show All + Показать все + + + CloseButton diff --git a/translations/qt_sv.ts b/translations/qt_sv.ts index 61fc081..391af4a 100644 --- a/translations/qt_sv.ts +++ b/translations/qt_sv.ts @@ -2,6 +2,29 @@ + MAC_APPLICATION_MENU + + + Services + Tjänster + + + + Hide %1 + Göm %1 + + + + Hide Others + Göm övriga + + + + Show All + Visa alla + + + AudioOutput diff --git a/translations/qt_zh_CN.ts b/translations/qt_zh_CN.ts index a3f20a1..d6a995d 100644 --- a/translations/qt_zh_CN.ts +++ b/translations/qt_zh_CN.ts @@ -2,6 +2,29 @@ + MAC_APPLICATION_MENU + + + Services + 服务 + + + + Hide %1 + 隐藏%1 + + + + Hide Others + 隐藏其他 + + + + Show All + 全部显示 + + + AudioOutput diff --git a/translations/qt_zh_TW.ts b/translations/qt_zh_TW.ts index a2cd27e..50c0048 100644 --- a/translations/qt_zh_TW.ts +++ b/translations/qt_zh_TW.ts @@ -2,6 +2,29 @@ + MAC_APPLICATION_MENU + + + Services + 服務 + + + + Hide %1 + 隱藏%1 + + + + Hide Others + 隱藏其他 + + + + Show All + 顯示全部 + + + AudioOutput -- cgit v0.12 From 4d263d64e561a07518985be1a111207a9243bf8d Mon Sep 17 00:00:00 2001 From: Mark Brand Date: Fri, 5 Mar 2010 17:04:30 +0100 Subject: fixed case of GL include directory Merge-request: 484 Reviewed-by: Thiago Macieira --- src/3rdparty/phonon/ds9/videorenderer_soft.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/3rdparty/phonon/ds9/videorenderer_soft.cpp b/src/3rdparty/phonon/ds9/videorenderer_soft.cpp index f7d42cf..9c7993c 100644 --- a/src/3rdparty/phonon/ds9/videorenderer_soft.cpp +++ b/src/3rdparty/phonon/ds9/videorenderer_soft.cpp @@ -45,7 +45,7 @@ along with this library. If not, see . #endif #ifndef QT_NO_OPENGL -#include +#include #ifndef GL_FRAGMENT_PROGRAM_ARB #define GL_FRAGMENT_PROGRAM_ARB 0x8804 #define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 -- cgit v0.12 From 14d8e280407989181cc9581803ed1a080414e77b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kimmo=20Kotaj=C3=A4rvi?= Date: Fri, 5 Mar 2010 17:10:43 +0100 Subject: Added test for QTBUG-6962: Empty authority ignored by QUrl::setAuthority. Merge-request: 482 Reviewed-by: Thiago Macieira --- tests/auto/qurl/tst_qurl.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/auto/qurl/tst_qurl.cpp b/tests/auto/qurl/tst_qurl.cpp index 83109b5..b7cbdb8 100644 --- a/tests/auto/qurl/tst_qurl.cpp +++ b/tests/auto/qurl/tst_qurl.cpp @@ -193,6 +193,7 @@ private slots: void fromUserInput(); void task_199967(); void task_240612(); + void taskQTBUG_6962(); #ifdef QT3_SUPPORT void dirPath(); @@ -3860,5 +3861,13 @@ void tst_QUrl::resolvedWithAbsoluteSchemes_data() const << QUrl::fromEncoded("http://www.foo.com:8080/newfile.html"); } +void tst_QUrl::taskQTBUG_6962() +{ + //bug 6962: empty authority ignored by setAuthority + QUrl url("http://example.com/something"); + url.setAuthority(QString()); + QCOMPARE(url.authority(), QString()); +} + QTEST_MAIN(tst_QUrl) #include "tst_qurl.moc" -- cgit v0.12 From 413bec8e5d1a60f965abece7f6901fd0a177161d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kimmo=20Kotaj=C3=A4rvi?= Date: Fri, 5 Mar 2010 17:10:48 +0100 Subject: Allow empty authority in QUrl::setAuthority as per docs. Merge-request: 482 Reviewed-by: Thiago Macieira --- src/corelib/io/qurl.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp index 626bd3f..a60f206 100644 --- a/src/corelib/io/qurl.cpp +++ b/src/corelib/io/qurl.cpp @@ -3479,8 +3479,12 @@ QString QUrlPrivate::authority(QUrl::FormattingOptions options) const void QUrlPrivate::setAuthority(const QString &auth) { - if (auth.isEmpty()) + if (auth.isEmpty()) { + setUserInfo(QString()); + host.clear(); + port = -1; return; + } // find the port section of the authority by searching from the // end towards the beginning for numbers until a ':' is reached. -- cgit v0.12 From 0e049a27622a4002af8851fed68f37b71fc7ba54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kimmo=20Kotaj=C3=A4rvi?= Date: Fri, 5 Mar 2010 17:24:23 +0100 Subject: Partial overloading support for qdbus cli tool. Merge-request: 432 Reviewed-by: Thiago Macieira --- tools/qdbus/qdbus/qdbus.cpp | 175 +++++++++++++++++++++++--------------------- 1 file changed, 91 insertions(+), 84 deletions(-) diff --git a/tools/qdbus/qdbus/qdbus.cpp b/tools/qdbus/qdbus/qdbus.cpp index b08910a..ce18cb9 100644 --- a/tools/qdbus/qdbus/qdbus.cpp +++ b/tools/qdbus/qdbus/qdbus.cpp @@ -249,116 +249,123 @@ static QStringList readList(QStringList &args) } static int placeCall(const QString &service, const QString &path, const QString &interface, - const QString &member, QStringList args, bool try_prop=true) + const QString &member, const QStringList& arguments, bool try_prop=true) { QDBusInterface iface(service, path, interface, connection); // Don't check whether the interface is valid to allow DBus try to // activate the service if possible. + QList knownIds; + bool matchFound = false; + QStringList args = arguments; QVariantList params; if (!args.isEmpty()) { const QMetaObject *mo = iface.metaObject(); QByteArray match = member.toLatin1(); match += '('; - int midx = -1; for (int i = mo->methodOffset(); i < mo->methodCount(); ++i) { QMetaMethod mm = mo->method(i); QByteArray signature = mm.signature(); - if (signature.startsWith(match)) { - midx = i; - break; - } + if (signature.startsWith(match)) + knownIds += i; } - if (midx == -1) { - // Failed to set property after falling back? - // Bail out without displaying an error - if (!try_prop) + + while (!matchFound) { + args = arguments; // reset + params.clear(); + if (knownIds.isEmpty()) { + // Failed to set property after falling back? + // Bail out without displaying an error + if (!try_prop) + return 1; + if (try_prop && args.size() == 1) { + QStringList proparg; + proparg += interface; + proparg += member; + proparg += args.first(); + if (!placeCall(service, path, "org.freedesktop.DBus.Properties", "Set", proparg, false)) + return 0; + } + fprintf(stderr, "Cannot find '%s.%s' in object %s at %s\n", + qPrintable(interface), qPrintable(member), qPrintable(path), + qPrintable(service)); return 1; - if (try_prop && args.size() == 1) { - QStringList proparg; - proparg += interface; - proparg += member; - proparg += args.first(); - if (!placeCall(service, path, "org.freedesktop.DBus.Properties", "Set", proparg, false)) - return 0; } - fprintf(stderr, "Cannot find '%s.%s' in object %s at %s\n", - qPrintable(interface), qPrintable(member), qPrintable(path), - qPrintable(service)); - return 1; - } - QMetaMethod mm = mo->method(midx); - QList types = mm.parameterTypes(); - for (int i = 0; i < types.count(); ++i) { - if (types.at(i).endsWith('&')) { - // reference (and not a reference to const): output argument - // we're done with the inputs - while (types.count() > i) - types.removeLast(); - break; + QMetaMethod mm = mo->method(knownIds.takeFirst()); + QList types = mm.parameterTypes(); + for (int i = 0; i < types.count(); ++i) { + if (types.at(i).endsWith('&')) { + // reference (and not a reference to const): output argument + // we're done with the inputs + while (types.count() > i) + types.removeLast(); + break; + } } - } - for (int i = 0; !args.isEmpty() && i < types.count(); ++i) { - int id = QVariant::nameToType(types.at(i)); - if (id == QVariant::UserType) - id = QMetaType::type(types.at(i)); - Q_ASSERT(id); - - QVariant p; - QString argument; - if ((id == QVariant::List || id == QVariant::StringList) - && args.at(0) == QLatin1String("(")) - p = readList(args); - else - p = argument = args.takeFirst(); - - if (id == int(QMetaType::UChar)) { - // special case: QVariant::convert doesn't convert to/from - // UChar because it can't decide if it's a character or a number - p = qVariantFromValue(p.toUInt()); - } else if (id < int(QMetaType::User) && id != int(QVariant::Map)) { - p.convert(QVariant::Type(id)); - if (p.type() == QVariant::Invalid) { - fprintf(stderr, "Could not convert '%s' to type '%s'.\n", - qPrintable(argument), types.at(i).constData()); - return 1 ; - } - } else if (id == qMetaTypeId()) { - QDBusVariant tmp(p); - p = qVariantFromValue(tmp); - } else if (id == qMetaTypeId()) { - QDBusObjectPath path(argument); - if (path.path().isNull()) { - fprintf(stderr, "Cannot pass argument '%s' because it is not a valid object path.\n", - qPrintable(argument)); + for (int i = 0; !args.isEmpty() && i < types.count(); ++i) { + int id = QVariant::nameToType(types.at(i)); + if (id == QVariant::UserType) + id = QMetaType::type(types.at(i)); + Q_ASSERT(id); + + QVariant p; + QString argument; + if ((id == QVariant::List || id == QVariant::StringList) + && args.at(0) == QLatin1String("(")) + p = readList(args); + else + p = argument = args.takeFirst(); + + if (id == int(QMetaType::UChar)) { + // special case: QVariant::convert doesn't convert to/from + // UChar because it can't decide if it's a character or a number + p = qVariantFromValue(p.toUInt()); + } else if (id < int(QMetaType::User) && id != int(QVariant::Map)) { + p.convert(QVariant::Type(id)); + if (p.type() == QVariant::Invalid) { + fprintf(stderr, "Could not convert '%s' to type '%s'.\n", + qPrintable(argument), types.at(i).constData()); + return 1 ; + } + } else if (id == qMetaTypeId()) { + QDBusVariant tmp(p); + p = qVariantFromValue(tmp); + } else if (id == qMetaTypeId()) { + QDBusObjectPath path(argument); + if (path.path().isNull()) { + fprintf(stderr, "Cannot pass argument '%s' because it is not a valid object path.\n", + qPrintable(argument)); + return 1; + } + p = qVariantFromValue(path); + } else if (id == qMetaTypeId()) { + QDBusSignature sig(argument); + if (sig.signature().isNull()) { + fprintf(stderr, "Cannot pass argument '%s' because it is not a valid signature.\n", + qPrintable(argument)); + return 1; + } + p = qVariantFromValue(sig); + } else { + fprintf(stderr, "Sorry, can't pass arg of type '%s'.\n", + types.at(i).constData()); return 1; } - p = qVariantFromValue(path); - } else if (id == qMetaTypeId()) { - QDBusSignature sig(argument); - if (sig.signature().isNull()) { - fprintf(stderr, "Cannot pass argument '%s' because it is not a valid signature.\n", - qPrintable(argument)); - return 1; - } - p = qVariantFromValue(sig); - } else { - fprintf(stderr, "Sorry, can't pass arg of type '%s'.\n", - types.at(i).constData()); + params += p; + } + if (params.count() == types.count() && args.isEmpty()) + matchFound = true; + else if (knownIds.isEmpty()) { + fprintf(stderr, "Invalid number of parameters\n"); return 1; } - params += p; - } - if (params.count() != types.count() || !args.isEmpty()) { - fprintf(stderr, "Invalid number of parameters\n"); - return 1; - } - } + } // while (!matchFound) + } // if (!args.isEmpty() QDBusMessage reply = iface.callWithArgumentList(QDBus::Block, member, params); if (reply.type() == QDBusMessage::ErrorMessage) { -- cgit v0.12 From e489e9bc82823f1922a38f1b0805ac8537b1dc77 Mon Sep 17 00:00:00 2001 From: Mark Brand Date: Fri, 5 Mar 2010 17:31:32 +0100 Subject: fixed treatment of zlib on Mac when crossbuilding Merge-request: 478 Reviewed-by: Thiago Macieira --- configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index 16c1fcd..369ace8 100755 --- a/configure +++ b/configure @@ -6324,7 +6324,7 @@ else QT_CONFIG="$QT_CONFIG freetype" fi -if [ "x$PLATFORM_MAC" = "xyes" ]; then +if [ "x$PLATFORM_MAC" = "xyes" ] && [ "$XPLATFORM" != "win32-g++" ]; then #On Mac we implicitly link against libz, so we #never use the 3rdparty stuff. [ "$CFG_ZLIB" = "yes" ] && CFG_ZLIB="system" -- cgit v0.12 From 35e939a0c9afb29f82e2aba774a117a35ea83a17 Mon Sep 17 00:00:00 2001 From: Lorn Potter Date: Sun, 7 Mar 2010 06:25:25 +1000 Subject: fix corewlan detection error when building for 10.5 when 10.6 is also installed. --- configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index 16c1fcd..5fccf22 100755 --- a/configure +++ b/configure @@ -5486,7 +5486,7 @@ if [ "$PLATFORM_MAC" = "yes" ]; then fi if [ "$CFG_COREWLAN" = "auto" ]; then - if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/mac/corewlan "CoreWlan" $L_FLAGS $I_FLAGS $l_FLAGS; then + if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/mac/corewlan "CoreWlan" $L_FLAGS $I_FLAGS $l_FLAGS $MAC_CONFIG_TEST_COMMANDLINE; then CFG_COREWLAN=yes else CFG_COREWLAN=no -- cgit v0.12 From 19e1b32bdeeeb5c7865038cab97b40dbac0e6c42 Mon Sep 17 00:00:00 2001 From: Benjamin Poulain Date: Sat, 6 Mar 2010 19:05:53 +0100 Subject: Avoid memory allocations in conversion from Gb2312/Gb18030 to unicode The previous implementation was using QString::operator+=() for every converted character. This was resulting in thousands of malloc, making those conversions slow. Reviewed-by: Andreas Kling --- src/plugins/codecs/cn/qgb18030codec.cpp | 51 ++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/src/plugins/codecs/cn/qgb18030codec.cpp b/src/plugins/codecs/cn/qgb18030codec.cpp index 5537cf7..e683fc0 100644 --- a/src/plugins/codecs/cn/qgb18030codec.cpp +++ b/src/plugins/codecs/cn/qgb18030codec.cpp @@ -173,6 +173,9 @@ QString QGb18030Codec::convertToUnicode(const char* chars, int len, ConverterSta int invalid = 0; QString result; + result.resize(len); + int unicodeLen = 0; + QChar *const resultData = result.data(); //qDebug("QGb18030Decoder::toUnicode(const char* chars, int len = %d)", len); for (int i = 0; i < len; i++) { uchar ch = chars[i]; @@ -180,14 +183,16 @@ QString QGb18030Codec::convertToUnicode(const char* chars, int len, ConverterSta case 0: if (ch < 0x80) { // ASCII - result += QLatin1Char(ch); + resultData[unicodeLen] = QChar(ch); + ++unicodeLen; } else if (Is1stByte(ch)) { // GB18030? buf[0] = ch; nbuf = 1; } else { // Invalid - result += replacement; + resultData[unicodeLen] = replacement; + ++unicodeLen; ++invalid; } break; @@ -198,9 +203,11 @@ QString QGb18030Codec::convertToUnicode(const char* chars, int len, ConverterSta int clen = 2; uint u = qt_Gb18030ToUnicode(buf, clen); if (clen == 2) { - result += QValidChar(u); + resultData[unicodeLen] = QValidChar(u); + ++unicodeLen; } else { - result += replacement; + resultData[unicodeLen] = replacement; + ++unicodeLen; ++invalid; } nbuf = 0; @@ -209,7 +216,8 @@ QString QGb18030Codec::convertToUnicode(const char* chars, int len, ConverterSta nbuf = 2; } else { // Error - result += replacement; + resultData[unicodeLen] = replacement; + ++unicodeLen; ++invalid; nbuf = 0; } @@ -220,7 +228,8 @@ QString QGb18030Codec::convertToUnicode(const char* chars, int len, ConverterSta buf[2] = ch; nbuf = 3; } else { - result += replacement; + resultData[unicodeLen] = replacement; + ++unicodeLen; ++invalid; nbuf = 0; } @@ -232,19 +241,24 @@ QString QGb18030Codec::convertToUnicode(const char* chars, int len, ConverterSta int clen = 4; uint u = qt_Gb18030ToUnicode(buf, clen); if (clen == 4) { - result += QValidChar(u); + resultData[unicodeLen] = QValidChar(u); + ++unicodeLen; } else { - result += replacement; + resultData[unicodeLen] = replacement; + ++unicodeLen; ++invalid; } } else { - result += replacement; + resultData[unicodeLen] = replacement; + ++unicodeLen; ++invalid; } nbuf = 0; break; } } + result.resize(unicodeLen); + if (state) { state->remainingChars = nbuf; state->state_data[0] = (buf[0] << 24) + (buf[1] << 16) + (buf[2] << 8) + buf[3]; @@ -456,6 +470,9 @@ QString QGb2312Codec::convertToUnicode(const char* chars, int len, ConverterStat int invalid = 0; QString result; + result.resize(len); + int unicodeLen = 0; + QChar *const resultData = result.data(); //qDebug("QGb2312Decoder::toUnicode(const char* chars, int len = %d)", len); for (int i=0; iremainingChars = nbuf; -- cgit v0.12 From 987458462994497f764baf253baca0faabdb63cc Mon Sep 17 00:00:00 2001 From: Benjamin Poulain Date: Sat, 6 Mar 2010 19:33:14 +0100 Subject: Avoid conversion to/from QChar in the cn codec to unicode Half of the instructions were jumps to the constructor or QChar. We can assume the char are on 16 bits and do the assignation directly. Reviewed-by: Andreas Kling --- src/plugins/codecs/cn/qgb18030codec.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/plugins/codecs/cn/qgb18030codec.cpp b/src/plugins/codecs/cn/qgb18030codec.cpp index e683fc0..3f2eec7 100644 --- a/src/plugins/codecs/cn/qgb18030codec.cpp +++ b/src/plugins/codecs/cn/qgb18030codec.cpp @@ -60,7 +60,7 @@ QT_BEGIN_NAMESPACE #define Is3rdByte(c) (InRange((c), 0x81, 0xFE)) #define Is4thByte(c) (InRange((c), 0x30, 0x39)) -#define QValidChar(u) ((u) ? QChar((ushort)(u)) : QChar(QChar::ReplacementCharacter)) +#define qValidChar(u) ((u) ? (u) : static_cast(QChar::ReplacementCharacter)) /* User-defined areas: UDA 1: 0xAAA1 - 0xAFFE (564/0) UDA 2: 0xF8A1 - 0xFEFE (658/0) @@ -160,7 +160,7 @@ QString QGb18030Codec::convertToUnicode(const char* chars, int len, ConverterSta { uchar buf[4]; int nbuf = 0; - QChar replacement = QChar::ReplacementCharacter; + ushort replacement = QChar::ReplacementCharacter; if (state) { if (state->flags & ConvertInvalidToNull) replacement = QChar::Null; @@ -175,7 +175,7 @@ QString QGb18030Codec::convertToUnicode(const char* chars, int len, ConverterSta QString result; result.resize(len); int unicodeLen = 0; - QChar *const resultData = result.data(); + ushort *const resultData = reinterpret_cast(result.data()); //qDebug("QGb18030Decoder::toUnicode(const char* chars, int len = %d)", len); for (int i = 0; i < len; i++) { uchar ch = chars[i]; @@ -183,7 +183,7 @@ QString QGb18030Codec::convertToUnicode(const char* chars, int len, ConverterSta case 0: if (ch < 0x80) { // ASCII - resultData[unicodeLen] = QChar(ch); + resultData[unicodeLen] = ch; ++unicodeLen; } else if (Is1stByte(ch)) { // GB18030? @@ -203,7 +203,7 @@ QString QGb18030Codec::convertToUnicode(const char* chars, int len, ConverterSta int clen = 2; uint u = qt_Gb18030ToUnicode(buf, clen); if (clen == 2) { - resultData[unicodeLen] = QValidChar(u); + resultData[unicodeLen] = qValidChar(static_cast(u)); ++unicodeLen; } else { resultData[unicodeLen] = replacement; @@ -241,7 +241,7 @@ QString QGb18030Codec::convertToUnicode(const char* chars, int len, ConverterSta int clen = 4; uint u = qt_Gb18030ToUnicode(buf, clen); if (clen == 4) { - resultData[unicodeLen] = QValidChar(u); + resultData[unicodeLen] = qValidChar(u); ++unicodeLen; } else { resultData[unicodeLen] = replacement; @@ -356,7 +356,7 @@ QString QGbkCodec::convertToUnicode(const char* chars, int len, ConverterState * int clen = 2; uint u = qt_Gb18030ToUnicode(buf, clen); if (clen == 2) { - result += QValidChar(u); + result += qValidChar(u); } else { result += replacement; ++invalid; @@ -459,7 +459,7 @@ QString QGb2312Codec::convertToUnicode(const char* chars, int len, ConverterStat { uchar buf[2]; int nbuf = 0; - QChar replacement = QChar::ReplacementCharacter; + ushort replacement = QChar::ReplacementCharacter; if (state) { if (state->flags & ConvertInvalidToNull) replacement = QChar::Null; @@ -472,7 +472,7 @@ QString QGb2312Codec::convertToUnicode(const char* chars, int len, ConverterStat QString result; result.resize(len); int unicodeLen = 0; - QChar *const resultData = result.data(); + ushort *const resultData = reinterpret_cast(result.data()); //qDebug("QGb2312Decoder::toUnicode(const char* chars, int len = %d)", len); for (int i=0; i(u)); ++unicodeLen; } else { resultData[unicodeLen] = replacement; -- cgit v0.12 From 4e605d83b5966b08a82eb54e733c2f37bca6b5d6 Mon Sep 17 00:00:00 2001 From: Lorn Potter Date: Mon, 8 Mar 2010 05:04:19 +1000 Subject: don't try to build corewlan plugin when corewlan was not found at configure --- src/plugins/bearer/bearer.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/bearer/bearer.pro b/src/plugins/bearer/bearer.pro index 7ba62b3..a67c8f6 100644 --- a/src/plugins/bearer/bearer.pro +++ b/src/plugins/bearer/bearer.pro @@ -6,7 +6,7 @@ TEMPLATE = subdirs #win32:SUBDIRS += nla win32:SUBDIRS += generic win32:!wince*:SUBDIRS += nativewifi -macx:SUBDIRS += corewlan +macx:contains(QT_CONFIG, corewlan):SUBDIRS += corewlan macx:SUBDIRS += generic symbian:SUBDIRS += symbian maemo6:contains(QT_CONFIG, dbus):SUBDIRS += icd -- cgit v0.12 From d4073eadde0a9922d9247129d463d28182e32e76 Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Mon, 8 Mar 2010 03:26:16 +0100 Subject: JPEG plugin: Use switch() instead of if() Reviewed-by: Olivier Goffart --- src/plugins/imageformats/jpeg/qjpeghandler.cpp | 33 +++++++++++++++++--------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/src/plugins/imageformats/jpeg/qjpeghandler.cpp b/src/plugins/imageformats/jpeg/qjpeghandler.cpp index 6eed824..0f0d6f6 100644 --- a/src/plugins/imageformats/jpeg/qjpeghandler.cpp +++ b/src/plugins/imageformats/jpeg/qjpeghandler.cpp @@ -793,15 +793,16 @@ bool QJpegHandler::supportsOption(ImageOption option) const QVariant QJpegHandler::option(ImageOption option) const { - if (option == Quality) { + switch(option) { + case Quality: return quality; - } else if (option == ScaledSize) { + case ScaledSize: return scaledSize; - } else if (option == ScaledClipRect) { + case ScaledClipRect: return scaledClipRect; - } else if (option == ClipRect) { + case ClipRect: return clipRect; - } else if (option == Size) { + case Size: if (canRead() && !device()->isSequential()) { qint64 pos = device()->pos(); int width = 0; @@ -810,7 +811,8 @@ QVariant QJpegHandler::option(ImageOption option) const device()->seek(pos); return QSize(width, height); } - } else if (option == ImageFormat) { + return QVariant(); + case ImageFormat: if (canRead() && !device()->isSequential()) { qint64 pos = device()->pos(); QImage::Format format = QImage::Format_Invalid; @@ -819,20 +821,29 @@ QVariant QJpegHandler::option(ImageOption option) const return format; } return QImage::Format_Invalid; + default: + return QVariant(); } - return QVariant(); } void QJpegHandler::setOption(ImageOption option, const QVariant &value) { - if (option == Quality) + switch(option) { + case Quality: quality = value.toInt(); - else if ( option == ScaledSize ) + break; + case ScaledSize: scaledSize = value.toSize(); - else if ( option == ScaledClipRect ) + break; + case ScaledClipRect: scaledClipRect = value.toRect(); - else if ( option == ClipRect ) + break; + case ClipRect: clipRect = value.toRect(); + break; + default: + break; + } } QByteArray QJpegHandler::name() const -- cgit v0.12 From 7a5cc73816df5cf65e8a9aaafd750acdac9ca5a3 Mon Sep 17 00:00:00 2001 From: Dmytro Poplavskiy Date: Mon, 8 Mar 2010 17:24:21 +1000 Subject: Delayed initialization of gstreamer video widget. This saves time/memory when the video widget control is not used, and allows using of audio only QMediaPlayer in non gui applications. Reviewed-by: Justin McPherson --- .../gstreamer/qgstreamervideowidget.cpp | 52 +++++++++++++--------- .../gstreamer/qgstreamervideowidget.h | 1 + 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/src/plugins/mediaservices/gstreamer/qgstreamervideowidget.cpp b/src/plugins/mediaservices/gstreamer/qgstreamervideowidget.cpp index 47fb451..8307aa5 100644 --- a/src/plugins/mediaservices/gstreamer/qgstreamervideowidget.cpp +++ b/src/plugins/mediaservices/gstreamer/qgstreamervideowidget.cpp @@ -99,9 +99,26 @@ protected: QGstreamerVideoWidgetControl::QGstreamerVideoWidgetControl(QObject *parent) : QVideoWidgetControl(parent) , m_videoSink(0) - , m_widget(new QGstreamerVideoWidget) + , m_widget(0) , m_fullScreen(false) +{ +} + +QGstreamerVideoWidgetControl::~QGstreamerVideoWidgetControl() +{ + if (m_videoSink) + gst_object_unref(GST_OBJECT(m_videoSink)); + + delete m_widget; +} + +void QGstreamerVideoWidgetControl::createVideoWidget() { + if (m_widget) + return; + + m_widget = new QGstreamerVideoWidget; + m_widget->installEventFilter(this); m_windowId = m_widget->winId(); @@ -125,22 +142,15 @@ QGstreamerVideoWidgetControl::QGstreamerVideoWidgetControl(QObject *parent) gst_object_sink (GST_OBJECT (m_videoSink)); } -QGstreamerVideoWidgetControl::~QGstreamerVideoWidgetControl() -{ - if (m_videoSink) - gst_object_unref(GST_OBJECT(m_videoSink)); - - delete m_widget; -} - GstElement *QGstreamerVideoWidgetControl::videoSink() { + createVideoWidget(); return m_videoSink; } bool QGstreamerVideoWidgetControl::eventFilter(QObject *object, QEvent *e) { - if (object == m_widget) { + if (m_widget && object == m_widget) { if (e->type() == QEvent::ParentChange || e->type() == QEvent::Show) { WId newWId = m_widget->winId(); if (newWId != m_windowId) { @@ -205,7 +215,8 @@ void QGstreamerVideoWidgetControl::updateNativeVideoSize() gst_caps_unref(caps); } } else { - m_widget->setNativeSize(QSize()); + if (m_widget) + m_widget->setNativeSize(QSize()); } } @@ -218,6 +229,7 @@ void QGstreamerVideoWidgetControl::windowExposed() QWidget *QGstreamerVideoWidgetControl::videoWidget() { + createVideoWidget(); return m_widget; } @@ -252,7 +264,7 @@ int QGstreamerVideoWidgetControl::brightness() const { int brightness = 0; - if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "brightness")) + if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "brightness")) g_object_get(G_OBJECT(m_videoSink), "brightness", &brightness, NULL); return brightness / 10; @@ -260,7 +272,7 @@ int QGstreamerVideoWidgetControl::brightness() const void QGstreamerVideoWidgetControl::setBrightness(int brightness) { - if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "brightness")) { + if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "brightness")) { g_object_set(G_OBJECT(m_videoSink), "brightness", brightness * 10, NULL); emit brightnessChanged(brightness); @@ -271,15 +283,15 @@ int QGstreamerVideoWidgetControl::contrast() const { int contrast = 0; - if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "contrast")) - g_object_get(G_OBJECT(m_videoSink), "contrast", &contrast, NULL); + if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "contrast")) + g_object_get(G_OBJECT(m_videoSink), "contrast", &contrast, NULL); return contrast / 10; } void QGstreamerVideoWidgetControl::setContrast(int contrast) { - if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "contrast")) { + if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "contrast")) { g_object_set(G_OBJECT(m_videoSink), "contrast", contrast * 10, NULL); emit contrastChanged(contrast); @@ -290,7 +302,7 @@ int QGstreamerVideoWidgetControl::hue() const { int hue = 0; - if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "hue")) + if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "hue")) g_object_get(G_OBJECT(m_videoSink), "hue", &hue, NULL); return hue / 10; @@ -298,7 +310,7 @@ int QGstreamerVideoWidgetControl::hue() const void QGstreamerVideoWidgetControl::setHue(int hue) { - if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "hue")) { + if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "hue")) { g_object_set(G_OBJECT(m_videoSink), "hue", hue * 10, NULL); emit hueChanged(hue); @@ -309,7 +321,7 @@ int QGstreamerVideoWidgetControl::saturation() const { int saturation = 0; - if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "saturation")) + if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "saturation")) g_object_get(G_OBJECT(m_videoSink), "saturation", &saturation, NULL); return saturation / 10; @@ -317,7 +329,7 @@ int QGstreamerVideoWidgetControl::saturation() const void QGstreamerVideoWidgetControl::setSaturation(int saturation) { - if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "saturation")) { + if (m_videoSink && g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSink), "saturation")) { g_object_set(G_OBJECT(m_videoSink), "saturation", saturation * 10, NULL); emit saturationChanged(saturation); diff --git a/src/plugins/mediaservices/gstreamer/qgstreamervideowidget.h b/src/plugins/mediaservices/gstreamer/qgstreamervideowidget.h index 7b966b7..6a4c0f3 100644 --- a/src/plugins/mediaservices/gstreamer/qgstreamervideowidget.h +++ b/src/plugins/mediaservices/gstreamer/qgstreamervideowidget.h @@ -93,6 +93,7 @@ public slots: void updateNativeVideoSize(); private: + void createVideoWidget(); void windowExposed(); GstElement *m_videoSink; -- cgit v0.12 From af68298d5470aca109e115c7a86dc88f8821e97d Mon Sep 17 00:00:00 2001 From: Harald Fernengel Date: Mon, 8 Mar 2010 10:04:10 +0100 Subject: Fix build The dependency was wrong, should be src_webkit instead of webkit Reviewed-by: Tobias Hunger --- src/src.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/src.pro b/src/src.pro index 8c21ef7..809a078 100644 --- a/src/src.pro +++ b/src/src.pro @@ -112,7 +112,7 @@ src_declarative.target = sub-declarative contains(QT_CONFIG, phonon):src_webkit.depends += src_phonon contains(QT_CONFIG, xmlpatterns): src_webkit.depends += src_xmlpatterns contains(QT_CONFIG, declarative):src_declarative.depends += src_webkit - src_imports.depends += webkit + src_imports.depends += src_webkit #exists($$QT_SOURCE_TREE/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pro): src_webkit.depends += src_javascriptcore } contains(QT_CONFIG, qt3support): src_plugins.depends += src_qt3support -- cgit v0.12 From de20e4df5f6a212115d10c225f945ab1610319ba Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Mon, 8 Mar 2010 10:20:56 +0100 Subject: Mac: compile fix Needed to move the inclusion of qstringbuilder.h after any system headers has been included. Otherwise, strange compile errors occur. Reviewed-by: msorvig --- src/gui/styles/qstylehelper.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/gui/styles/qstylehelper.cpp b/src/gui/styles/qstylehelper.cpp index 359e7e1..296c51c 100644 --- a/src/gui/styles/qstylehelper.cpp +++ b/src/gui/styles/qstylehelper.cpp @@ -44,7 +44,6 @@ #include #include #include -#include #include #include #include @@ -55,6 +54,8 @@ #include #endif +#include + QT_BEGIN_NAMESPACE // internal helper. Converts an integer value to an unique string token -- cgit v0.12 From 29ec793147054ea4beb1ad4adeebbbe1fe07b260 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Mon, 8 Mar 2010 11:18:43 +0100 Subject: Carbon: usage of menu bars can cause exceptions to be thrown The reason is that a function in the Qt menu bar code assumes that windows on screen are NSWindows (which is true for the cocoa-port). But when using carbon, this will fail. This simple patch will fix this. Reviewed-by: msorvig --- src/gui/widgets/qmenu_mac.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/widgets/qmenu_mac.mm b/src/gui/widgets/qmenu_mac.mm index 2570cb5..43722a1 100644 --- a/src/gui/widgets/qmenu_mac.mm +++ b/src/gui/widgets/qmenu_mac.mm @@ -1935,7 +1935,7 @@ static bool qt_mac_should_disable_menu(QMenuBar *menuBar) if (w->isVisible() && w->windowModality() == Qt::ApplicationModal) { for (int i=0; iisVisible()) { // INVARIANT: we found another visible window // on screen other than our modalWidget. We therefore // disable the menu bar to follow normal modality logic: -- cgit v0.12 From 7c3bb2f35b70605a0b0a535c8cd6090354b09b19 Mon Sep 17 00:00:00 2001 From: Denis Dzyubenko Date: Fri, 5 Mar 2010 11:13:43 +0100 Subject: Added two missing keys for X11 On X11 XF86XK_LaunchD is mapped to Qt::Key_LaunchF, however x11 keys LaunchE and LaunchF were not mapped to anything. Reviewed-by: Marius Storm-Olsen --- src/corelib/global/qnamespace.h | 3 +++ src/corelib/global/qnamespace.qdoc | 2 ++ src/gui/kernel/qkeymapper_x11.cpp | 2 ++ 3 files changed, 7 insertions(+) diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h index f7aea36..89a0c0b 100644 --- a/src/corelib/global/qnamespace.h +++ b/src/corelib/global/qnamespace.h @@ -1059,6 +1059,9 @@ public: Key_Suspend = 0x0100010c, Key_ContrastAdjust = 0x0100010d, + Key_LaunchG = 0x0100010e, + Key_LaunchH = 0x0100010f, + Key_MediaLast = 0x0100ffff, // Keypad navigation keys diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc index 74144b0..76541ca 100644 --- a/src/corelib/global/qnamespace.qdoc +++ b/src/corelib/global/qnamespace.qdoc @@ -1639,6 +1639,8 @@ \value Key_LaunchD On X11 this key is mapped to XF86XK_LaunchB key for legacy reasons. \value Key_LaunchE On X11 this key is mapped to XF86XK_LaunchC key for legacy reasons. \value Key_LaunchF On X11 this key is mapped to XF86XK_LaunchD key for legacy reasons. + \value Key_LaunchG On X11 this key is mapped to XF86XK_LaunchE key for legacy reasons. + \value Key_LaunchH On X11 this key is mapped to XF86XK_LaunchF key for legacy reasons. \value Key_MonBrightnessUp \value Key_MonBrightnessDown \value Key_KeyboardLightOnOff diff --git a/src/gui/kernel/qkeymapper_x11.cpp b/src/gui/kernel/qkeymapper_x11.cpp index b32b626..d6d1042 100644 --- a/src/gui/kernel/qkeymapper_x11.cpp +++ b/src/gui/kernel/qkeymapper_x11.cpp @@ -1186,6 +1186,8 @@ static const unsigned int KeyTbl[] = { XF86XK_LaunchB, Qt::Key_LaunchD, XF86XK_LaunchC, Qt::Key_LaunchE, XF86XK_LaunchD, Qt::Key_LaunchF, + XF86XK_LaunchE, Qt::Key_LaunchG, + XF86XK_LaunchF, Qt::Key_LaunchH, // Qtopia keys QTOPIAXK_Select, Qt::Key_Select, -- cgit v0.12 From 7695e48ed3ff7e2e1157bcdcb27188532dc75d20 Mon Sep 17 00:00:00 2001 From: Denis Dzyubenko Date: Mon, 8 Mar 2010 12:22:47 +0100 Subject: Fixed mouse wheel handling in scrollareas. When handling wheel events in the scrollbar we should ignore the event by default, so that if we cannot scroll it gets propagated (like in QAbstractSlider). Task-number: QTBUG-8325 Reviewed-by: Richard Moe Gustavsen --- src/gui/widgets/qscrollbar.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/widgets/qscrollbar.cpp b/src/gui/widgets/qscrollbar.cpp index 4eff260..c0eeb2f 100644 --- a/src/gui/widgets/qscrollbar.cpp +++ b/src/gui/widgets/qscrollbar.cpp @@ -523,6 +523,7 @@ bool QScrollBar::event(QEvent *event) break; #ifndef QT_NO_WHEELEVENT case QEvent::Wheel: { + event->ignore(); // override wheel event without adding virtual function override QWheelEvent *ev = static_cast(event); int delta = ev->delta(); -- cgit v0.12 From f471b125c04a559c6e76bb69b2875bddf01ed2f6 Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Mon, 8 Mar 2010 12:49:01 +0100 Subject: qdoc: Added some debug output to track down a crash The crash doesn't happen on my OS X 10.4. --- tools/qdoc3/node.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/qdoc3/node.cpp b/tools/qdoc3/node.cpp index 5415559..1dec17e 100644 --- a/tools/qdoc3/node.cpp +++ b/tools/qdoc3/node.cpp @@ -1305,8 +1305,8 @@ QString QmlClassNode::fileBase() const */ void QmlClassNode::addInheritedBy(const QString& base, Node* sub) { - //qDebug() << "QmlClassNode::addInheritedBy(): insert" << base << sub->name(); inheritedBy.insert(base,sub); + qDebug() << "QmlClassNode::addInheritedBy(): insert" << base << sub->name() << inheritedBy.size(); } /*! @@ -1318,7 +1318,7 @@ void QmlClassNode::subclasses(const QString& base, NodeList& subs) if (inheritedBy.count(base) > 0) { subs = inheritedBy.values(base); qDebug() << "QmlClassNode::subclasses():" << inheritedBy.count(base) << base - << "subs:" << subs.size(); + << "subs:" << subs.size() << "total size:" << inheritedBy.size(); } } -- cgit v0.12 From 9c44d272a924f4458a3f18ac13fd2e480042d481 Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Mon, 8 Mar 2010 14:14:03 +0100 Subject: qdoc: Clear a static multimap after each qdocconf file. Task: QTBUG-8804 --- tools/qdoc3/generator.cpp | 1 + tools/qdoc3/node.cpp | 9 +++++++++ tools/qdoc3/node.h | 1 + 3 files changed, 11 insertions(+) diff --git a/tools/qdoc3/generator.cpp b/tools/qdoc3/generator.cpp index c8a39ef..80f7e45 100644 --- a/tools/qdoc3/generator.cpp +++ b/tools/qdoc3/generator.cpp @@ -226,6 +226,7 @@ void Generator::terminate() imageFiles.clear(); imageDirs.clear(); outDir = ""; + QmlClassNode::clear(); } Generator *Generator::generatorForFormat(const QString& format) diff --git a/tools/qdoc3/node.cpp b/tools/qdoc3/node.cpp index 1dec17e..d4e4196 100644 --- a/tools/qdoc3/node.cpp +++ b/tools/qdoc3/node.cpp @@ -1284,6 +1284,15 @@ QmlClassNode::~QmlClassNode() } /*! + Clear the multimap so that subsequent runs don't try to use + nodes from a previous run. + */ +void QmlClassNode::clear() +{ + inheritedBy.clear(); +} + +/*! The base file name for this kind of node has "qml_" prepended to it. diff --git a/tools/qdoc3/node.h b/tools/qdoc3/node.h index fd39698..1017813 100644 --- a/tools/qdoc3/node.h +++ b/tools/qdoc3/node.h @@ -385,6 +385,7 @@ class QmlClassNode : public FakeNode virtual QString fileBase() const; static void addInheritedBy(const QString& base, Node* sub); static void subclasses(const QString& base, NodeList& subs); + static void clear(); public: static bool qmlOnly; -- cgit v0.12 From 395ebda9bd85b27662799b2b5a6ae465978ced1a Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Mon, 8 Mar 2010 14:54:37 +0100 Subject: Doc: add image for Qt Quick to "What's New" page. --- doc/src/images/quick_screens.png | Bin 0 -> 128730 bytes doc/src/qt4-intro.qdoc | 2 ++ 2 files changed, 2 insertions(+) create mode 100644 doc/src/images/quick_screens.png diff --git a/doc/src/images/quick_screens.png b/doc/src/images/quick_screens.png new file mode 100644 index 0000000..76b25d9 Binary files /dev/null and b/doc/src/images/quick_screens.png differ diff --git a/doc/src/qt4-intro.qdoc b/doc/src/qt4-intro.qdoc index c670c51..ba9821a 100644 --- a/doc/src/qt4-intro.qdoc +++ b/doc/src/qt4-intro.qdoc @@ -473,6 +473,8 @@ \section1 Declarative UI development with Qt Quick + \image quick_screens.png + Qt 4.7 introduces Quick, the Qt UI Creation Kit. that enables the creation of dynamic user interfaces, easier and more effective than possible with existing UI technologies. This UI Creation Kit consist of three -- cgit v0.12 From be87fa060360139c64dea6854e7667914db47bf4 Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Mon, 8 Mar 2010 15:17:21 +0100 Subject: Doc: mark methods as internal (as they were in previous releases) --- src/gui/painting/qcolormap.qdoc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/gui/painting/qcolormap.qdoc b/src/gui/painting/qcolormap.qdoc index 56fabf7..22a73fd 100644 --- a/src/gui/painting/qcolormap.qdoc +++ b/src/gui/painting/qcolormap.qdoc @@ -150,3 +150,13 @@ Assigns the given \a colormap to \e this color map and returns a reference to \e this color map. */ + +/*! + \fn void QColormap::initialize() + \internal +*/ + +/*! + \fn void QColormap::cleanup() + \internal +*/ -- cgit v0.12 From 2e8ee73bd681cfe5898b8c054b0cb4df51663c91 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Mon, 8 Mar 2010 14:59:56 +0100 Subject: Autotest: Fix failing QTextCodec tests --- src/corelib/codecs/qutfcodec.cpp | 2 +- tests/auto/qtextcodec/tst_qtextcodec.cpp | 16 +++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/corelib/codecs/qutfcodec.cpp b/src/corelib/codecs/qutfcodec.cpp index 233bd8f..f747bf7 100644 --- a/src/corelib/codecs/qutfcodec.cpp +++ b/src/corelib/codecs/qutfcodec.cpp @@ -121,7 +121,7 @@ QByteArray QUtf8::convertFromUnicode(const QChar *uc, int len, QTextCodec::Conve } else { // is it one of the Unicode non-characters? if (isUnicodeNonCharacter(u)) { - *cursor = replacement; + *cursor++ = replacement; ++ch; ++invalid; continue; diff --git a/tests/auto/qtextcodec/tst_qtextcodec.cpp b/tests/auto/qtextcodec/tst_qtextcodec.cpp index aa97e87..86aa38a 100644 --- a/tests/auto/qtextcodec/tst_qtextcodec.cpp +++ b/tests/auto/qtextcodec/tst_qtextcodec.cpp @@ -384,9 +384,12 @@ void tst_QTextCodec::flagCodepointFFFF() const Q_ASSERT(codec); const QByteArray asDecoded(codec->fromUnicode(input)); + QCOMPARE(asDecoded, QByteArray("?")); + + QByteArray ffff("\357\277\277"); QTextCodec::ConverterState state(QTextCodec::ConvertInvalidToNull); - QVERIFY(codec->toUnicode(asDecoded.constData(), asDecoded.length(), &state) == QChar(0)); - QVERIFY(codec->toUnicode(asDecoded) == QChar(0xfffd)); + QVERIFY(codec->toUnicode(ffff.constData(), ffff.length(), &state) == QChar(0)); + QVERIFY(codec->toUnicode(ffff) == QChar(0xfffd)); } void tst_QTextCodec::flagF7808080() const @@ -447,12 +450,11 @@ void tst_QTextCodec::flagEFBFBF() const /* When 0xEFBFBF is preceeded by what seems to be an arbitrary character, * QTextCodec fails to flag it. */ { - QEXPECT_FAIL("", "This is a bug and needs to be fixed.", Continue); QByteArray start("B"); start.append(invalidInput); QTextCodec::ConverterState state(QTextCodec::ConvertInvalidToNull); - QVERIFY(codec->toUnicode(start.constData(), start.length(), &state) == QChar(0)); + QVERIFY(codec->toUnicode(start.constData(), start.length(), &state) == QString::fromLatin1("B\0", 2)); } } @@ -695,15 +697,15 @@ void tst_QTextCodec::utf8Codec_data() str = QChar(QChar::ReplacementCharacter); QTest::newRow("http://www.w3.org/2001/06/utf-8-wrong/UTF-8-test.html 2.3.3") << utf8 << str << -1; - // 2.3.4 U+0010FFFF + // 2.3.4 U+0010FFFD utf8.clear(); utf8 += char(0xf4); utf8 += char(0x8f); utf8 += char(0xbf); - utf8 += char(0xbf); + utf8 += char(0xbd); str.clear(); str += QChar(0xdbff); - str += QChar(0xdfff); + str += QChar(0xdffd); QTest::newRow("http://www.w3.org/2001/06/utf-8-wrong/UTF-8-test.html 2.3.4") << utf8 << str << -1; // 2.3.5 U+00110000 -- cgit v0.12 From e7673f836c351ea3599a73e1a28a185009fa7a65 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Mon, 8 Mar 2010 15:21:06 +0100 Subject: Modify the XML test suite not to use non-characters. The Unicode Consortium specifically says these codepoints may not be used for text interchange. So I'm modifying the XML test suite instead. --- tests/auto/qxmlstream/XML-Test-Suite/xmlconf/ibm/valid/P02/ibm02v01.xml | 2 +- tests/auto/qxmlstream/XML-Test-Suite/xmlconf/ibm/valid/P66/ibm66v01.xml | 2 +- .../qxmlstream/XML-Test-Suite/xmlconf/ibm/valid/P66/out/ibm66v01.xml | 2 +- tests/auto/qxmlstream/XML-Test-Suite/xmlconf/xmltest/valid/sa/089.xml | 2 +- .../auto/qxmlstream/XML-Test-Suite/xmlconf/xmltest/valid/sa/out/089.xml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/auto/qxmlstream/XML-Test-Suite/xmlconf/ibm/valid/P02/ibm02v01.xml b/tests/auto/qxmlstream/XML-Test-Suite/xmlconf/ibm/valid/P02/ibm02v01.xml index 60479f4..2363b97 100644 --- a/tests/auto/qxmlstream/XML-Test-Suite/xmlconf/ibm/valid/P02/ibm02v01.xml +++ b/tests/auto/qxmlstream/XML-Test-Suite/xmlconf/ibm/valid/P02/ibm02v01.xml @@ -5,6 +5,6 @@ discrete legal characters for production 02. --> +_20- _D7FF-퟿_6c0f-氏_E000-_FFFD-�_effd-_010000-𐀀_10FFFD-􏿽_08fffd-򏿽 This is a PI target ?> ]> diff --git a/tests/auto/qxmlstream/XML-Test-Suite/xmlconf/ibm/valid/P66/ibm66v01.xml b/tests/auto/qxmlstream/XML-Test-Suite/xmlconf/ibm/valid/P66/ibm66v01.xml index 7ac675e..d7f7722 100644 --- a/tests/auto/qxmlstream/XML-Test-Suite/xmlconf/ibm/valid/P66/ibm66v01.xml +++ b/tests/auto/qxmlstream/XML-Test-Suite/xmlconf/ibm/valid/P66/ibm66v01.xml @@ -11,6 +11,6 @@ Test all valid Charater references for P66: C C _ 힣 가 豈 � -𐀀 􏿿 +𐀀 􏿽 diff --git a/tests/auto/qxmlstream/XML-Test-Suite/xmlconf/ibm/valid/P66/out/ibm66v01.xml b/tests/auto/qxmlstream/XML-Test-Suite/xmlconf/ibm/valid/P66/out/ibm66v01.xml index 1b04b6d..ed05e61 100644 --- a/tests/auto/qxmlstream/XML-Test-Suite/xmlconf/ibm/valid/P66/out/ibm66v01.xml +++ b/tests/auto/qxmlstream/XML-Test-Suite/xmlconf/ibm/valid/P66/out/ibm66v01.xml @@ -1 +1 @@ - Test all valid Charater references for P66: « « Í Í ï ï C C _ 힣 가 豈 � 𐀀 􏿿 \ No newline at end of file + Test all valid Charater references for P66: « « Í Í ï ï C C _ 힣 가 豈 � 𐀀 􏿽 \ No newline at end of file diff --git a/tests/auto/qxmlstream/XML-Test-Suite/xmlconf/xmltest/valid/sa/089.xml b/tests/auto/qxmlstream/XML-Test-Suite/xmlconf/xmltest/valid/sa/089.xml index 2d80c8f..42ffcb6 100644 --- a/tests/auto/qxmlstream/XML-Test-Suite/xmlconf/xmltest/valid/sa/089.xml +++ b/tests/auto/qxmlstream/XML-Test-Suite/xmlconf/xmltest/valid/sa/089.xml @@ -1,5 +1,5 @@ + ]> &e; diff --git a/tests/auto/qxmlstream/XML-Test-Suite/xmlconf/xmltest/valid/sa/out/089.xml b/tests/auto/qxmlstream/XML-Test-Suite/xmlconf/xmltest/valid/sa/out/089.xml index e01d86e..f5a0484 100644 --- a/tests/auto/qxmlstream/XML-Test-Suite/xmlconf/xmltest/valid/sa/out/089.xml +++ b/tests/auto/qxmlstream/XML-Test-Suite/xmlconf/xmltest/valid/sa/out/089.xml @@ -1 +1 @@ -𐀀􏿽􏿿 \ No newline at end of file +𐀀􏿽 \ No newline at end of file -- cgit v0.12 From 00e358a2536b5730556f5b1f0538a7d851372664 Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Mon, 8 Mar 2010 15:27:56 +0100 Subject: Doc: mark QEasingCurve support functions as new in 4.7. --- src/corelib/kernel/qvariant.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index 07c9e53..f5d7c0d 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -1511,6 +1511,7 @@ QVariant::QVariant(const char *val) */ /*! + \since 4.7 \fn QVariant::QVariant(const QEasingCurve &val) Constructs a new variant with an easing curve value, \a val. @@ -2204,6 +2205,7 @@ QDateTime QVariant::toDateTime() const } /*! + \since 4.7 \fn QEasingCurve QVariant::toEasingCurve() const Returns the variant as a QEasingCurve if the variant has type() \l -- cgit v0.12 From 1866cb339a53893792e4c3b894510feb7744324f Mon Sep 17 00:00:00 2001 From: ck Date: Mon, 8 Mar 2010 18:01:19 +0100 Subject: Assistant: Fix compile warning for empty header. Reviewed-by: kh1 --- tools/assistant/tools/assistant/assistant.pro | 16 +++++++++++----- tools/assistant/tools/assistant/centralwidget.cpp | 8 ++++++-- tools/assistant/tools/assistant/helpviewer_qtb.cpp | 6 ------ tools/assistant/tools/assistant/helpviewer_qtb.h | 6 ------ tools/assistant/tools/assistant/helpviewer_qwv.cpp | 4 ---- tools/assistant/tools/assistant/helpviewer_qwv.h | 6 ------ 6 files changed, 17 insertions(+), 29 deletions(-) diff --git a/tools/assistant/tools/assistant/assistant.pro b/tools/assistant/tools/assistant/assistant.pro index ff0ecc5..bc4d495 100644 --- a/tools/assistant/tools/assistant/assistant.pro +++ b/tools/assistant/tools/assistant/assistant.pro @@ -30,8 +30,6 @@ HEADERS += aboutdialog.h \ filternamedialog.h \ helpenginewrapper.h \ helpviewer.h \ - helpviewer_qtb.h \ - helpviewer_qwv.h \ indexwindow.h \ installdialog.h \ mainwindow.h \ @@ -43,6 +41,11 @@ HEADERS += aboutdialog.h \ tracer.h \ xbelsupport.h \ ../shared/collectionconfiguration.h +contains(QT_CONFIG, webkit) { + HEADERS += helpviewer_qwv.h +} else { + HEADERS += helpviewer_qtb.h + } win32:HEADERS += remotecontrol_win.h SOURCES += aboutdialog.cpp \ @@ -59,8 +62,6 @@ SOURCES += aboutdialog.cpp \ filternamedialog.cpp \ helpenginewrapper.cpp \ helpviewer.cpp \ - helpviewer_qtb.cpp \ - helpviewer_qwv.cpp \ indexwindow.cpp \ installdialog.cpp \ main.cpp \ @@ -71,7 +72,12 @@ SOURCES += aboutdialog.cpp \ searchwidget.cpp \ topicchooser.cpp \ xbelsupport.cpp \ - ../shared/collectionconfiguration.cpp \ + ../shared/collectionconfiguration.cpp + contains(QT_CONFIG, webkit) { + SOURCES += helpviewer_qwv.cpp +} else { + SOURCES += helpviewer_qtb.cpp +} FORMS += bookmarkdialog.ui \ bookmarkmanagerwidget.ui \ diff --git a/tools/assistant/tools/assistant/centralwidget.cpp b/tools/assistant/tools/assistant/centralwidget.cpp index f56e9e3..2359479 100644 --- a/tools/assistant/tools/assistant/centralwidget.cpp +++ b/tools/assistant/tools/assistant/centralwidget.cpp @@ -43,12 +43,16 @@ #include "centralwidget.h" #include "findwidget.h" #include "helpenginewrapper.h" -#include "helpviewer_qtb.h" -#include "helpviewer_qwv.h" #include "searchwidget.h" #include "mainwindow.h" #include "../shared/collectionconfiguration.h" +#if defined(QT_NO_WEBKIT) +#include "helpviewer_qtb.h" +#else +#include "helpviewer_qwv.h" +#endif // QT_NO_WEBKIT + #include #include diff --git a/tools/assistant/tools/assistant/helpviewer_qtb.cpp b/tools/assistant/tools/assistant/helpviewer_qtb.cpp index bba2850..07b89eb 100644 --- a/tools/assistant/tools/assistant/helpviewer_qtb.cpp +++ b/tools/assistant/tools/assistant/helpviewer_qtb.cpp @@ -40,8 +40,6 @@ ****************************************************************************/ #include "helpviewer_qtb.h" -#if defined(QT_NO_WEBKIT) - #include "centralwidget.h" #include "helpenginewrapper.h" #include "tracer.h" @@ -287,7 +285,3 @@ bool HelpViewer::eventFilter(QObject *obj, QEvent *event) return true; return QTextBrowser::eventFilter(obj, event); } - -QT_END_NAMESPACE - -#endif // QT_NO_WEBKIT diff --git a/tools/assistant/tools/assistant/helpviewer_qtb.h b/tools/assistant/tools/assistant/helpviewer_qtb.h index 5b38870..a05782c 100644 --- a/tools/assistant/tools/assistant/helpviewer_qtb.h +++ b/tools/assistant/tools/assistant/helpviewer_qtb.h @@ -41,10 +41,6 @@ #ifndef HELPVIEWERQTB_H #define HELPVIEWERQTB_H -#include - -#if defined(QT_NO_WEBKIT) - #include "helpviewer.h" #include @@ -111,6 +107,4 @@ private: QT_END_NAMESPACE -#endif // QT_NO_WEBKIT - #endif // HELPVIEWERQTB_H diff --git a/tools/assistant/tools/assistant/helpviewer_qwv.cpp b/tools/assistant/tools/assistant/helpviewer_qwv.cpp index a656416..582d013 100644 --- a/tools/assistant/tools/assistant/helpviewer_qwv.cpp +++ b/tools/assistant/tools/assistant/helpviewer_qwv.cpp @@ -41,8 +41,6 @@ #include "helpviewer_qwv.h" -#if !defined(QT_NO_WEBKIT) - #include "centralwidget.h" #include "helpenginewrapper.h" #include "tracer.h" @@ -385,5 +383,3 @@ void HelpViewer::setLoadFinished(bool ok) } QT_END_NAMESPACE - -#endif // !QT_NO_WEBKIT diff --git a/tools/assistant/tools/assistant/helpviewer_qwv.h b/tools/assistant/tools/assistant/helpviewer_qwv.h index fbfbaac..41ee553 100644 --- a/tools/assistant/tools/assistant/helpviewer_qwv.h +++ b/tools/assistant/tools/assistant/helpviewer_qwv.h @@ -42,10 +42,6 @@ #ifndef HELPVIEWERQWV_H #define HELPVIEWERQWV_H -#include - -#if !defined(QT_NO_WEBKIT) - #include "helpviewer.h" #include @@ -120,6 +116,4 @@ private: QT_END_NAMESPACE -#endif // !QT_NO_WEBKIT - #endif // HELPVIEWERQWV_H -- cgit v0.12 From e7edb6de8c1d24163bdb9eb83fbec6a7c7208790 Mon Sep 17 00:00:00 2001 From: Lorn Potter Date: Tue, 9 Mar 2010 11:50:13 +1000 Subject: use Qt's private mac functions, reduce code redundancy --- src/plugins/bearer/corewlan/qcorewlanengine.mm | 56 ++++++-------------------- 1 file changed, 13 insertions(+), 43 deletions(-) diff --git a/src/plugins/bearer/corewlan/qcorewlanengine.mm b/src/plugins/bearer/corewlan/qcorewlanengine.mm index 9a213e7..cb278d9 100644 --- a/src/plugins/bearer/corewlan/qcorewlanengine.mm +++ b/src/plugins/bearer/corewlan/qcorewlanengine.mm @@ -65,6 +65,7 @@ #include #include +#include "private/qcore_mac_p.h" QMap networkInterfaces; @@ -132,37 +133,6 @@ QNSListener *listener = 0; QT_BEGIN_NAMESPACE -inline QString cfstringRefToQstring(CFStringRef cfStringRef) { - QString retVal; - CFIndex maxLength = 2 * CFStringGetLength(cfStringRef) + 1/*zero term*/; // max UTF8 - char *cstring = new char[maxLength]; - if (CFStringGetCString(CFStringRef(cfStringRef), cstring, maxLength, kCFStringEncodingUTF8)) { - retVal = QString::fromUtf8(cstring); - } - delete[] cstring; - return retVal; -} - -inline CFStringRef qstringToCFStringRef(const QString &string) -{ - return CFStringCreateWithCharacters(0, reinterpret_cast(string.unicode()), - string.length()); -} - -inline NSString *qstringToNSString(const QString &qstr) -{ return [reinterpret_cast(qstringToCFStringRef(qstr)) autorelease]; } - -inline QString nsstringToQString(const NSString *nsstr) -{ return cfstringRefToQstring(reinterpret_cast(nsstr)); } - -inline QStringList nsarrayToQStringList(void *nsarray) -{ - QStringList result; - NSArray *array = static_cast(nsarray); - for (NSUInteger i=0; i<[array count]; ++i) - result << nsstringToQString([array objectAtIndex:i]); - return result; -} static QString qGetInterfaceType(const QString &interfaceString) { @@ -173,8 +143,8 @@ void networkChangeCallback(SCDynamicStoreRef/* store*/, CFArrayRef changedKeys, { for ( long i = 0; i < CFArrayGetCount(changedKeys); i++) { - CFStringRef changed = (CFStringRef)CFArrayGetValueAtIndex(changedKeys, i); - if( cfstringRefToQstring(changed).contains("/Network/Global/IPv4")) { + QString changed = QCFString::toQString((CFStringRef)CFArrayGetValueAtIndex(changedKeys, i)); + if( changed.contains("/Network/Global/IPv4")) { QCoreWlanEngine* wlanEngine = static_cast(info); wlanEngine->requestUpdate(); } @@ -228,7 +198,7 @@ void QCoreWlanEngine::connectToId(const QString &id) if(networkInterfaces.value(interfaceString) == "WLAN") { #if defined(MAC_SDK_10_6) - CWInterface *wifiInterface = [CWInterface interfaceWithName: qstringToNSString(interfaceString)]; + CWInterface *wifiInterface = [CWInterface interfaceWithName: qt_mac_QStringToNSString(interfaceString)]; CWConfiguration *userConfig = [ wifiInterface configuration]; NSSet *remNets = [userConfig rememberedNetworks]; //CWWirelessProfile @@ -245,7 +215,7 @@ void QCoreWlanEngine::connectToId(const QString &id) while ((wProfile = [enumerator nextObject])) { //CWWirelessProfile - if(id == QString::number(qHash(QLatin1String("corewlan:") + nsstringToQString([wProfile ssid])))) { + if(id == QString::number(qHash(QLatin1String("corewlan:") + qt_mac_NSStringToQString([wProfile ssid])))) { user8021XProfile = nil; user8021XProfile = [ wProfile user8021XProfile]; @@ -299,7 +269,7 @@ void QCoreWlanEngine::disconnectFromId(const QString &id) if(networkInterfaces.value(getInterfaceFromId(id)) == "WLAN") { //wifi only for now #if defined(MAC_SDK_10_6) NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; - CWInterface *wifiInterface = [CWInterface interfaceWithName: qstringToNSString(interfaceString)]; + CWInterface *wifiInterface = [CWInterface interfaceWithName: qt_mac_QStringToNSString(interfaceString)]; [wifiInterface disassociate]; if([[wifiInterface interfaceState]intValue] != kCWInterfaceStateInactive) { emit connectionError(id, DisconnectionError); @@ -414,7 +384,7 @@ QStringList QCoreWlanEngine::scanForSsids(const QString &interfaceName) #if defined(MAC_SDK_10_6) QMacCocoaAutoReleasePool pool; - CWInterface *currentInterface = [CWInterface interfaceWithName:qstringToNSString(interfaceName)]; + CWInterface *currentInterface = [CWInterface interfaceWithName:qt_mac_QStringToNSString(interfaceName)]; if([currentInterface power]) { NSError *err = nil; NSDictionary *parametersDict = nil; @@ -426,7 +396,7 @@ QStringList QCoreWlanEngine::scanForSsids(const QString &interfaceName) apNetwork = [apArray objectAtIndex:row]; - const QString networkSsid = nsstringToQString([apNetwork ssid]); + const QString networkSsid = qt_mac_NSStringToQString([apNetwork ssid]); const QString id = QString::number(qHash(QLatin1String("corewlan:") + networkSsid)); found.append(id); @@ -434,7 +404,7 @@ QStringList QCoreWlanEngine::scanForSsids(const QString &interfaceName) QNetworkConfiguration::StateFlags state = QNetworkConfiguration::Undefined; if ([currentInterface.interfaceState intValue] == kCWInterfaceStateRunning) { - if (networkSsid == nsstringToQString([currentInterface ssid])) + if (networkSsid == qt_mac_NSStringToQString([currentInterface ssid])) state = QNetworkConfiguration::Active; } else { if (isKnownSsid(interfaceName, networkSsid)) @@ -499,7 +469,7 @@ bool QCoreWlanEngine::isWifiReady(const QString &wifiDeviceName) QMutexLocker locker(&mutex); #if defined(MAC_SDK_10_6) - CWInterface *defaultInterface = [CWInterface interfaceWithName: qstringToNSString(wifiDeviceName)]; + CWInterface *defaultInterface = [CWInterface interfaceWithName: qt_mac_QStringToNSString(wifiDeviceName)]; if([defaultInterface power]) return true; #else @@ -513,11 +483,11 @@ bool QCoreWlanEngine::isKnownSsid(const QString &interfaceName, const QString &s QMutexLocker locker(&mutex); #if defined(MAC_SDK_10_6) - CWInterface *wifiInterface = [CWInterface interfaceWithName: qstringToNSString(interfaceName)]; + CWInterface *wifiInterface = [CWInterface interfaceWithName: qt_mac_QStringToNSString(interfaceName)]; CWConfiguration *userConfig = [wifiInterface configuration]; NSSet *remNets = [userConfig rememberedNetworks]; for (CWWirelessProfile *wProfile in remNets) { - if(ssid == nsstringToQString([wProfile ssid])) + if(ssid == qt_mac_NSStringToQString([wProfile ssid])) return true; } #else @@ -536,7 +506,7 @@ bool QCoreWlanEngine::getWifiInterfaces() NSArray *wifiInterfaces = [CWInterface supportedInterfaces]; for(uint row=0; row < [wifiInterfaces count]; row++ ) { - networkInterfaces.insert( nsstringToQString([wifiInterfaces objectAtIndex:row]),"WLAN"); + networkInterfaces.insert( qt_mac_NSStringToQString([wifiInterfaces objectAtIndex:row]),"WLAN"); } return true; -- cgit v0.12 From 8870d7173fce840277d15cab9daf75aa1b587a87 Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Mon, 8 Mar 2010 13:35:41 +0100 Subject: Add a benchmark comparing single shot timer with invokeMethod Reviewed-by: joao --- .../qtimer_vs_qmetaobject.pro | 11 +++ .../tst_qtimer_vs_qmetaobject.cpp | 96 ++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/qtimer_vs_qmetaobject.pro create mode 100644 tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/tst_qtimer_vs_qmetaobject.cpp diff --git a/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/qtimer_vs_qmetaobject.pro b/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/qtimer_vs_qmetaobject.pro new file mode 100644 index 0000000..9c6b16b --- /dev/null +++ b/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/qtimer_vs_qmetaobject.pro @@ -0,0 +1,11 @@ +load(qttest_p4) +TEMPLATE = app +TARGET = qtimer_vs_qmetaobject +DEPENDPATH += . +INCLUDEPATH += . + +CONFIG += release +#CONFIG += debug + + +SOURCES += tst_qtimer_vs_qmetaobject.cpp diff --git a/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/tst_qtimer_vs_qmetaobject.cpp b/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/tst_qtimer_vs_qmetaobject.cpp new file mode 100644 index 0000000..2f265bf --- /dev/null +++ b/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/tst_qtimer_vs_qmetaobject.cpp @@ -0,0 +1,96 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include + +#define INVOKE_COUNT 10000 + +class qtimer_vs_qmetaobject : public QObject +{ + Q_OBJECT +private slots: + void testZeroTimerSingleShot(); + void testQueuedInvokeMethod(); +}; + +class InvokeCounter : public QObject { + Q_OBJECT +public: + InvokeCounter() : count(0) { }; +public slots: + void invokeSlot() { + count++; + if (count == INVOKE_COUNT) + QTestEventLoop::instance().exitLoop(); + } +protected: + int count; +}; + +void qtimer_vs_qmetaobject::testZeroTimerSingleShot() +{ + QBENCHMARK { + InvokeCounter invokeCounter; + for(int i = 0; i < INVOKE_COUNT; ++i) { + QTimer::singleShot(0, &invokeCounter, SLOT(invokeSlot())); + } + QTestEventLoop::instance().enterLoop(10); + QVERIFY(!QTestEventLoop::instance().timeout()); + } +} + +void qtimer_vs_qmetaobject::testQueuedInvokeMethod() +{ + QBENCHMARK { + InvokeCounter invokeCounter; + for(int i = 0; i < INVOKE_COUNT; ++i) { + QMetaObject::invokeMethod(&invokeCounter, "invokeSlot", Qt::QueuedConnection); + } + QTestEventLoop::instance().enterLoop(10); + QVERIFY(!QTestEventLoop::instance().timeout()); + } +} + + +QTEST_MAIN(qtimer_vs_qmetaobject) + +#include "tst_qtimer_vs_qmetaobject.moc" -- cgit v0.12 From 7a52e5948c0305ca41a9b66d591a12d171fd2bae Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Mon, 8 Mar 2010 15:21:38 +0100 Subject: Improve performance of QTimer::singleShot Avoid allocation of QObject and OS timer. Reviewed-by: Olivier Goffart --- src/corelib/kernel/qtimer.cpp | 14 +++++++++++++- tests/auto/qtimer/tst_qtimer.cpp | 12 ++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/corelib/kernel/qtimer.cpp b/src/corelib/kernel/qtimer.cpp index e17c995..7650f6a 100644 --- a/src/corelib/kernel/qtimer.cpp +++ b/src/corelib/kernel/qtimer.cpp @@ -339,8 +339,20 @@ QT_END_INCLUDE_NAMESPACE void QTimer::singleShot(int msec, QObject *receiver, const char *member) { - if (receiver && member) + if (receiver && member) { + if (msec == 0) { + // special code shortpath for 0-timers + const char* bracketPosition = strchr(member, '('); + if (!bracketPosition || !(member[0] >= '0' && member[0] <= '3')) { + qWarning("QTimer::singleShot: Invalid slot specification"); + return; + } + QByteArray methodName(member+1, bracketPosition - 1 - member); // extract method name + QMetaObject::invokeMethod(receiver, methodName.constData(), Qt::QueuedConnection); + return; + } (void) new QSingleShotTimer(msec, receiver, member); + } } /*! diff --git a/tests/auto/qtimer/tst_qtimer.cpp b/tests/auto/qtimer/tst_qtimer.cpp index cc97e4e..a0408ef 100644 --- a/tests/auto/qtimer/tst_qtimer.cpp +++ b/tests/auto/qtimer/tst_qtimer.cpp @@ -85,6 +85,7 @@ private slots: void timerFiresOnlyOncePerProcessEvents(); void timerIdPersistsAfterThreadExit(); void cancelLongTimer(); + void singleShotStaticFunctionZeroTimeout(); }; class TimerHelper : public QObject @@ -611,5 +612,16 @@ void tst_QTimer::cancelLongTimer() QVERIFY(!timer.isActive()); } +void tst_QTimer::singleShotStaticFunctionZeroTimeout() +{ + TimerHelper helper; + + QTimer::singleShot(0, &helper, SLOT(timeout())); + QTest::qWait(500); + QCOMPARE(helper.count, 1); + QTest::qWait(500); + QCOMPARE(helper.count, 1); +} + QTEST_MAIN(tst_QTimer) #include "tst_qtimer.moc" -- cgit v0.12 From d0794c43f21aab3d1ce926f38c315ba2ac999c41 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Tue, 9 Mar 2010 11:06:30 +0100 Subject: Cocoa: Native filedialog does not apply filters on app-bundles The native file dialog (and finder) handles bundles (like .app) like normal files rather than directories, unless specified otherwise. But since they are directories at the same time, we skip sending them through the name filters. This patch makes sure that we are more consistent on this matter for the cocoa port. Task-number: QTBUG-834 Reviewed-by: msorvig --- src/gui/dialogs/qfiledialog_mac.mm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/gui/dialogs/qfiledialog_mac.mm b/src/gui/dialogs/qfiledialog_mac.mm index 67daced..da8cab5 100644 --- a/src/gui/dialogs/qfiledialog_mac.mm +++ b/src/gui/dialogs/qfiledialog_mac.mm @@ -295,10 +295,14 @@ QT_USE_NAMESPACE if (!mQDirFilterEntryList->contains(info.fileName())) return NO; - // Always accept directories regardless of their names: + // Always accept directories regardless of their names (unless it is a bundle): BOOL isDir; - if ([[NSFileManager defaultManager] fileExistsAtPath:filename isDirectory:&isDir] && isDir) - return YES; + if ([[NSFileManager defaultManager] fileExistsAtPath:filename isDirectory:&isDir] && isDir) { + if ([mSavePanel treatsFilePackagesAsDirectories] == NO) { + if ([[NSWorkspace sharedWorkspace] isFilePackageAtPath:filename] == NO) + return YES; + } + } // No filter means accept everything if (mSelectedNameFilter->isEmpty()) -- cgit v0.12 From 382cbd618fe4f5093bb1ca3f4fca3bb35614a18d Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Tue, 9 Mar 2010 11:33:58 +0100 Subject: Carbon: Native filedialog does not apply filters on app-bundles The native file dialog (and finder) handles bundles (like .app) like normal files rather than directories, unless specified otherwise. But since they are directories at the same time, we skip sending them through the name filters. This patch makes sure that we are more consistent on this matter for the carbon port. Task-number: QTBUG-834 Reviewed-by: msorvig --- src/gui/dialogs/qfiledialog_mac.mm | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/gui/dialogs/qfiledialog_mac.mm b/src/gui/dialogs/qfiledialog_mac.mm index da8cab5..14a5f15 100644 --- a/src/gui/dialogs/qfiledialog_mac.mm +++ b/src/gui/dialogs/qfiledialog_mac.mm @@ -729,6 +729,7 @@ Boolean QFileDialogPrivate::qt_mac_filedialog_filter_proc(AEDesc *theItem, void NavFileOrFolderInfo *theInfo = static_cast(info); QString file; + QString path; const QtMacFilterName &fn = fileDialogPrivate->filterInfo.filters.at(fileDialogPrivate->filterInfo.currentSelection); if (theItem->descriptorType == typeFSRef) { @@ -736,10 +737,12 @@ Boolean QFileDialogPrivate::qt_mac_filedialog_filter_proc(AEDesc *theItem, void AEGetDescData(theItem, &ref, sizeof(ref)); UInt8 str_buffer[1024]; FSRefMakePath(&ref, str_buffer, 1024); - file = QString::fromUtf8(reinterpret_cast(str_buffer)); - int slsh = file.lastIndexOf(QLatin1Char('/')); + path = QString::fromUtf8(reinterpret_cast(str_buffer)); + int slsh = path.lastIndexOf(QLatin1Char('/')); if (slsh != -1) - file = file.right(file.length() - slsh - 1); + file = path.right(path.length() - slsh - 1); + else + file = path; } QStringList reg = fn.regexp.split(QLatin1String(";")); for (QStringList::const_iterator it = reg.constBegin(); it != reg.constEnd(); ++it) { @@ -751,7 +754,13 @@ Boolean QFileDialogPrivate::qt_mac_filedialog_filter_proc(AEDesc *theItem, void if (rg.exactMatch(file)) return true; } - return (theInfo->isFolder && !file.endsWith(QLatin1String(".app"))); + + if (theInfo->isFolder) { + if ([[NSWorkspace sharedWorkspace] isFilePackageAtPath:qt_mac_QStringToNSString(path)]) + return false; + return true; + } + return false; } void QFileDialogPrivate::qt_mac_filedialog_event_proc(const NavEventCallbackMessage msg, -- cgit v0.12 From 8c904712aa658dd0dd405b64913b8e6ade17f3df Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Tue, 9 Mar 2010 12:04:59 +0100 Subject: doc: Fixed several qdoc errors. --- .../declarative/imageprovider/imageprovider.cpp | 1 + src/corelib/concurrent/qfuturewatcher.cpp | 2 +- src/corelib/global/qnamespace.qdoc | 2 +- src/corelib/tools/qeasingcurve.cpp | 4 ++-- src/corelib/tools/qstring.cpp | 22 +++++++++--------- .../graphicsitems/qdeclarativelistview.cpp | 5 ---- src/declarative/qml/qdeclarativeengine.cpp | 4 ++-- src/declarative/qml/qdeclarativeexpression.cpp | 27 +++++++++++----------- .../qml/qdeclarativeextensionplugin.cpp | 2 +- src/declarative/qml/qdeclarativeimageprovider.cpp | 4 ++++ src/declarative/qml/qdeclarativeproperty.cpp | 3 ++- src/declarative/util/qdeclarativeanimation.cpp | 8 ++++--- .../util/qdeclarativestateoperations.cpp | 3 --- src/gui/painting/qcolor.cpp | 11 ++------- src/gui/painting/qpainter.cpp | 8 +++---- src/gui/text/qstatictext.cpp | 6 +++-- src/multimedia/effects/qsoundeffect.cpp | 2 -- 17 files changed, 54 insertions(+), 60 deletions(-) diff --git a/examples/declarative/imageprovider/imageprovider.cpp b/examples/declarative/imageprovider/imageprovider.cpp index 253dbf5..011a63b 100644 --- a/examples/declarative/imageprovider/imageprovider.cpp +++ b/examples/declarative/imageprovider/imageprovider.cpp @@ -104,4 +104,5 @@ public: #include "imageprovider.moc" Q_EXPORT_PLUGIN(ImageProviderExtensionPlugin); +//![0] diff --git a/src/corelib/concurrent/qfuturewatcher.cpp b/src/corelib/concurrent/qfuturewatcher.cpp index 3b808b8..d4573c6 100644 --- a/src/corelib/concurrent/qfuturewatcher.cpp +++ b/src/corelib/concurrent/qfuturewatcher.cpp @@ -505,7 +505,7 @@ void QFutureWatcherBasePrivate::sendCallOutEvent(QFutureCallOutEvent *event) finished signal will be emitted. To avoid a race condition, it is important to call this function - \i after doing the connections. + \e after doing the connections. */ /*! \fn QFuture QFutureWatcher::future() const diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc index 76541ca..f8f3c49 100644 --- a/src/corelib/global/qnamespace.qdoc +++ b/src/corelib/global/qnamespace.qdoc @@ -2990,7 +2990,7 @@ \value IgnoredGesturesPropagateToParent Since Qt 4.7, this flag allows you to fine-tune gesture event propagation. By setting the flag when - \l{QGraphicsObject::grabGesture}{grabbing} a gesture all ignored partial + \l{QGraphicsObject::grabGesture()}{grabbing} a gesture all ignored partial gestures will propagate to their parent items. \sa QWidget::grabGesture(), QGraphicsObject::grabGesture() diff --git a/src/corelib/tools/qeasingcurve.cpp b/src/corelib/tools/qeasingcurve.cpp index d4b2c27..9c65d5d 100644 --- a/src/corelib/tools/qeasingcurve.cpp +++ b/src/corelib/tools/qeasingcurve.cpp @@ -877,8 +877,8 @@ QDataStream &operator<<(QDataStream &stream, const QEasingCurve &easing) \fn QDataStream &operator>>(QDataStream &stream, QEasingCurve &easing) \relates QQuaternion - Reads an easing curve from the given \a stream into the given \a quaternion - and returns a reference to the stream. + Reads an easing curve from the given \a stream into the given \a + easing curve and returns a reference to the stream. \sa {Format of the QDataStream Operators} */ diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index 5ed3db5..b54315c 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -2135,7 +2135,7 @@ bool QString::operator==(const QLatin1String &other) const The \a other byte array is converted to a QString using the fromAscii() function. This function stops conversion at the - first NUL character found, or the end of the \a ba byte array. + first NUL character found, or the end of the byte array. You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII when you compile your applications. This @@ -2197,7 +2197,7 @@ bool QString::operator<(const QLatin1String &other) const The \a other byte array is converted to a QString using the fromAscii() function. If any NUL characters ('\0') are embedded - in the \a ba byte array, they will be included in the transformation. + in the byte array, they will be included in the transformation. You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII when you compile your applications. This @@ -2240,7 +2240,7 @@ bool QString::operator<(const QLatin1String &other) const The \a other byte array is converted to a QString using the fromAscii() function. If any NUL characters ('\0') are embedded - in the \a ba byte array, they will be included in the transformation. + in the byte array, they will be included in the transformation. You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII when you compile your applications. This @@ -2299,7 +2299,7 @@ bool QString::operator>(const QLatin1String &other) const The \a other byte array is converted to a QString using the fromAscii() function. If any NUL characters ('\0') are embedded - in the \a ba byte array, they will be included in the transformation. + in the byte array, they will be included in the transformation. You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII when you compile your applications. This @@ -2341,8 +2341,8 @@ bool QString::operator>(const QLatin1String &other) const \overload operator>=() The \a other byte array is converted to a QString using the - fromAscii() function. If any NUL characters ('\0') are embedded - in the \a ba byte array, they will be included in the transformation. + fromAscii() function. If any NUL characters ('\0') are embedded in + the byte array, they will be included in the transformation. You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII when you compile your applications. This can be useful if you want @@ -2357,10 +2357,10 @@ bool QString::operator>(const QLatin1String &other) const The \a other const char pointer is converted to a QString using the fromAscii() function. - You can disable this operator by defining \c - QT_NO_CAST_FROM_ASCII when you compile your applications. This - can be useful if you want to ensure that all user-visible strings - go through QObject::tr(), for example. + You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII + when you compile your applications. This can be useful if you want + to ensure that all user-visible strings go through QObject::tr(), + for example. */ /*! \fn bool QString::operator!=(const QString &other) const @@ -2385,7 +2385,7 @@ bool QString::operator>(const QLatin1String &other) const The \a other byte array is converted to a QString using the fromAscii() function. If any NUL characters ('\0') are embedded - in the \a ba byte array, they will be included in the transformation. + in the byte array, they will be included in the transformation. You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII when you compile your applications. This can be useful if you want diff --git a/src/declarative/graphicsitems/qdeclarativelistview.cpp b/src/declarative/graphicsitems/qdeclarativelistview.cpp index eaf90f2..d54bb70 100644 --- a/src/declarative/graphicsitems/qdeclarativelistview.cpp +++ b/src/declarative/graphicsitems/qdeclarativelistview.cpp @@ -1650,11 +1650,6 @@ void QDeclarativeListView::setPreferredHighlightEnd(qreal end) emit preferredHighlightEndChanged(); } -/*! - \property QDeclarativeListView::highlightRangeMode - - This property contains the highlight range mode for the listview. - */ QDeclarativeListView::HighlightRangeMode QDeclarativeListView::highlightRangeMode() const { Q_D(const QDeclarativeListView); diff --git a/src/declarative/qml/qdeclarativeengine.cpp b/src/declarative/qml/qdeclarativeengine.cpp index 9bff7b2..c23b17c 100644 --- a/src/declarative/qml/qdeclarativeengine.cpp +++ b/src/declarative/qml/qdeclarativeengine.cpp @@ -542,9 +542,9 @@ QNetworkAccessManager *QDeclarativeEngine::networkAccessManager() const This example creates a provider with id \e colors: - \snippet examples/declarative/imageprovider/main.cpp 0 + \snippet examples/declarative/imageprovider/imageprovider.cpp 0 - \snippet examples/declarative/imageprovider/view.qml 0 + \snippet examples/declarative/imageprovider/imageprovider.qml 0 \sa removeImageProvider() */ diff --git a/src/declarative/qml/qdeclarativeexpression.cpp b/src/declarative/qml/qdeclarativeexpression.cpp index e528e9e..899f402 100644 --- a/src/declarative/qml/qdeclarativeexpression.cpp +++ b/src/declarative/qml/qdeclarativeexpression.cpp @@ -512,19 +512,20 @@ bool QDeclarativeExpression::notifyOnValueChanged() const } /*! -Sets whether the valueChanged() signal is emitted when the expression's evaluated -value changes. - -If true, the QDeclarativeExpression will monitor properties involved in the expression's -evaluation, and emit QDeclarativeExpression::valueChanged() if they have changed. This allows -an application to ensure that any value associated with the result of the expression -remains up to date. - -If false, the QDeclarativeExpression will not montitor properties involved in the expression's -evaluation, and QDeclarativeExpression::valueChanged() will never be emitted. This is more efficient -if an application wants a "one off" evaluation of the expression. - -By default, notifyOnChange is false. + Sets whether the valueChanged() signal is emitted when the + expression's evaluated value changes. + + If \a notifyOnChange is true, the QDeclarativeExpression will + monitor properties involved in the expression's evaluation, and emit + QDeclarativeExpression::valueChanged() if they have changed. This + allows an application to ensure that any value associated with the + result of the expression remains up to date. + + If \a notifyOnChange is false (default), the QDeclarativeExpression + will not montitor properties involved in the expression's + evaluation, and QDeclarativeExpression::valueChanged() will never be + emitted. This is more efficient if an application wants a "one off" + evaluation of the expression. */ void QDeclarativeExpression::setNotifyOnValueChanged(bool notifyOnChange) { diff --git a/src/declarative/qml/qdeclarativeextensionplugin.cpp b/src/declarative/qml/qdeclarativeextensionplugin.cpp index 3d44d63..7617977 100644 --- a/src/declarative/qml/qdeclarativeextensionplugin.cpp +++ b/src/declarative/qml/qdeclarativeextensionplugin.cpp @@ -87,7 +87,7 @@ QDeclarativeExtensionPlugin::~QDeclarativeExtensionPlugin() /*! \fn void QDeclarativeExtensionPlugin::initializeEngine(QDeclarativeEngine *engine, const char *uri) - Initializes the extension specified in the given \a engine. + Initializes the extension from the \a uri using the \a engine. */ void QDeclarativeExtensionPlugin::initializeEngine(QDeclarativeEngine *engine, const char *uri) diff --git a/src/declarative/qml/qdeclarativeimageprovider.cpp b/src/declarative/qml/qdeclarativeimageprovider.cpp index daa2e87..9ef8545 100644 --- a/src/declarative/qml/qdeclarativeimageprovider.cpp +++ b/src/declarative/qml/qdeclarativeimageprovider.cpp @@ -52,6 +52,10 @@ QT_BEGIN_NAMESPACE \sa QDeclarativeEngine::addImageProvider() */ + +/*! + The destructor is virtual. + */ QDeclarativeImageProvider::~QDeclarativeImageProvider() { } diff --git a/src/declarative/qml/qdeclarativeproperty.cpp b/src/declarative/qml/qdeclarativeproperty.cpp index d223502..945d098 100644 --- a/src/declarative/qml/qdeclarativeproperty.cpp +++ b/src/declarative/qml/qdeclarativeproperty.cpp @@ -773,7 +773,8 @@ QVariant QDeclarativeProperty::read(QObject *object, const QString &name) } /*! - Return the \a name property value of \a object. This method is + Return the \a name property value of \a object using the + \l{QDeclarativeContext} {context} \a ctxt. This method is equivalent to: \code diff --git a/src/declarative/util/qdeclarativeanimation.cpp b/src/declarative/util/qdeclarativeanimation.cpp index 8c8dd95..20449d7 100644 --- a/src/declarative/util/qdeclarativeanimation.cpp +++ b/src/declarative/util/qdeclarativeanimation.cpp @@ -838,10 +838,10 @@ void QDeclarativePropertyAction::setProperty(const QString &n) } /*! + \qmlproperty list PropertyAction::targets \qmlproperty string PropertyAction::property \qmlproperty string PropertyAction::properties \qmlproperty Object PropertyAction::target - \qmlproperty list PropertyAction::targets These properties are used as a set to determine which properties should be affected by this action. @@ -876,6 +876,7 @@ QDeclarativeListProperty QDeclarativePropertyAction::targets() /*! \qmlproperty list PropertyAction::exclude This property holds the objects not to be affected by this animation. + \sa targets */ QDeclarativeListProperty QDeclarativePropertyAction::exclude() @@ -2220,7 +2221,7 @@ QDeclarativeListProperty QDeclarativePropertyAnimation::targets() /*! \qmlproperty list PropertyAnimation::exclude This property holds the items not to be affected by this animation. - \sa targets + \sa PropertyAnimation::targets */ QDeclarativeListProperty QDeclarativePropertyAnimation::exclude() { @@ -2428,11 +2429,12 @@ void QDeclarativePropertyAnimation::transition(QDeclarativeStateActions &actions be run in parallel (like those in a ParallelAnimation group). In some cases, such as reparenting between items with clipping, it's useful - to animate the parent change \i via another item with no clipping. + to animate the parent change via another item with no clipping. When used in a transition, ParentAnimation will by default animate all ParentChanges. */ + /*! \internal \class QDeclarativeParentAnimation diff --git a/src/declarative/util/qdeclarativestateoperations.cpp b/src/declarative/util/qdeclarativestateoperations.cpp index cd06380..766d1bc 100644 --- a/src/declarative/util/qdeclarativestateoperations.cpp +++ b/src/declarative/util/qdeclarativestateoperations.cpp @@ -561,9 +561,6 @@ QString QDeclarativeStateChangeScript::typeName() const \qmlclass AnchorChanges QDeclarativeAnchorChanges \brief The AnchorChanges element allows you to change the anchors of an item in a state. - In the following example we change the top and bottom anchors of an item: - \snippet examples/declarative/anchors/anchor-changes.qml 0 - AnchorChanges will 'inject' \c x, \c y, \c width, and \c height changes into the transition, so you can animate them as you would normally changes to these properties: \qml diff --git a/src/gui/painting/qcolor.cpp b/src/gui/painting/qcolor.cpp index cd448a7..08d5572 100644 --- a/src/gui/painting/qcolor.cpp +++ b/src/gui/painting/qcolor.cpp @@ -543,7 +543,8 @@ void QColor::setNamedColor(const QString &name) be used to construct a valid QColor object, otherwise returns false. - The algorithm used is the same as with \a setNamedColor(). + It uses the same algorithm used in setNamedColor(). + \sa setNamedColor() */ bool QColor::isValidColor(const QString &name) @@ -2716,12 +2717,4 @@ QDataStream &operator>>(QDataStream &stream, QColor &color) \sa QColor::rgb(), QColor::rgba() */ -/*! \fn void QColormap::initialize() - \internal -*/ - -/*! \fn void QColormap::cleanup() - \internal -*/ - QT_END_NAMESPACE diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp index 9d83718..066725e 100644 --- a/src/gui/painting/qpainter.cpp +++ b/src/gui/painting/qpainter.cpp @@ -5758,18 +5758,18 @@ void QPainterPrivate::drawGlyphs(const quint32 *glyphArray, const QPointF *posit /*! \fn void QPainter::drawStaticText(const QPoint &position, const QStaticText &staticText) - \since 4.7 - \overload + + Draws the \a staticText at the \a position. */ /*! \fn void QPainter::drawStaticText(int x, int y, const QStaticText &staticText) - \since 4.7 - \overload + + Draws the \a staticText at coordinates \a x and \a y. */ /*! diff --git a/src/gui/text/qstatictext.cpp b/src/gui/text/qstatictext.cpp index 8fe4c47..1fabf12 100644 --- a/src/gui/text/qstatictext.cpp +++ b/src/gui/text/qstatictext.cpp @@ -282,8 +282,10 @@ QString QStaticText::text() const } /*! - Sets the performance hint of the QStaticText. This hint can be used to customize how much - caching is done internally to improve performance. + Sets the performance hint of the QStaticText according to the \a + performanceHint provided. The \a performanceHint is used to + customize how much caching is done internally to improve + performance. The default is QStaticText::ModerateCaching. diff --git a/src/multimedia/effects/qsoundeffect.cpp b/src/multimedia/effects/qsoundeffect.cpp index f64d9ee..a5cb20f 100644 --- a/src/multimedia/effects/qsoundeffect.cpp +++ b/src/multimedia/effects/qsoundeffect.cpp @@ -71,8 +71,6 @@ QT_BEGIN_NAMESPACE } } \endqml - - \sa SoundEffect */ /*! -- cgit v0.12 From 53795b645d82afc30a0527523e3fad2a763779e2 Mon Sep 17 00:00:00 2001 From: Zeno Albisser Date: Mon, 8 Mar 2010 18:15:57 +0100 Subject: Changed TEST_COMPILER from CC to CXX in configure script. We are using a cpp file for testing the compiler. Because of that we have to use a c++ compiler for the test as well. But if there was a CC variable defined, this one was used instead of CXX for the compiler test. This resulted in a missing QMAKE_LFLAGS definition in .qmake.cache. Due to this, the -L/path/to/QTDIR/lib was missing too and assistant could not be linked to libQtCLucene.so.4. Reviewed-by: Marius Storm-Olsen Task-number: QTBUG-8808,QTBUG-5471,QTBUG-5385,QTBUG-5774 --- configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index 56fd067..71056b6 100755 --- a/configure +++ b/configure @@ -2976,7 +2976,7 @@ else fi QMAKE_CONF_COMPILER=`getQMakeConf "$XQMAKESPEC" | grep "^QMAKE_CXX[^_A-Z0-9]" | sed "s,.* *= *\(.*\)$,\1," | tail -1` -TEST_COMPILER="$CC" +TEST_COMPILER="$CXX" [ -z "$TEST_COMPILER" ] && TEST_COMPILER=$QMAKE_CONF_COMPILER if [ -z "$TEST_COMPILER" ]; then echo "ERROR: Cannot set the compiler for the configuration tests" -- cgit v0.12 From 0edda17e2edb4da968b026ac6658f740323d6dd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Tue, 9 Mar 2010 12:20:21 +0100 Subject: Revert 12b6987031be9faee3886d7623888feb4e1762af The CI system found lots of focus-related regressions, this is probably the offending change. (I can't reproduce the regressions locally.) --- src/gui/kernel/qcocoaview_mac.mm | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/gui/kernel/qcocoaview_mac.mm b/src/gui/kernel/qcocoaview_mac.mm index 6261429..f7cb21f 100644 --- a/src/gui/kernel/qcocoaview_mac.mm +++ b/src/gui/kernel/qcocoaview_mac.mm @@ -1047,13 +1047,6 @@ static int qCocoaViewCount = 0; return YES; } -- (BOOL)becomeFirstResponder -{ - if (QApplication::focusWidget() == 0) - QApplicationPrivate::setFocusWidget([self QT_MANGLE_NAMESPACE(qt_qwidget)], Qt::OtherFocusReason); - return YES; -} - - (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal { Q_UNUSED(isLocal); -- cgit v0.12 From cbda8ea64d8492d7c8f125cc1b43396b91ecdd8e Mon Sep 17 00:00:00 2001 From: Aaron McCarthy Date: Wed, 10 Mar 2010 10:16:51 +1000 Subject: Don't wait forever when scanning for wifi networks on win32 fails. --- .../bearer/nativewifi/qnativewifiengine.cpp | 23 +++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/plugins/bearer/nativewifi/qnativewifiengine.cpp b/src/plugins/bearer/nativewifi/qnativewifiengine.cpp index 952a6a3..b6522ad 100644 --- a/src/plugins/bearer/nativewifi/qnativewifiengine.cpp +++ b/src/plugins/bearer/nativewifi/qnativewifiengine.cpp @@ -111,8 +111,6 @@ void QNativeWifiEngine::scanComplete() { QMutexLocker locker(&mutex); - QStringList previous = accessPointConfigurations.keys(); - // enumerate interfaces WLAN_INTERFACE_INFO_LIST *interfaceList; DWORD result = local_WlanEnumInterfaces(handle, 0, &interfaceList); @@ -120,9 +118,15 @@ void QNativeWifiEngine::scanComplete() #ifdef BEARER_MANAGEMENT_DEBUG qDebug("%s: WlanEnumInterfaces failed with error %ld\n", __FUNCTION__, result); #endif + + locker.unlock(); + emit updateCompleted(); + return; } + QStringList previous = accessPointConfigurations.keys(); + for (unsigned int i = 0; i < interfaceList->dwNumberOfItems; ++i) { const WLAN_INTERFACE_INFO &interface = interfaceList->InterfaceInfo[i]; @@ -458,18 +462,31 @@ void QNativeWifiEngine::requestUpdate() #ifdef BEARER_MANAGEMENT_DEBUG qDebug("%s: WlanEnumInterfaces failed with error %ld\n", __FUNCTION__, result); #endif + + locker.unlock(); + emit updateCompleted(); + return; } + bool requested = false; for (unsigned int i = 0; i < interfaceList->dwNumberOfItems; ++i) { result = local_WlanScan(handle, &interfaceList->InterfaceInfo[i].InterfaceGuid, 0, 0, 0); + if (result != ERROR_SUCCESS) { #ifdef BEARER_MANAGEMENT_DEBUG - if (result != ERROR_SUCCESS) qDebug("%s: WlanScan failed with error %ld\n", __FUNCTION__, result); #endif + } else { + requested = true; + } } local_WlanFreeMemory(interfaceList); + + if (!requested) { + locker.unlock(); + emit updateCompleted(); + } } QNetworkSession::State QNativeWifiEngine::sessionStateForId(const QString &id) -- cgit v0.12 From 3ae7c0ca536c82659f401c3bed0370f765de8aee Mon Sep 17 00:00:00 2001 From: Paul Olav Tvete Date: Wed, 10 Mar 2010 10:31:50 +0100 Subject: Don't show resize cursor for fixed-size windows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTBUG-8144 Reviewed-by: Jørgen Lind --- src/gui/embedded/qwsmanager_qws.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/gui/embedded/qwsmanager_qws.cpp b/src/gui/embedded/qwsmanager_qws.cpp index d6ef148..79076c5 100644 --- a/src/gui/embedded/qwsmanager_qws.cpp +++ b/src/gui/embedded/qwsmanager_qws.cpp @@ -267,8 +267,10 @@ void QWSManager::mouseMoveEvent(QMouseEvent *e) #ifndef QT_NO_CURSOR - QWSDisplay *qwsd = QApplication::desktop()->qwsDisplay(); - qwsd->selectCursor(d->managed, regionToShape(d->cachedRegionAt())); + if (d->managed->minimumSize() != d->managed->maximumSize()) { + QWSDisplay *qwsd = QApplication::desktop()->qwsDisplay(); + qwsd->selectCursor(d->managed, regionToShape(d->cachedRegionAt())); + } #endif //QT_NO_CURSOR if (d->activeRegion) -- cgit v0.12 From 79a83854bcae35c22e02212a775fcbf825c1439d Mon Sep 17 00:00:00 2001 From: Tom Cooksey Date: Mon, 8 Mar 2010 15:10:25 +0100 Subject: Make sure pixmap hooks get installed so EGL surfaces are cleaned up Reviewed-By: TrustMe --- src/opengl/qpixmapdata_x11gl_egl.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/opengl/qpixmapdata_x11gl_egl.cpp b/src/opengl/qpixmapdata_x11gl_egl.cpp index 34915f5..b6c33f2 100644 --- a/src/opengl/qpixmapdata_x11gl_egl.cpp +++ b/src/opengl/qpixmapdata_x11gl_egl.cpp @@ -138,6 +138,10 @@ bool QX11GLPixmapData::hasX11GLPixmaps() break; } } + + // The pixmap surface destruction hooks are installed by QGLTextureCache, so we + // must make sure this is instanciated: + QGLTextureCache::instance(); } while (0); if (!haveX11Pixmaps) { -- cgit v0.12 From 4737daef1c8d7a181117d6482f5b57cfc433e050 Mon Sep 17 00:00:00 2001 From: Tom Cooksey Date: Mon, 8 Mar 2010 15:26:33 +0100 Subject: Handle EGLSurfaces better, including more error detection Note: This changes QX11PixmapData::gl_surface to a void* to enable build on 64-bit systems where EGLSurface is a pointer. Reviewed-By: TrustMe --- src/gui/egl/qegl.cpp | 7 ++++++- src/gui/egl/qegl_x11.cpp | 2 +- src/gui/image/qpixmap_x11_p.h | 2 +- src/opengl/qgl_x11.cpp | 2 +- src/opengl/qgl_x11egl.cpp | 8 ++++---- src/opengl/qpixmapdata_x11gl_egl.cpp | 10 ++++++++-- 6 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/gui/egl/qegl.cpp b/src/gui/egl/qegl.cpp index 485bfbf..6e0331f 100644 --- a/src/gui/egl/qegl.cpp +++ b/src/gui/egl/qegl.cpp @@ -392,6 +392,11 @@ bool QEglContext::makeCurrent(EGLSurface surface) return false; } + if (surface == EGL_NO_SURFACE) { + qWarning() << "QEglContext::makeCurrent(): Cannot make invalid surface current"; + return false; + } + // If lazyDoneCurrent() was called on the surface, then we may be able // to assume that it is still current within the thread. if (surface == currentSurface && currentContext(apiType) == this) { @@ -417,7 +422,7 @@ bool QEglContext::makeCurrent(EGLSurface surface) bool ok = eglMakeCurrent(QEgl::display(), surface, surface, ctx); if (!ok) - qWarning() << "QEglContext::makeCurrent():" << QEgl::errorString(); + qWarning() << "QEglContext::makeCurrent(" << surface << "):" << QEgl::errorString(); return ok; } diff --git a/src/gui/egl/qegl_x11.cpp b/src/gui/egl/qegl_x11.cpp index 53c4711..91423c8 100644 --- a/src/gui/egl/qegl_x11.cpp +++ b/src/gui/egl/qegl_x11.cpp @@ -408,7 +408,7 @@ EGLSurface QEgl::createSurface(QPaintDevice *device, EGLConfig config, const QEg EGLSurface surf = eglCreatePixmapSurface(QEgl::display(), config, (EGLNativePixmapType) x11PixmapData->handle(), surfaceAttribs.properties()); - x11PixmapData->gl_surface = (Qt::HANDLE)surf; + x11PixmapData->gl_surface = (void*)surf; QImagePixmapCleanupHooks::enableCleanupHooks(x11PixmapData); return surf; } diff --git a/src/gui/image/qpixmap_x11_p.h b/src/gui/image/qpixmap_x11_p.h index 521a612..7575838 100644 --- a/src/gui/image/qpixmap_x11_p.h +++ b/src/gui/image/qpixmap_x11_p.h @@ -94,7 +94,7 @@ public: static Qt::HANDLE createBitmapFromImage(const QImage &image); - Qt::HANDLE gl_surface; + void* gl_surface; #ifndef QT_NO_XRENDER void convertToARGB32(bool preserveContents = true); #endif diff --git a/src/opengl/qgl_x11.cpp b/src/opengl/qgl_x11.cpp index f0b06ef5..4fa1467 100644 --- a/src/opengl/qgl_x11.cpp +++ b/src/opengl/qgl_x11.cpp @@ -1753,7 +1753,7 @@ QGLTexture *QGLContextPrivate::bindTextureFromNativePixmap(QPixmapData *pmd, con if (!glxPixmap) return 0; - pixmapData->gl_surface = (Qt::HANDLE)glxPixmap; + pixmapData->gl_surface = (void*)glxPixmap; // Make sure the cleanup hook gets called so we can delete the glx pixmap QImagePixmapCleanupHooks::enableCleanupHooks(pixmapData); diff --git a/src/opengl/qgl_x11egl.cpp b/src/opengl/qgl_x11egl.cpp index fdcc412..81eb35c 100644 --- a/src/opengl/qgl_x11egl.cpp +++ b/src/opengl/qgl_x11egl.cpp @@ -243,7 +243,7 @@ bool QGLContext::chooseContext(const QGLContext* shareContext) if (x11PixmapData->gl_surface) eglDestroySurface(d->eglContext->display(), (EGLSurface)x11PixmapData->gl_surface); - x11PixmapData->gl_surface = (Qt::HANDLE)QEgl::createSurface(device(), d->eglContext->config()); + x11PixmapData->gl_surface = (void*)QEgl::createSurface(device(), d->eglContext->config()); } return true; @@ -404,8 +404,8 @@ QGLTexture *QGLContextPrivate::bindTextureFromNativePixmap(QPixmapData* pd, cons hasAlpha ? QEgl::Translucent : QEgl::NoOptions); QPixmap tmpPixmap(pixmapData); //### - pixmapData->gl_surface = (Qt::HANDLE)QEgl::createSurface(&tmpPixmap, config); - if (pixmapData->gl_surface == (Qt::HANDLE)EGL_NO_SURFACE) { + pixmapData->gl_surface = (void*)QEgl::createSurface(&tmpPixmap, config); + if (pixmapData->gl_surface == (void*)EGL_NO_SURFACE) { haveTFP = false; return 0; } @@ -423,7 +423,7 @@ QGLTexture *QGLContextPrivate::bindTextureFromNativePixmap(QPixmapData* pd, cons if (success == EGL_FALSE) { qWarning() << "eglBindTexImage() failed:" << QEgl::errorString(); eglDestroySurface(eglContext->display(), (EGLSurface)pixmapData->gl_surface); - pixmapData->gl_surface = (Qt::HANDLE)EGL_NO_SURFACE; + pixmapData->gl_surface = (void*)EGL_NO_SURFACE; haveTFP = false; return 0; } diff --git a/src/opengl/qpixmapdata_x11gl_egl.cpp b/src/opengl/qpixmapdata_x11gl_egl.cpp index b6c33f2..797fe6b 100644 --- a/src/opengl/qpixmapdata_x11gl_egl.cpp +++ b/src/opengl/qpixmapdata_x11gl_egl.cpp @@ -235,8 +235,14 @@ void QX11GLPixmapData::beginPaint() if ((EGLSurface)gl_surface == EGL_NO_SURFACE) { QPixmap tmpPixmap(this); EGLConfig cfg = ctx->d_func()->eglContext->config(); - gl_surface = (Qt::HANDLE)QEgl::createSurface(&tmpPixmap, cfg); - ctx->d_func()->eglSurface = (EGLSurface)gl_surface; + + EGLSurface surface = QEgl::createSurface(&tmpPixmap, cfg); + if (surface == EGL_NO_SURFACE) { + qWarning() << "Error creating EGL surface for pixmap:" << QEgl::errorString(); + return; + } + gl_surface = (void*)surface; + ctx->d_func()->eglSurface = surface; ctx->d_func()->valid = true; } QGLPaintDevice::beginPaint(); -- cgit v0.12 From b0eeab376fc9f698a899be6dbc4c1fe6cef02982 Mon Sep 17 00:00:00 2001 From: Tom Cooksey Date: Wed, 10 Mar 2010 09:28:53 +0100 Subject: Make the EGL contexts in QX11GLPixmapData Q_GLOBAL_STATIC Still not ideal, but this should do for now. Reviewed-By: TrustMe --- src/opengl/qpixmapdata_x11gl_egl.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/opengl/qpixmapdata_x11gl_egl.cpp b/src/opengl/qpixmapdata_x11gl_egl.cpp index 797fe6b..d7fae16 100644 --- a/src/opengl/qpixmapdata_x11gl_egl.cpp +++ b/src/opengl/qpixmapdata_x11gl_egl.cpp @@ -61,6 +61,10 @@ QT_BEGIN_NAMESPACE // On 16bpp systems, RGB & ARGB pixmaps are different bit-depths and therefore need // different contexts: + +Q_GLOBAL_STATIC(QEglContext, qt_x11gl_rgbContext); +Q_GLOBAL_STATIC(QEglContext, qt_x11gl_argbContext) + QEglContext* QX11GLPixmapData::rgbContext = 0; QEglContext* QX11GLPixmapData::argbContext = 0; @@ -75,6 +79,9 @@ bool QX11GLPixmapData::hasX11GLPixmaps() checkedForX11Pixmaps = true; + EGLint rgbConfigId; + EGLint argbConfigId; + do { if (qgetenv("QT_USE_X11GL_PIXMAPS").isEmpty()) break; @@ -83,8 +90,11 @@ bool QX11GLPixmapData::hasX11GLPixmaps() EGLConfig argbConfig = QEgl::defaultConfig(QInternal::Pixmap, QEgl::OpenGL, QEgl::Renderable | QEgl::Translucent); + eglGetConfigAttrib(QEgl::display(), rgbConfig, EGL_CONFIG_ID, &rgbConfigId); + eglGetConfigAttrib(QEgl::display(), argbConfig, EGL_CONFIG_ID, &argbConfigId); + if (!rgbContext) { - rgbContext = new QEglContext; + rgbContext = qt_x11gl_rgbContext(); rgbContext->setConfig(rgbConfig); rgbContext->createContext(); } @@ -97,7 +107,7 @@ bool QX11GLPixmapData::hasX11GLPixmaps() argbContext = rgbContext; if (!argbContext) { - argbContext = new QEglContext; + argbContext = qt_x11gl_argbContext(); argbContext->setConfig(argbConfig); argbContext->createContext(); } @@ -156,7 +166,7 @@ bool QX11GLPixmapData::hasX11GLPixmaps() } if (haveX11Pixmaps) - qDebug("QX11GLPixmapData is supported"); + qDebug("Using QX11GLPixmapData with EGL config %d for ARGB and config %d for RGB", argbConfigId, rgbConfigId); else qDebug("QX11GLPixmapData is *NOT* being used"); -- cgit v0.12 From 620a584c20c1aeb059803dfe246597daaf4f4e04 Mon Sep 17 00:00:00 2001 From: Tom Cooksey Date: Wed, 10 Mar 2010 10:16:23 +0100 Subject: Make sure 16-bit EGL configs are chosen over 32-bit configs We want to make sure 16-bit configs are chosen over 32-bit configs as they will provide the best performance. The EGL config selection algorithm is a bit stange in this regard: The selection criteria for EGL_BUFFER_SIZE is "AtLeast", so we can't use it to discard 32-bit configs completely from the selection. So it then comes to the sorting algorithm. The red/green/blue sizes have a sort priority of 3, so they are sorted by first. The sort order is special and described as "by larger _total_ number of color bits.". So EGL will put 32-bit configs in the list before the 16-bit configs. However, the spec also goes on to say "If the requested number of bits in attrib_list for a particular component is 0, then the number of bits for that component is not considered". This part of the spec also seems to imply that setting the red/green/blue bits to zero means none of the components are considered and EGL disregards the entire sorting rule. It then looks to the next highest priority rule, which is EGL_BUFFER_SIZE. Despite the selection criteria being "AtLeast" for EGL_BUFFER_SIZE, it's sort order is "smaller" meaning 16-bit configs are put in the list before 32-bit configs. So, to make sure 16-bit is preffered over 32-bit, we must set the red/green/blue sizes to zero. This has an unfortunate consequence that if the application sets the red/green/blue size to 5/6/5 on the QGLFormat, they will probably get a 32-bit config, even when there's an RGB565 config avaliable. Oh well. Reviewed-By: TrustMe --- src/opengl/qgl_egl.cpp | 83 +++++++++++++++++++++++++++++++---------------- src/opengl/qgl_x11egl.cpp | 4 --- 2 files changed, 55 insertions(+), 32 deletions(-) diff --git a/src/opengl/qgl_egl.cpp b/src/opengl/qgl_egl.cpp index 91b271b..3d146b7 100644 --- a/src/opengl/qgl_egl.cpp +++ b/src/opengl/qgl_egl.cpp @@ -53,35 +53,62 @@ QT_BEGIN_NAMESPACE void qt_eglproperties_set_glformat(QEglProperties& eglProperties, const QGLFormat& glFormat) { - // NOTE: QGLFormat uses a magic value of -1 to indicate "don't care", even when a buffer of that - // type has been requested. - if (glFormat.depth()) { - int depthSize = glFormat.depthBufferSize(); - eglProperties.setValue(EGL_DEPTH_SIZE, depthSize == -1 ? 1 : depthSize); + int redSize = glFormat.redBufferSize(); + int greenSize = glFormat.greenBufferSize(); + int blueSize = glFormat.blueBufferSize(); + int alphaSize = glFormat.alphaBufferSize(); + int depthSize = glFormat.depthBufferSize(); + int stencilSize = glFormat.stencilBufferSize(); + int sampleCount = glFormat.samples(); + + // QGLFormat uses a magic value of -1 to indicate "don't care", even when a buffer of that + // type has been requested. So we must check QGLFormat's booleans too if size is -1: + if (glFormat.alpha() && alphaSize <= 0) { + qDebug("QGLFormat::alpha() returned true"); + alphaSize = 1; } - if (glFormat.stencil()) { - int stencilSize = glFormat.stencilBufferSize(); - eglProperties.setValue(EGL_STENCIL_SIZE, stencilSize == -1 ? 1 : stencilSize); - } - if (glFormat.sampleBuffers()) { - int sampleCount = glFormat.samples(); - eglProperties.setValue(EGL_SAMPLES, sampleCount == -1 ? 1 : sampleCount); - eglProperties.setValue(EGL_SAMPLE_BUFFERS, 1); - } - if (glFormat.alpha()) { - int alphaSize = glFormat.alphaBufferSize(); - eglProperties.setValue(EGL_ALPHA_SIZE, alphaSize == -1 ? 1 : alphaSize); - } - - int redSize = glFormat.redBufferSize(); - int greenSize = glFormat.greenBufferSize(); - int blueSize = glFormat.blueBufferSize(); - int alphaSize = glFormat.alphaBufferSize(); - - eglProperties.setValue(EGL_RED_SIZE, redSize > 0 ? redSize : 1); - eglProperties.setValue(EGL_GREEN_SIZE, greenSize > 0 ? greenSize : 1); - eglProperties.setValue(EGL_BLUE_SIZE, blueSize > 0 ? blueSize : 1); - eglProperties.setValue(EGL_ALPHA_SIZE, alphaSize > 0 ? alphaSize : 0); + if (glFormat.depth() && depthSize <= 0) + depthSize = 1; + if (glFormat.stencil() && stencilSize <= 0) + stencilSize = 1; + if (glFormat.sampleBuffers() && sampleCount <= 0) + sampleCount = 1; + + // We want to make sure 16-bit configs are chosen over 32-bit configs as they will provide + // the best performance. The EGL config selection algorithm is a bit stange in this regard: + // The selection criteria for EGL_BUFFER_SIZE is "AtLeast", so we can't use it to discard + // 32-bit configs completely from the selection. So it then comes to the sorting algorithm. + // The red/green/blue sizes have a sort priority of 3, so they are sorted by first. The sort + // order is special and described as "by larger _total_ number of color bits.". So EGL will + // put 32-bit configs in the list before the 16-bit configs. However, the spec also goes on + // to say "If the requested number of bits in attrib_list for a particular component is 0, + // then the number of bits for that component is not considered". This part of the spec also + // seems to imply that setting the red/green/blue bits to zero means none of the components + // are considered and EGL disregards the entire sorting rule. It then looks to the next + // highest priority rule, which is EGL_BUFFER_SIZE. Despite the selection criteria being + // "AtLeast" for EGL_BUFFER_SIZE, it's sort order is "smaller" meaning 16-bit configs are + // put in the list before 32-bit configs. So, to make sure 16-bit is preffered over 32-bit, + // we must set the red/green/blue sizes to zero. This has an unfortunate consequence that + // if the application sets the red/green/blue size to 5/6/5 on the QGLFormat, they will + // probably get a 32-bit config, even when there's an RGB565 config avaliable. Oh well. + + // Now normalize the values so -1 becomes 0 + redSize = redSize > 0 ? redSize : 0; + greenSize = greenSize > 0 ? greenSize : 0; + blueSize = blueSize > 0 ? blueSize : 0; + alphaSize = alphaSize > 0 ? alphaSize : 0; + depthSize = depthSize > 0 ? depthSize : 0; + stencilSize = stencilSize > 0 ? stencilSize : 0; + sampleCount = sampleCount > 0 ? sampleCount : 0; + + eglProperties.setValue(EGL_RED_SIZE, redSize); + eglProperties.setValue(EGL_GREEN_SIZE, greenSize); + eglProperties.setValue(EGL_BLUE_SIZE, blueSize); + eglProperties.setValue(EGL_ALPHA_SIZE, alphaSize); + eglProperties.setValue(EGL_DEPTH_SIZE, depthSize); + eglProperties.setValue(EGL_STENCIL_SIZE, stencilSize); + eglProperties.setValue(EGL_SAMPLES, sampleCount); + eglProperties.setValue(EGL_SAMPLE_BUFFERS, sampleCount ? 1 : 0); } diff --git a/src/opengl/qgl_x11egl.cpp b/src/opengl/qgl_x11egl.cpp index 81eb35c..a7c92cf 100644 --- a/src/opengl/qgl_x11egl.cpp +++ b/src/opengl/qgl_x11egl.cpp @@ -198,10 +198,6 @@ bool QGLContext::chooseContext(const QGLContext* shareContext) configProps.setRenderableType(QEgl::OpenGL); qt_eglproperties_set_glformat(configProps, d->glFormat); - // Use EGL_BUFFER_SIZE to make sure we prefer a 16-bit config over a 32-bit config - if (device()->depth() == 16 && !d->glFormat.alpha()) - configProps.setValue(EGL_BUFFER_SIZE, 16); - if (!d->eglContext->chooseConfig(configProps, QEgl::BestPixelFormat)) { delete d->eglContext; d->eglContext = 0; -- cgit v0.12 From 66e22b5b65b09cf4824dbfbc91e8dea04e8e4214 Mon Sep 17 00:00:00 2001 From: Thierry Bastian Date: Wed, 10 Mar 2010 09:41:11 +0100 Subject: MAke the SIMD fiunctions be used even when the QT_NO_DEBUG macro is used Reviewed-by: Benjamin Poulain --- src/gui/painting/qdrawhelper.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index 5f70cb7..581b538 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -7820,7 +7820,6 @@ void qInitDrawhelperAsm() CompositionFunction *functionForModeAsm = 0; CompositionFunctionSolid *functionForModeSolidAsm = 0; -#ifdef QT_NO_DEBUG const uint features = qDetectCPUFeatures(); if (false) { #ifdef QT_HAVE_SSE2 @@ -7944,8 +7943,6 @@ void qInitDrawhelperAsm() } #endif // IWMMXT -#endif // QT_NO_DEBUG - #if defined(Q_CC_RVCT) && defined(QT_HAVE_ARMV6) functionForModeAsm = qt_functionForMode_ARMv6; functionForModeSolidAsm = qt_functionForModeSolid_ARMv6; -- cgit v0.12 From 960ff0590e99b28bc72d3aa104794bfa13eda2e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trond=20Kjern=C3=A5sen?= Date: Wed, 10 Mar 2010 12:58:33 +0100 Subject: Compile with Qt3Support in a ScratchBox environment. Reviewed-by: Tom Cooksey --- src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp index 2b5f2f4..5f0d920 100644 --- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp +++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp @@ -64,6 +64,7 @@ // #define QT_OPENGL_CACHE_AS_VBOS +#include "qglgradientcache_p.h" #include "qpaintengineex_opengl2_p.h" #include //for memcpy @@ -80,7 +81,6 @@ #include #include -#include "qglgradientcache_p.h" #include "qglengineshadermanager_p.h" #include "qgl2pexvertexarray_p.h" #include "qtriangulatingstroker_p.h" -- cgit v0.12 From c0eeb2af8f6a023ac1c67f3cf955be3e4b13f998 Mon Sep 17 00:00:00 2001 From: Shane Kearns Date: Wed, 10 Mar 2010 13:17:32 +0100 Subject: Update def files for latest QtDeclarative API The QDeclarativeBinding API is new since last week's freeze. Froze the def files again, so that applications that use this API will be able to link. Task-number: QTBUG-8909 Reviewed-by: Trust Me --- src/s60installs/bwins/QtDeclarativeu.def | 59 ++++++++++++++++++++++++++++++ src/s60installs/eabi/QtDeclarativeu.def | 61 ++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+) diff --git a/src/s60installs/bwins/QtDeclarativeu.def b/src/s60installs/bwins/QtDeclarativeu.def index 05d7ae1..ba8d183 100644 --- a/src/s60installs/bwins/QtDeclarativeu.def +++ b/src/s60installs/bwins/QtDeclarativeu.def @@ -3437,4 +3437,63 @@ EXPORTS ?staticMetaObject@QDeclarativeDrag@@2UQMetaObject@@B @ 3436 NONAME ; struct QMetaObject const QDeclarativeDrag::staticMetaObject ?staticMetaObject@QDeclarativeDebugClient@@2UQMetaObject@@B @ 3437 NONAME ; struct QMetaObject const QDeclarativeDebugClient::staticMetaObject ?staticMetaObject@QDeclarativeComponent@@2UQMetaObject@@B @ 3438 NONAME ; struct QMetaObject const QDeclarativeComponent::staticMetaObject + ??0QDeclarativeAbstractBinding@@QAE@XZ @ 3439 NONAME ; QDeclarativeAbstractBinding::QDeclarativeAbstractBinding(void) + ??0QDeclarativeBinding@@QAE@ABVQString@@PAVQObject@@PAVQDeclarativeContext@@1@Z @ 3440 NONAME ; QDeclarativeBinding::QDeclarativeBinding(class QString const &, class QObject *, class QDeclarativeContext *, class QObject *) + ??0QDeclarativeBinding@@QAE@PAXPAVQDeclarativeRefCount@@PAVQObject@@PAVQDeclarativeContext@@ABVQString@@H2@Z @ 3441 NONAME ; QDeclarativeBinding::QDeclarativeBinding(void *, class QDeclarativeRefCount *, class QObject *, class QDeclarativeContext *, class QString const &, int, class QObject *) + ??0QDeclarativePropertyPrivate@@QAE@ABV0@@Z @ 3442 NONAME ; QDeclarativePropertyPrivate::QDeclarativePropertyPrivate(class QDeclarativePropertyPrivate const &) + ??0QDeclarativePropertyPrivate@@QAE@XZ @ 3443 NONAME ; QDeclarativePropertyPrivate::QDeclarativePropertyPrivate(void) + ??1QDeclarativeAbstractBinding@@UAE@XZ @ 3444 NONAME ; QDeclarativeAbstractBinding::~QDeclarativeAbstractBinding(void) + ??1QDeclarativeBinding@@UAE@XZ @ 3445 NONAME ; QDeclarativeBinding::~QDeclarativeBinding(void) + ??1QDeclarativePropertyPrivate@@QAE@XZ @ 3446 NONAME ; QDeclarativePropertyPrivate::~QDeclarativePropertyPrivate(void) + ??_EQDeclarativeAbstractBinding@@UAE@I@Z @ 3447 NONAME ; QDeclarativeAbstractBinding::~QDeclarativeAbstractBinding(unsigned int) + ??_EQDeclarativeBinding@@UAE@I@Z @ 3448 NONAME ; QDeclarativeBinding::~QDeclarativeBinding(unsigned int) + ?addToObject@QDeclarativeAbstractBinding@@QAEXPAVQObject@@@Z @ 3449 NONAME ; void QDeclarativeAbstractBinding::addToObject(class QObject *) + ?binding@QDeclarativePropertyPrivate@@SAPAVQDeclarativeAbstractBinding@@ABVQDeclarativeProperty@@@Z @ 3450 NONAME ; class QDeclarativeAbstractBinding * QDeclarativePropertyPrivate::binding(class QDeclarativeProperty const &) + ?canConvert@QDeclarativePropertyPrivate@@SA_NPBUQMetaObject@@0@Z @ 3451 NONAME ; bool QDeclarativePropertyPrivate::canConvert(struct QMetaObject const *, struct QMetaObject const *) + ?clear@QDeclarativeAbstractBinding@@IAEXXZ @ 3452 NONAME ; void QDeclarativeAbstractBinding::clear(void) + ?d_func@QDeclarativeBinding@@AAEPAVQDeclarativeBindingPrivate@@XZ @ 3453 NONAME ; class QDeclarativeBindingPrivate * QDeclarativeBinding::d_func(void) + ?d_func@QDeclarativeBinding@@ABEPBVQDeclarativeBindingPrivate@@XZ @ 3454 NONAME ; class QDeclarativeBindingPrivate const * QDeclarativeBinding::d_func(void) const + ?destroy@QDeclarativeAbstractBinding@@UAEXXZ @ 3455 NONAME ; void QDeclarativeAbstractBinding::destroy(void) + ?enabled@QDeclarativeBinding@@QBE_NXZ @ 3456 NONAME ; bool QDeclarativeBinding::enabled(void) const + ?equal@QDeclarativePropertyPrivate@@SA_NPBUQMetaObject@@0@Z @ 3457 NONAME ; bool QDeclarativePropertyPrivate::equal(struct QMetaObject const *, struct QMetaObject const *) + ?expression@QDeclarativeAbstractBinding@@UBE?AVQString@@XZ @ 3458 NONAME ; class QString QDeclarativeAbstractBinding::expression(void) const + ?expression@QDeclarativeBinding@@UBE?AVQString@@XZ @ 3459 NONAME ; class QString QDeclarativeBinding::expression(void) const + ?getStaticMetaObject@QDeclarativeBinding@@SAABUQMetaObject@@XZ @ 3460 NONAME ; struct QMetaObject const & QDeclarativeBinding::getStaticMetaObject(void) + ?initDefault@QDeclarativePropertyPrivate@@QAEXPAVQObject@@@Z @ 3461 NONAME ; void QDeclarativePropertyPrivate::initDefault(class QObject *) + ?initProperty@QDeclarativePropertyPrivate@@QAEXPAVQObject@@ABVQString@@@Z @ 3462 NONAME ; void QDeclarativePropertyPrivate::initProperty(class QObject *, class QString const &) + ?isValueType@QDeclarativePropertyPrivate@@QBE_NXZ @ 3463 NONAME ; bool QDeclarativePropertyPrivate::isValueType(void) const + ?metaObject@QDeclarativeBinding@@UBEPBUQMetaObject@@XZ @ 3464 NONAME ; struct QMetaObject const * QDeclarativeBinding::metaObject(void) const + ?property@QDeclarativeBinding@@QBE?AVQDeclarativeProperty@@XZ @ 3465 NONAME ; class QDeclarativeProperty QDeclarativeBinding::property(void) const + ?propertyIndex@QDeclarativeBinding@@UAEHXZ @ 3466 NONAME ; int QDeclarativeBinding::propertyIndex(void) + ?propertyType@QDeclarativePropertyPrivate@@QBEHXZ @ 3467 NONAME ; int QDeclarativePropertyPrivate::propertyType(void) const + ?propertyTypeCategory@QDeclarativePropertyPrivate@@QBE?AW4PropertyTypeCategory@QDeclarativeProperty@@XZ @ 3468 NONAME ; enum QDeclarativeProperty::PropertyTypeCategory QDeclarativePropertyPrivate::propertyTypeCategory(void) const + ?qt_metacall@QDeclarativeBinding@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 3469 NONAME ; int QDeclarativeBinding::qt_metacall(enum QMetaObject::Call, int, void * *) + ?qt_metacast@QDeclarativeBinding@@UAEPAXPBD@Z @ 3470 NONAME ; void * QDeclarativeBinding::qt_metacast(char const *) + ?rawMetaObjectForType@QDeclarativePropertyPrivate@@SAPBUQMetaObject@@PAVQDeclarativeEnginePrivate@@H@Z @ 3471 NONAME ; struct QMetaObject const * QDeclarativePropertyPrivate::rawMetaObjectForType(class QDeclarativeEnginePrivate *, int) + ?readValueProperty@QDeclarativePropertyPrivate@@QAE?AVQVariant@@XZ @ 3472 NONAME ; class QVariant QDeclarativePropertyPrivate::readValueProperty(void) + ?removeFromObject@QDeclarativeAbstractBinding@@QAEXXZ @ 3473 NONAME ; void QDeclarativeAbstractBinding::removeFromObject(void) + ?restore@QDeclarativePropertyPrivate@@SA?AVQDeclarativeProperty@@ABVQByteArray@@PAVQObject@@PAVQDeclarativeContext@@@Z @ 3474 NONAME ; class QDeclarativeProperty QDeclarativePropertyPrivate::restore(class QByteArray const &, class QObject *, class QDeclarativeContext *) + ?saveProperty@QDeclarativePropertyPrivate@@SA?AVQByteArray@@PBUQMetaObject@@H@Z @ 3475 NONAME ; class QByteArray QDeclarativePropertyPrivate::saveProperty(struct QMetaObject const *, int) + ?saveValueType@QDeclarativePropertyPrivate@@SA?AVQByteArray@@PBUQMetaObject@@H0H@Z @ 3476 NONAME ; class QByteArray QDeclarativePropertyPrivate::saveValueType(struct QMetaObject const *, int, struct QMetaObject const *, int) + ?setBinding@QDeclarativePropertyPrivate@@SAPAVQDeclarativeAbstractBinding@@ABVQDeclarativeProperty@@PAV2@V?$QFlags@W4WriteFlag@QDeclarativePropertyPrivate@@@@@Z @ 3477 NONAME ; class QDeclarativeAbstractBinding * QDeclarativePropertyPrivate::setBinding(class QDeclarativeProperty const &, class QDeclarativeAbstractBinding *, class QFlags) + ?setBinding@QDeclarativePropertyPrivate@@SAPAVQDeclarativeAbstractBinding@@PAVQObject@@ABUData@QDeclarativePropertyCache@@PAV2@V?$QFlags@W4WriteFlag@QDeclarativePropertyPrivate@@@@@Z @ 3478 NONAME ; class QDeclarativeAbstractBinding * QDeclarativePropertyPrivate::setBinding(class QObject *, struct QDeclarativePropertyCache::Data const &, class QDeclarativeAbstractBinding *, class QFlags) + ?setEnabled@QDeclarativeAbstractBinding@@QAEX_N@Z @ 3479 NONAME ; void QDeclarativeAbstractBinding::setEnabled(bool) + ?setEnabled@QDeclarativeAbstractBinding@@UAEX_NV?$QFlags@W4WriteFlag@QDeclarativePropertyPrivate@@@@@Z @ 3480 NONAME ; void QDeclarativeAbstractBinding::setEnabled(bool, class QFlags) + ?setEnabled@QDeclarativeBinding@@UAEX_NV?$QFlags@W4WriteFlag@QDeclarativePropertyPrivate@@@@@Z @ 3481 NONAME ; void QDeclarativeBinding::setEnabled(bool, class QFlags) + ?setSignalExpression@QDeclarativePropertyPrivate@@SAPAVQDeclarativeExpression@@ABVQDeclarativeProperty@@PAV2@@Z @ 3482 NONAME ; class QDeclarativeExpression * QDeclarativePropertyPrivate::setSignalExpression(class QDeclarativeProperty const &, class QDeclarativeExpression *) + ?setTarget@QDeclarativeBinding@@QAEXABVQDeclarativeProperty@@@Z @ 3483 NONAME ; void QDeclarativeBinding::setTarget(class QDeclarativeProperty const &) + ?signalExpression@QDeclarativePropertyPrivate@@SAPAVQDeclarativeExpression@@ABVQDeclarativeProperty@@@Z @ 3484 NONAME ; class QDeclarativeExpression * QDeclarativePropertyPrivate::signalExpression(class QDeclarativeProperty const &) + ?tr@QDeclarativeBinding@@SA?AVQString@@PBD0@Z @ 3485 NONAME ; class QString QDeclarativeBinding::tr(char const *, char const *) + ?tr@QDeclarativeBinding@@SA?AVQString@@PBD0H@Z @ 3486 NONAME ; class QString QDeclarativeBinding::tr(char const *, char const *, int) + ?trUtf8@QDeclarativeBinding@@SA?AVQString@@PBD0@Z @ 3487 NONAME ; class QString QDeclarativeBinding::trUtf8(char const *, char const *) + ?trUtf8@QDeclarativeBinding@@SA?AVQString@@PBD0H@Z @ 3488 NONAME ; class QString QDeclarativeBinding::trUtf8(char const *, char const *, int) + ?update@QDeclarativeAbstractBinding@@QAEXXZ @ 3489 NONAME ; void QDeclarativeAbstractBinding::update(void) + ?update@QDeclarativeBinding@@QAEXXZ @ 3490 NONAME ; void QDeclarativeBinding::update(void) + ?update@QDeclarativeBinding@@UAEXV?$QFlags@W4WriteFlag@QDeclarativePropertyPrivate@@@@@Z @ 3491 NONAME ; void QDeclarativeBinding::update(class QFlags) + ?valueTypeCoreIndex@QDeclarativePropertyPrivate@@SAHABVQDeclarativeProperty@@@Z @ 3492 NONAME ; int QDeclarativePropertyPrivate::valueTypeCoreIndex(class QDeclarativeProperty const &) + ?write@QDeclarativePropertyPrivate@@SA_NABVQDeclarativeProperty@@ABVQVariant@@V?$QFlags@W4WriteFlag@QDeclarativePropertyPrivate@@@@@Z @ 3493 NONAME ; bool QDeclarativePropertyPrivate::write(class QDeclarativeProperty const &, class QVariant const &, class QFlags) + ?write@QDeclarativePropertyPrivate@@SA_NPAVQObject@@ABUData@QDeclarativePropertyCache@@ABVQVariant@@PAVQDeclarativeContext@@V?$QFlags@W4WriteFlag@QDeclarativePropertyPrivate@@@@@Z @ 3494 NONAME ; bool QDeclarativePropertyPrivate::write(class QObject *, struct QDeclarativePropertyCache::Data const &, class QVariant const &, class QDeclarativeContext *, class QFlags) + ?writeEnumProperty@QDeclarativePropertyPrivate@@SA_NABVQMetaProperty@@HPAVQObject@@ABVQVariant@@H@Z @ 3495 NONAME ; bool QDeclarativePropertyPrivate::writeEnumProperty(class QMetaProperty const &, int, class QObject *, class QVariant const &, int) + ?writeValueProperty@QDeclarativePropertyPrivate@@QAE_NABVQVariant@@V?$QFlags@W4WriteFlag@QDeclarativePropertyPrivate@@@@@Z @ 3496 NONAME ; bool QDeclarativePropertyPrivate::writeValueProperty(class QVariant const &, class QFlags) + ?staticMetaObject@QDeclarativeBinding@@2UQMetaObject@@B @ 3497 NONAME ; struct QMetaObject const QDeclarativeBinding::staticMetaObject diff --git a/src/s60installs/eabi/QtDeclarativeu.def b/src/s60installs/eabi/QtDeclarativeu.def index 3708e21..e4fc7a3 100644 --- a/src/s60installs/eabi/QtDeclarativeu.def +++ b/src/s60installs/eabi/QtDeclarativeu.def @@ -3476,4 +3476,65 @@ EXPORTS _ZlsR11QDataStreamRKN29QDeclarativeEngineDebugServer26QDeclarativeObjectPropertyE @ 3475 NONAME _ZrsR11QDataStreamRN29QDeclarativeEngineDebugServer22QDeclarativeObjectDataE @ 3476 NONAME _ZrsR11QDataStreamRN29QDeclarativeEngineDebugServer26QDeclarativeObjectPropertyE @ 3477 NONAME + _ZN19QDeclarativeBinding10setEnabledEb6QFlagsIN27QDeclarativePropertyPrivate9WriteFlagEE @ 3478 NONAME + _ZN19QDeclarativeBinding11qt_metacallEN11QMetaObject4CallEiPPv @ 3479 NONAME + _ZN19QDeclarativeBinding11qt_metacastEPKc @ 3480 NONAME + _ZN19QDeclarativeBinding13propertyIndexEv @ 3481 NONAME + _ZN19QDeclarativeBinding16staticMetaObjectE @ 3482 NONAME DATA 16 + _ZN19QDeclarativeBinding19getStaticMetaObjectEv @ 3483 NONAME + _ZN19QDeclarativeBinding6updateE6QFlagsIN27QDeclarativePropertyPrivate9WriteFlagEE @ 3484 NONAME + _ZN19QDeclarativeBinding9setTargetERK20QDeclarativeProperty @ 3485 NONAME + _ZN19QDeclarativeBindingC1EPvP20QDeclarativeRefCountP7QObjectP19QDeclarativeContextRK7QStringiS4_ @ 3486 NONAME + _ZN19QDeclarativeBindingC1ERK7QStringP7QObjectP19QDeclarativeContextS4_ @ 3487 NONAME + _ZN19QDeclarativeBindingC2EPvP20QDeclarativeRefCountP7QObjectP19QDeclarativeContextRK7QStringiS4_ @ 3488 NONAME + _ZN19QDeclarativeBindingC2ERK7QStringP7QObjectP19QDeclarativeContextS4_ @ 3489 NONAME + _ZN19QDeclarativeBindingD0Ev @ 3490 NONAME + _ZN19QDeclarativeBindingD1Ev @ 3491 NONAME + _ZN19QDeclarativeBindingD2Ev @ 3492 NONAME + _ZN27QDeclarativeAbstractBinding10setEnabledEb6QFlagsIN27QDeclarativePropertyPrivate9WriteFlagEE @ 3493 NONAME + _ZN27QDeclarativeAbstractBinding11addToObjectEP7QObject @ 3494 NONAME + _ZN27QDeclarativeAbstractBinding16removeFromObjectEv @ 3495 NONAME + _ZN27QDeclarativeAbstractBinding5clearEv @ 3496 NONAME + _ZN27QDeclarativeAbstractBinding7destroyEv @ 3497 NONAME + _ZN27QDeclarativeAbstractBindingC2Ev @ 3498 NONAME + _ZN27QDeclarativeAbstractBindingD0Ev @ 3499 NONAME + _ZN27QDeclarativeAbstractBindingD1Ev @ 3500 NONAME + _ZN27QDeclarativeAbstractBindingD2Ev @ 3501 NONAME + _ZN27QDeclarativePropertyPrivate10canConvertEPK11QMetaObjectS2_ @ 3502 NONAME + _ZN27QDeclarativePropertyPrivate10setBindingEP7QObjectRKN25QDeclarativePropertyCache4DataEP27QDeclarativeAbstractBinding6QFlagsINS_9WriteFlagEE @ 3503 NONAME + _ZN27QDeclarativePropertyPrivate10setBindingERK20QDeclarativePropertyP27QDeclarativeAbstractBinding6QFlagsINS_9WriteFlagEE @ 3504 NONAME + _ZN27QDeclarativePropertyPrivate11initDefaultEP7QObject @ 3505 NONAME + _ZN27QDeclarativePropertyPrivate12initPropertyEP7QObjectRK7QString @ 3506 NONAME + _ZN27QDeclarativePropertyPrivate12savePropertyEPK11QMetaObjecti @ 3507 NONAME + _ZN27QDeclarativePropertyPrivate13saveValueTypeEPK11QMetaObjectiS2_i @ 3508 NONAME + _ZN27QDeclarativePropertyPrivate16signalExpressionERK20QDeclarativeProperty @ 3509 NONAME + _ZN27QDeclarativePropertyPrivate17readValuePropertyEv @ 3510 NONAME + _ZN27QDeclarativePropertyPrivate17writeEnumPropertyERK13QMetaPropertyiP7QObjectRK8QVarianti @ 3511 NONAME + _ZN27QDeclarativePropertyPrivate18valueTypeCoreIndexERK20QDeclarativeProperty @ 3512 NONAME + _ZN27QDeclarativePropertyPrivate18writeValuePropertyERK8QVariant6QFlagsINS_9WriteFlagEE @ 3513 NONAME + _ZN27QDeclarativePropertyPrivate19setSignalExpressionERK20QDeclarativePropertyP22QDeclarativeExpression @ 3514 NONAME + _ZN27QDeclarativePropertyPrivate20rawMetaObjectForTypeEP25QDeclarativeEnginePrivatei @ 3515 NONAME + _ZN27QDeclarativePropertyPrivate5equalEPK11QMetaObjectS2_ @ 3516 NONAME + _ZN27QDeclarativePropertyPrivate5writeEP7QObjectRKN25QDeclarativePropertyCache4DataERK8QVariantP19QDeclarativeContext6QFlagsINS_9WriteFlagEE @ 3517 NONAME + _ZN27QDeclarativePropertyPrivate5writeERK20QDeclarativePropertyRK8QVariant6QFlagsINS_9WriteFlagEE @ 3518 NONAME + _ZN27QDeclarativePropertyPrivate7bindingERK20QDeclarativeProperty @ 3519 NONAME + _ZN27QDeclarativePropertyPrivate7restoreERK10QByteArrayP7QObjectP19QDeclarativeContext @ 3520 NONAME + _ZNK19QDeclarativeBinding10expressionEv @ 3521 NONAME + _ZNK19QDeclarativeBinding10metaObjectEv @ 3522 NONAME + _ZNK19QDeclarativeBinding7enabledEv @ 3523 NONAME + _ZNK19QDeclarativeBinding8propertyEv @ 3524 NONAME + _ZNK27QDeclarativeAbstractBinding10expressionEv @ 3525 NONAME + _ZNK27QDeclarativePropertyPrivate11isValueTypeEv @ 3526 NONAME + _ZNK27QDeclarativePropertyPrivate12propertyTypeEv @ 3527 NONAME + _ZNK27QDeclarativePropertyPrivate20propertyTypeCategoryEv @ 3528 NONAME + _ZTI19QDeclarativeBinding @ 3529 NONAME + _ZTI27QDeclarativeAbstractBinding @ 3530 NONAME + _ZTV19QDeclarativeBinding @ 3531 NONAME + _ZTV27QDeclarativeAbstractBinding @ 3532 NONAME + _ZThn8_N19QDeclarativeBinding10setEnabledEb6QFlagsIN27QDeclarativePropertyPrivate9WriteFlagEE @ 3533 NONAME + _ZThn8_N19QDeclarativeBinding13propertyIndexEv @ 3534 NONAME + _ZThn8_N19QDeclarativeBinding6updateE6QFlagsIN27QDeclarativePropertyPrivate9WriteFlagEE @ 3535 NONAME + _ZThn8_N19QDeclarativeBindingD0Ev @ 3536 NONAME + _ZThn8_N19QDeclarativeBindingD1Ev @ 3537 NONAME + _ZThn8_NK19QDeclarativeBinding10expressionEv @ 3538 NONAME -- cgit v0.12 From 9bba92715d96939e4d36c6ea42e8b466756bf891 Mon Sep 17 00:00:00 2001 From: Alexader Karaivanov Date: Wed, 10 Mar 2010 12:42:39 +0100 Subject: Fixes Q3ListViewItem grandchildren not sorted if item has one child Q3ListViewItem::sortChildItems() used to exits early if there is only 1 child item and leaves grandchildren unsorted. Merge-request: 2260 Reviewed-by: Olivier Goffart --- src/qt3support/itemviews/q3listview.cpp | 9 ++- tests/auto/q3listview/tst_q3listview.cpp | 126 ++++++++++++++++++++++++++++++- 2 files changed, 133 insertions(+), 2 deletions(-) diff --git a/src/qt3support/itemviews/q3listview.cpp b/src/qt3support/itemviews/q3listview.cpp index 12dad84..4900827 100644 --- a/src/qt3support/itemviews/q3listview.cpp +++ b/src/qt3support/itemviews/q3listview.cpp @@ -1324,8 +1324,15 @@ void Q3ListViewItem::sortChildItems(int column, bool ascending) const int nColumns = (listView() ? listView()->columns() : 0); // and don't sort if we already have the right sorting order - if (column > nColumns || childItem == 0 || childItem->siblingItem == 0) + if (column > nColumns || childItem == 0) return; + + // If there is just one child, just sort its children + if (childItem->siblingItem == 0) { + if (childItem->isOpen()) + childItem->sortChildItems(column, ascending); + return; + } // make an array for qHeapSort() Q3ListViewPrivate::SortableItem * siblings diff --git a/tests/auto/q3listview/tst_q3listview.cpp b/tests/auto/q3listview/tst_q3listview.cpp index 4de6f95..56fa25f 100644 --- a/tests/auto/q3listview/tst_q3listview.cpp +++ b/tests/auto/q3listview/tst_q3listview.cpp @@ -39,6 +39,7 @@ ** ****************************************************************************/ +#include #include @@ -87,6 +88,8 @@ public slots: private slots: void getSetCheck(); void sortchild(); + void sortchild2(); // item -> item -> 3 items + void sortchild3(); // item -> 3 items void takeItem_data(); void takeItem(); void selections_mouseClick_data(); @@ -262,7 +265,7 @@ void tst_Q3ListView::sortchild() QVERIFY( item == item1 ); listview->setSorting( 0, FALSE ); - + item = listview->firstChild(); QVERIFY( item == item1 ); item = item->itemBelow(); @@ -291,6 +294,127 @@ void tst_Q3ListView::sortchild() delete listview; } +void tst_Q3ListView::sortchild2() +{ + Q3ListView* listview = new Q3ListView( 0 ); + + listview->addColumn( "" ); + + Q3ListViewItem* item1 = new Q3ListViewItem( listview, "zzz" ); + Q3ListViewItem* item2 = new Q3ListViewItem( listview, "hhh" ); + Q3ListViewItem* item3 = new Q3ListViewItem( listview, "bbb" ); + Q3ListViewItem* item4 = new Q3ListViewItem( listview, "jjj" ); + Q3ListViewItem* item5 = new Q3ListViewItem( listview, "ddd" ); + Q3ListViewItem* item6 = new Q3ListViewItem( listview, "lll" ); + + Q3ListViewItem* item31 = new Q3ListViewItem( item3, "bbb-level2" ); + + Q3ListViewItem* item31b = new Q3ListViewItem( item31, "234" ); + Q3ListViewItem* item31c = new Q3ListViewItem( item31, "345" ); + Q3ListViewItem* item31a = new Q3ListViewItem( item31, "123" ); + + listview->setOpen( item3, TRUE ); + listview->setOpen( item31, TRUE ); + + listview->setSorting( 0, TRUE ); + listview->show(); + + Q3ListViewItem *item = listview->firstChild(); + QVERIFY( item == item3 ); + item = item->itemBelow(); + QVERIFY( item == item31 ); + item = item->itemBelow(); + QVERIFY( item == item31a ); + item = item->itemBelow(); + QVERIFY( item == item31b ); + item = item->itemBelow(); + QVERIFY( item == item31c ); + item = item->itemBelow(); + QVERIFY( item == item5 ); + item = item->itemBelow(); + QVERIFY( item == item2 ); + item = item->itemBelow(); + QVERIFY( item == item4 ); + item = item->itemBelow(); + QVERIFY( item == item6 ); + item = item->itemBelow(); + QVERIFY( item == item1 ); + + listview->setSorting( 0, FALSE ); + + item = listview->firstChild(); + QVERIFY( item == item1 ); + item = item->itemBelow(); + QVERIFY( item == item6 ); + item = item->itemBelow(); + QVERIFY( item == item4 ); + item = item->itemBelow(); + QVERIFY( item == item2 ); + item = item->itemBelow(); + QVERIFY( item == item5 ); + item = item->itemBelow(); + QVERIFY( item == item3 ); + item = item->itemBelow(); + QVERIFY( item == item31 ); + item = item->itemBelow(); + QVERIFY( item == item31c ); + item = item->itemBelow(); + QVERIFY( item == item31b ); + item = item->itemBelow(); + QVERIFY( item == item31a ); + + item = listview->firstChild(); + item->moveItem( item->itemBelow() ); + + listview->setSorting( 0, FALSE ); + QVERIFY( item == listview->firstChild() ); + + delete listview; +} + +void tst_Q3ListView::sortchild3() +{ + Q3ListView* listview = new Q3ListView( 0 ); + + listview->addColumn( "" ); + + Q3ListViewItem* item3 = new Q3ListViewItem( listview, "bbb" ); + + + Q3ListViewItem* item31b = new Q3ListViewItem( item3, "234" ); + Q3ListViewItem* item31c = new Q3ListViewItem( item3, "345" ); + Q3ListViewItem* item31a = new Q3ListViewItem( item3, "123" ); + + listview->setOpen( item3, TRUE ); + + listview->setSorting( 0, TRUE ); + listview->show(); + + Q3ListViewItem *item = listview->firstChild(); + QVERIFY( item == item3 ); + item = item->itemBelow(); + QVERIFY( item == item31a ); + item = item->itemBelow(); + QVERIFY( item == item31b ); + item = item->itemBelow(); + QVERIFY( item == item31c ); + item = item->itemBelow(); + + listview->setSorting( 0, FALSE ); + + item = listview->firstChild(); + QVERIFY( item == item3 ); + item = item->itemBelow(); + QVERIFY( item == item31c ); + item = item->itemBelow(); + QVERIFY( item == item31b ); + item = item->itemBelow(); + QVERIFY( item == item31a ); + + delete listview; +} + + void tst_Q3ListView::takeItem_data() { QTest::addColumn("selectionMode"); -- cgit v0.12 From 01a045084ad45da37e6b79938354c82419c0a83e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Wed, 10 Mar 2010 13:34:51 +0100 Subject: Added configure check to diasable building QtDeclarative when Qt is not building the QtScript module --- configure | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/configure b/configure index 71056b6..60bcc67 100755 --- a/configure +++ b/configure @@ -5962,19 +5962,6 @@ if [ "$CFG_NETWORKMANAGER" = "auto" ]; then fi fi -if [ -f "$relpath/src/declarative/declarative.pro" ]; then - if [ "$CFG_DECLARATIVE" = "auto" ]; then - CFG_DECLARATIVE=yes - fi -else - if [ "$CFG_DECLARATIVE" = "auto" ] || [ "$CFG_DECLARATIVE" = "no" ]; then - CFG_DECLARATIVE=no - else - echo "Error: Unable to locate the qt-declarative package. Refer to the documentation on how to build the package." - exit 1 - fi -fi - if [ "$CFG_JAVASCRIPTCORE_JIT" = "yes" ] || [ "$CFG_JAVASCRIPTCORE_JIT" = "auto" ]; then if [ "$CFG_ARCH" = "arm" ] || [ "$CFG_ARCH" = "armv6" ]; then "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/javascriptcore-jit "javascriptcore-jit" $L_FLAGS $I_FLAGS $l_FLAGS @@ -6629,12 +6616,6 @@ else QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_SVG" fi -if [ "$CFG_DECLARATIVE" = "yes" ]; then - QT_CONFIG="$QT_CONFIG declarative" -else - QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_DECLARATIVE" -fi - if [ "$CFG_WEBKIT" = "auto" ]; then CFG_WEBKIT="$canBuildWebKit" fi @@ -6674,6 +6655,27 @@ else QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_SCRIPTTOOLS" fi + +if [ "$CFG_DECLARATIVE" = "yes" ]; then + if [ "$CFG_SCRIPT" = "no" ]; then + echo "Error: QtDeclarative was requested, but it can't be built due to QtScript being disabled." + exit 1 + fi +fi +if [ "$CFG_DECLARATIVE" = "auto" ]; then + if [ "$CFG_SCRIPT" = "no" ]; then + CFG_DECLARATIVE=no + else + CFG_DECLARATIVE=yes + fi +fi + +if [ "$CFG_DECLARATIVE" = "yes" ]; then + QT_CONFIG="$QT_CONFIG declarative" +else + QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_DECLARATIVE" +fi + if [ "$CFG_EXCEPTIONS" = "no" ]; then case "$COMPILER" in g++*) -- cgit v0.12 From ef9e7168a8ed3e8149204cf6c604a38db35245c0 Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Wed, 10 Mar 2010 14:44:37 +0100 Subject: Cocoa: Fix misaligned text between format changes This reverts part of commit e008504b5ec34975e34adf3b1a2b7170d0e4dd38. The original commit aimed to round up all fractional numbers for the font to "improve appearance". Rounding up the last advance of a set of advances in a glyph layout, however, breaks text layout completely, since the layout of text will be different depending on how many text lines is used to represent it (since the last glyph in each line will have a higher advance than the others.) This was e.g. visible in Qt Creator when turning on whitespace visualization, as all spaces then created a format change, thus a new text line in the text layout, and hence an increase of X pixels in the positioning of the text after the space, where 0.0 < X < 1.0. I see no negative results of removing the rounding, but if there are any problems, it has to be fixed in the usage of the advances not in the advances themselves. Task-number: QTCREATORBUG-381, QTBUG-8791 Reviewed-by: mae --- src/gui/text/qfontengine_mac.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/text/qfontengine_mac.mm b/src/gui/text/qfontengine_mac.mm index 48bc635..8588214 100644 --- a/src/gui/text/qfontengine_mac.mm +++ b/src/gui/text/qfontengine_mac.mm @@ -308,7 +308,7 @@ bool QCoreTextFontEngineMulti::stringToCMap(const QChar *str, int len, QGlyphLay CTFontGetAdvancesForGlyphs(runFont, kCTFontHorizontalOrientation, tmpGlyphs + glyphCount - 1, &lastGlyphAdvance, 1); outGlyphs[rtl ? 0 : (glyphCount - 1)] = tmpGlyphs[glyphCount - 1] | fontIndex; - outAdvances_x[rtl ? 0 : (glyphCount - 1)] = QFixed::fromReal(lastGlyphAdvance.width).ceil(); + outAdvances_x[rtl ? 0 : (glyphCount - 1)] = QFixed::fromReal(lastGlyphAdvance.width); } outGlyphs += glyphCount; outAttributes += glyphCount; -- cgit v0.12 From c94db224c6abb8ed9e214bb96a14b69eb1c557ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trond=20Kjern=C3=A5sen?= Date: Wed, 10 Mar 2010 15:22:21 +0100 Subject: Compile fix when Qt3Support is enabled for devices using EGL. Reviewed-by: Samuel --- src/opengl/gl2paintengineex/qglgradientcache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/opengl/gl2paintengineex/qglgradientcache.cpp b/src/opengl/gl2paintengineex/qglgradientcache.cpp index 192e01c..a1495dd 100644 --- a/src/opengl/gl2paintengineex/qglgradientcache.cpp +++ b/src/opengl/gl2paintengineex/qglgradientcache.cpp @@ -39,10 +39,10 @@ ** ****************************************************************************/ +#include "qglgradientcache_p.h" #include #include -#include "qglgradientcache_p.h" QT_BEGIN_NAMESPACE -- cgit v0.12 From 7ddf13c8fba2aadf00c0d6c822c6b4acbd3bd54f Mon Sep 17 00:00:00 2001 From: Tom Cooksey Date: Wed, 10 Mar 2010 13:34:52 +0100 Subject: Make calls to QGLFormat::set*BufferSize also update flags Reviewed-By: Trond --- src/opengl/qgl.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/opengl/qgl.cpp b/src/opengl/qgl.cpp index 73cd6a8..7839191 100644 --- a/src/opengl/qgl.cpp +++ b/src/opengl/qgl.cpp @@ -766,6 +766,7 @@ void QGLFormat::setSamples(int numSamples) return; } d->numSamples = numSamples; + setSampleBuffers(numSamples > 0); } /*! @@ -904,6 +905,7 @@ void QGLFormat::setDepthBufferSize(int size) return; } d->depthSize = size; + setDepth(size > 0); } /*! @@ -1017,7 +1019,7 @@ void QGLFormat::setAlphaBufferSize(int size) return; } d->alphaSize = size; - setOption(QGL::AlphaChannel); + setAlpha(size > 0); } /*! @@ -1044,6 +1046,7 @@ void QGLFormat::setAccumBufferSize(int size) return; } d->accumSize = size; + setAccum(size > 0); } /*! @@ -1069,6 +1072,7 @@ void QGLFormat::setStencilBufferSize(int size) return; } d->stencilSize = size; + setStencil(size > 0); } /*! -- cgit v0.12 From 9bf426a2af27ad5bfdb35706c3ed48e77f654f4d Mon Sep 17 00:00:00 2001 From: Tom Cooksey Date: Wed, 10 Mar 2010 14:50:59 +0100 Subject: Update QGLFormat from EGLConfig properly Previously, some members of QGLFormat (like alphaBufferSize) would be left to the initial -1 value. Reviewed-By: TrustMe --- src/opengl/qgl_egl.cpp | 70 ++++++++++++++++++--------------------- src/opengl/qgl_egl_p.h | 2 +- src/opengl/qgl_qws.cpp | 2 +- src/opengl/qgl_wince.cpp | 2 +- src/opengl/qgl_x11egl.cpp | 5 ++- src/opengl/qglpixelbuffer_egl.cpp | 2 +- 6 files changed, 38 insertions(+), 45 deletions(-) diff --git a/src/opengl/qgl_egl.cpp b/src/opengl/qgl_egl.cpp index 3d146b7..c08d6fd 100644 --- a/src/opengl/qgl_egl.cpp +++ b/src/opengl/qgl_egl.cpp @@ -111,46 +111,40 @@ void qt_eglproperties_set_glformat(QEglProperties& eglProperties, const QGLForma eglProperties.setValue(EGL_SAMPLE_BUFFERS, sampleCount ? 1 : 0); } - // Updates "format" with the parameters of the selected configuration. -void qt_egl_update_format(const QEglContext& context, QGLFormat& format) +void qt_glformat_from_eglconfig(QGLFormat& format, const EGLConfig config) { - EGLint value = 0; - - if (context.configAttrib(EGL_RED_SIZE, &value)) - format.setRedBufferSize(value); - if (context.configAttrib(EGL_GREEN_SIZE, &value)) - format.setGreenBufferSize(value); - if (context.configAttrib(EGL_BLUE_SIZE, &value)) - format.setBlueBufferSize(value); - if (context.configAttrib(EGL_ALPHA_SIZE, &value)) { - format.setAlpha(value != 0); - if (format.alpha()) - format.setAlphaBufferSize(value); - } - - if (context.configAttrib(EGL_DEPTH_SIZE, &value)) { - format.setDepth(value != 0); - if (format.depth()) - format.setDepthBufferSize(value); - } - - if (context.configAttrib(EGL_LEVEL, &value)) - format.setPlane(value); - - if (context.configAttrib(EGL_SAMPLE_BUFFERS, &value)) { - format.setSampleBuffers(value != 0); - if (format.sampleBuffers()) { - context.configAttrib(EGL_SAMPLES, &value); - format.setSamples(value); - } - } - - if (context.configAttrib(EGL_STENCIL_SIZE, &value)) { - format.setStencil(value != 0); - if (format.stencil()) - format.setStencilBufferSize(value); - } + EGLint redSize = 0; + EGLint greenSize = 0; + EGLint blueSize = 0; + EGLint alphaSize = 0; + EGLint depthSize = 0; + EGLint stencilSize = 0; + EGLint sampleCount = 0; + EGLint level = 0; + + EGLDisplay display = QEgl::display(); + eglGetConfigAttrib(display, config, EGL_RED_SIZE, &redSize); + eglGetConfigAttrib(display, config, EGL_GREEN_SIZE, &greenSize); + eglGetConfigAttrib(display, config, EGL_BLUE_SIZE, &blueSize); + eglGetConfigAttrib(display, config, EGL_ALPHA_SIZE, &alphaSize); + eglGetConfigAttrib(display, config, EGL_DEPTH_SIZE, &depthSize); + eglGetConfigAttrib(display, config, EGL_STENCIL_SIZE, &stencilSize); + eglGetConfigAttrib(display, config, EGL_SAMPLES, &sampleCount); + eglGetConfigAttrib(display, config, EGL_LEVEL, &level); + + format.setRedBufferSize(redSize); + format.setGreenBufferSize(greenSize); + format.setBlueBufferSize(blueSize); + format.setAlphaBufferSize(alphaSize); + format.setDepthBufferSize(depthSize); + format.setStencilBufferSize(stencilSize); + format.setSamples(sampleCount); + format.setPlane(level + 1); // EGL calls level 0 "normal" whereas Qt calls 1 "normal" + format.setDirectRendering(true); // All EGL contexts are direct-rendered + format.setRgba(true); // EGL doesn't support colour index rendering + format.setStereo(false); // EGL doesn't support stereo buffers + format.setAccumBufferSize(0); // EGL doesn't support accululation buffers // Clear the EGL error state because some of the above may // have errored out because the attribute is not applicable diff --git a/src/opengl/qgl_egl_p.h b/src/opengl/qgl_egl_p.h index 6b65227..43793cd 100644 --- a/src/opengl/qgl_egl_p.h +++ b/src/opengl/qgl_egl_p.h @@ -61,7 +61,7 @@ QT_BEGIN_NAMESPACE class QGLFormat; void qt_eglproperties_set_glformat(QEglProperties& props, const QGLFormat& format); -void qt_egl_update_format(const QEglContext& context, QGLFormat& format); +void qt_glformat_from_eglconfig(QGLFormat& format, const EGLConfig config); QT_END_NAMESPACE diff --git a/src/opengl/qgl_qws.cpp b/src/opengl/qgl_qws.cpp index f72f051..96b2454 100644 --- a/src/opengl/qgl_qws.cpp +++ b/src/opengl/qgl_qws.cpp @@ -200,7 +200,7 @@ bool QGLContext::chooseContext(const QGLContext* shareContext) } // Inform the higher layers about the actual format properties. - qt_egl_update_format(*(d->eglContext), d->glFormat); + qt_glformat_from_eglconfig(d->glFormat, d->eglContext->config()); // Create a new context for the configuration. if (!d->eglContext->createContext diff --git a/src/opengl/qgl_wince.cpp b/src/opengl/qgl_wince.cpp index 3bf7f3a..fefcca2 100644 --- a/src/opengl/qgl_wince.cpp +++ b/src/opengl/qgl_wince.cpp @@ -163,7 +163,7 @@ bool QGLContext::chooseContext(const QGLContext* shareContext) } // Inform the higher layers about the actual format properties. - qt_egl_update_format(*(d->eglContext), d->glFormat); + qt_glformat_from_eglconfig(d->glFormat, d->eglContext->config()); // Create a new context for the configuration. if (!d->eglContext->createContext diff --git a/src/opengl/qgl_x11egl.cpp b/src/opengl/qgl_x11egl.cpp index a7c92cf..fe87c65 100644 --- a/src/opengl/qgl_x11egl.cpp +++ b/src/opengl/qgl_x11egl.cpp @@ -216,9 +216,8 @@ bool QGLContext::chooseContext(const QGLContext* shareContext) const_cast(shareContext)->d_func()->sharing = true; } - // Inform the higher layers about the actual format properties. - qt_egl_update_format(*(d->eglContext), d->glFormat); - + // Inform the higher layers about the actual format properties + qt_glformat_from_eglconfig(d->glFormat, d->eglContext->config()); // Do don't create the EGLSurface for everything. // QWidget - yes, create the EGLSurface and store it in QGLContextPrivate::eglSurface diff --git a/src/opengl/qglpixelbuffer_egl.cpp b/src/opengl/qglpixelbuffer_egl.cpp index ee0714f..db9e754 100644 --- a/src/opengl/qglpixelbuffer_egl.cpp +++ b/src/opengl/qglpixelbuffer_egl.cpp @@ -113,7 +113,7 @@ bool QGLPixelBufferPrivate::init(const QSize &size, const QGLFormat &f, QGLWidge } // Retrieve the actual format properties. - qt_egl_update_format(*ctx, format); + qt_glformat_from_eglconfig(format, ctx->config()); // Create the attributes needed for the pbuffer. QEglProperties attribs; -- cgit v0.12 From 1ceb2ec18056c41c040e3087f79860b7eb7b9d3f Mon Sep 17 00:00:00 2001 From: Tom Cooksey Date: Wed, 10 Mar 2010 15:25:38 +0100 Subject: Update tst_QGL::getSetCheck to check for new (correct) behaviour Reviewed-By: Trond --- tests/auto/qgl/tst_qgl.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/auto/qgl/tst_qgl.cpp b/tests/auto/qgl/tst_qgl.cpp index d89e463..15c0b66 100644 --- a/tests/auto/qgl/tst_qgl.cpp +++ b/tests/auto/qgl/tst_qgl.cpp @@ -227,12 +227,12 @@ void tst_QGL::getSetCheck() QCOMPARE(false, obj1.alpha()); QVERIFY(!obj1.testOption(QGL::AlphaChannel)); QVERIFY(obj1.testOption(QGL::NoAlphaChannel)); - obj1.setAlphaBufferSize(0); + obj1.setAlphaBufferSize(1); QCOMPARE(true, obj1.alpha()); // setAlphaBufferSize() enables alpha. - QCOMPARE(0, obj1.alphaBufferSize()); + QCOMPARE(1, obj1.alphaBufferSize()); QTest::ignoreMessage(QtWarningMsg, "QGLFormat::setAlphaBufferSize: Cannot set negative alpha buffer size -2147483648"); obj1.setAlphaBufferSize(TEST_INT_MIN); - QCOMPARE(0, obj1.alphaBufferSize()); // Makes no sense with a negative buffer size + QCOMPARE(1, obj1.alphaBufferSize()); // Makes no sense with a negative buffer size obj1.setAlphaBufferSize(3); QTest::ignoreMessage(QtWarningMsg, "QGLFormat::setAlphaBufferSize: Cannot set negative alpha buffer size -1"); obj1.setAlphaBufferSize(-1); @@ -243,11 +243,11 @@ void tst_QGL::getSetCheck() // int QGLFormat::stencilBufferSize() // void QGLFormat::setStencilBufferSize(int) QCOMPARE(-1, obj1.stencilBufferSize()); - obj1.setStencilBufferSize(0); - QCOMPARE(0, obj1.stencilBufferSize()); + obj1.setStencilBufferSize(1); + QCOMPARE(1, obj1.stencilBufferSize()); QTest::ignoreMessage(QtWarningMsg, "QGLFormat::setStencilBufferSize: Cannot set negative stencil buffer size -2147483648"); obj1.setStencilBufferSize(TEST_INT_MIN); - QCOMPARE(0, obj1.stencilBufferSize()); // Makes no sense with a negative buffer size + QCOMPARE(1, obj1.stencilBufferSize()); // Makes no sense with a negative buffer size obj1.setStencilBufferSize(3); QTest::ignoreMessage(QtWarningMsg, "QGLFormat::setStencilBufferSize: Cannot set negative stencil buffer size -1"); obj1.setStencilBufferSize(-1); @@ -352,6 +352,7 @@ void tst_QGL::getSetCheck() // bool QGLFormat::accum() // void QGLFormat::setAccum(bool) + obj1.setAccumBufferSize(0); QCOMPARE(false, obj1.accum()); QVERIFY(!obj1.testOption(QGL::AccumBuffer)); QVERIFY(obj1.testOption(QGL::NoAccumBuffer)); -- cgit v0.12 From 477a3f2720710130dad88a1e8391f7eaf24ffb38 Mon Sep 17 00:00:00 2001 From: Kim Motoyoshi Kalland Date: Wed, 10 Mar 2010 14:17:50 +0100 Subject: Fixed assert failure when drawing dashes with raster engine. Reviewed-by: Samuel --- src/gui/painting/qpaintengine_raster.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp index bfcf7db..03d0825 100644 --- a/src/gui/painting/qpaintengine_raster.cpp +++ b/src/gui/painting/qpaintengine_raster.cpp @@ -1725,9 +1725,10 @@ void QRasterPaintEngine::stroke(const QVectorPath &path, const QPen &pen) if (patternLength > 0) { int n = qFloor(dashOffset / patternLength); dashOffset -= n * patternLength; - while (dashOffset > pattern.at(dashIndex)) { + while (dashOffset >= pattern.at(dashIndex)) { dashOffset -= pattern.at(dashIndex); - dashIndex = (dashIndex + 1) % pattern.size(); + if (++dashIndex >= pattern.size()) + dashIndex = 0; inDash = !inDash; } } @@ -1738,7 +1739,6 @@ void QRasterPaintEngine::stroke(const QVectorPath &path, const QPen &pen) const QLineF *lines = reinterpret_cast(path.points()); for (int i = 0; i < lineCount; ++i) { - dashOffset = s->lastPen.dashOffset(); if (lines[i].p1() == lines[i].p2()) { if (s->lastPen.capStyle() != Qt::FlatCap) { QPointF p = lines[i].p1(); @@ -3626,13 +3626,14 @@ void QRasterPaintEnginePrivate::rasterizeLine_dashed(QLineF line, } else { *dashOffset = 0; *inDash = !(*inDash); - *dashIndex = (*dashIndex + 1) % pattern.size(); + if (++*dashIndex >= pattern.size()) + *dashIndex = 0; length -= dash; l.setLength(dash); line.setP1(l.p2()); } - if (rasterize && dash != 0) + if (rasterize && dash > 0) rasterizer->rasterizeLine(l.p1(), l.p2(), width / dash, squareCap); } } -- cgit v0.12 From ee6c26115959f46621f5a45f3fbe4a49989fd095 Mon Sep 17 00:00:00 2001 From: Kim Motoyoshi Kalland Date: Wed, 10 Mar 2010 12:51:46 +0100 Subject: Added clipping to the dashed stroke processor in the GL2 engine. Without clipping, the stroker could consume a huge amount of memory when scaling up cosmetic, dashed strokes. I also made QDashStroker clip more aggressively. Task-number: QTBUG-7832 Reviewed-by: Samuel --- src/gui/painting/qstroker.cpp | 116 +++++++++++++++++---- .../gl2paintengineex/qpaintengineex_opengl2.cpp | 10 +- .../gl2paintengineex/qtriangulatingstroker.cpp | 5 +- .../gl2paintengineex/qtriangulatingstroker_p.h | 4 +- 4 files changed, 105 insertions(+), 30 deletions(-) diff --git a/src/gui/painting/qstroker.cpp b/src/gui/painting/qstroker.cpp index 16e3c38..9740fce 100644 --- a/src/gui/painting/qstroker.cpp +++ b/src/gui/painting/qstroker.cpp @@ -1043,6 +1043,47 @@ QVector QDashStroker::patternForStyle(Qt::PenStyle style) return pattern; } +static inline bool lineRectIntersectsRect(qfixed2d p1, qfixed2d p2, const qfixed2d &tl, const qfixed2d &br) +{ + return ((p1.x > tl.x || p2.x > tl.x) && (p1.x < br.x || p2.x < br.x) + && (p1.y > tl.y || p2.y > tl.y) && (p1.y < br.y || p2.y < br.y)); +} + +// If the line intersects the rectangle, this function will return true. +static bool lineIntersectsRect(qfixed2d p1, qfixed2d p2, const qfixed2d &tl, const qfixed2d &br) +{ + if (!lineRectIntersectsRect(p1, p2, tl, br)) + return false; + if (p1.x == p2.x || p1.y == p2.y) + return true; + + if (p1.y > p2.y) + qSwap(p1, p2); // make p1 above p2 + qfixed2d u; + qfixed2d v; + qfixed2d w = {p2.x - p1.x, p2.y - p1.y}; + if (p1.x < p2.x) { + // backslash + u.x = tl.x - p1.x; u.y = br.y - p1.y; + v.x = br.x - p1.x; v.y = tl.y - p1.y; + } else { + // slash + u.x = tl.x - p1.x; u.y = tl.y - p1.y; + v.x = br.x - p1.x; v.y = br.y - p1.y; + } +#if defined(QFIXED_IS_26_6) || defined(QFIXED_IS_16_16) + qint64 val1 = qint64(u.x) * qint64(w.y) - qint64(u.y) * qint64(w.x); + qint64 val2 = qint64(v.x) * qint64(w.y) - qint64(v.y) * qint64(w.x); + return (val1 < 0 && val2 > 0) || (val1 > 0 && val2 < 0); +#elif defined(QFIXED_IS_32_32) + // Cannot do proper test because it may overflow. + return true; +#else + qreal val1 = u.x * w.y - u.y * w.x; + qreal val2 = v.x * w.y - v.y * w.x; + return (val1 < 0 && val2 > 0) || (val1 > 0 && val2 < 0); +#endif +} void QDashStroker::processCurrentSubpath() { @@ -1067,9 +1108,11 @@ void QDashStroker::processCurrentSubpath() if (qFuzzyIsNull(sumLength)) return; + qreal invSumLength = qreal(1) / sumLength; + Q_ASSERT(dashCount > 0); - dashCount = (dashCount / 2) * 2; // Round down to even number + dashCount = dashCount & -2; // Round down to even number int idash = 0; // Index to current dash qreal pos = 0; // The position on the curve, 0 <= pos <= path.length @@ -1077,11 +1120,12 @@ void QDashStroker::processCurrentSubpath() qreal doffset = m_dashOffset * m_stroke_width; // make sure doffset is in range [0..sumLength) - doffset -= qFloor(doffset / sumLength) * sumLength; + doffset -= qFloor(doffset * invSumLength) * sumLength; while (doffset >= dashes[idash]) { doffset -= dashes[idash]; - idash = (idash + 1) % dashCount; + if (++idash >= dashCount) + idash = 0; } qreal estart = 0; // The elements starting position @@ -1119,12 +1163,41 @@ void QDashStroker::processCurrentSubpath() estop = estart + elen; bool done = pos >= estop; + + if (clipping) { + // Check if the entire line can be clipped away. + if (!lineIntersectsRect(prev, e, clip_tl, clip_br)) { + // Cut away full dash sequences. + elen -= qFloor(elen * invSumLength) * sumLength; + // Update dash offset. + while (!done) { + qreal dpos = pos + dashes[idash] - doffset - estart; + + Q_ASSERT(dpos >= 0); + + if (dpos > elen) { // dash extends this line + doffset = dashes[idash] - (dpos - elen); // subtract the part already used + pos = estop; // move pos to next path element + done = true; + } else { // Dash is on this line + pos = dpos + estart; + done = pos >= estop; + if (++idash >= dashCount) + idash = 0; + doffset = 0; // full segment so no offset on next. + } + } + hasMoveTo = false; + move_to_pos = e; + } + } + // Dash away... while (!done) { QPointF p2; - int idash_incr = 0; bool has_offset = doffset > 0; + bool evenDash = (idash & 1) == 0; qreal dpos = pos + dashes[idash] - doffset - estart; Q_ASSERT(dpos >= 0); @@ -1138,39 +1211,36 @@ void QDashStroker::processCurrentSubpath() p2 = cline.pointAt(dpos/elen); pos = dpos + estart; done = pos >= estop; - idash_incr = 1; + if (++idash >= dashCount) + idash = 0; doffset = 0; // full segment so no offset on next. } - if (idash % 2 == 0) { + if (evenDash) { line_to_pos.x = qt_real_to_fixed(p2.x()); line_to_pos.y = qt_real_to_fixed(p2.y()); - // If we have an offset, we're continuing a dash - // from a previous element and should only - // continue the current dash, without starting a - // new subpath. - if (!has_offset || !hasMoveTo) { - emitMoveTo(move_to_pos.x, move_to_pos.y); - hasMoveTo = true; - } - if (!clipping - // if move_to is inside... - || (move_to_pos.x > clip_tl.x && move_to_pos.x < clip_br.x - && move_to_pos.y > clip_tl.y && move_to_pos.y < clip_br.y) - // Or if line_to is inside... - || (line_to_pos.x > clip_tl.x && line_to_pos.x < clip_br.x - && line_to_pos.y > clip_tl.y && line_to_pos.y < clip_br.y)) + || lineRectIntersectsRect(move_to_pos, line_to_pos, clip_tl, clip_br)) { + // If we have an offset, we're continuing a dash + // from a previous element and should only + // continue the current dash, without starting a + // new subpath. + if (!has_offset || !hasMoveTo) { + emitMoveTo(move_to_pos.x, move_to_pos.y); + hasMoveTo = true; + } + emitLineTo(line_to_pos.x, line_to_pos.y); + } else { + hasMoveTo = false; } + move_to_pos = line_to_pos; } else { move_to_pos.x = qt_real_to_fixed(p2.x()); move_to_pos.y = qt_real_to_fixed(p2.y()); } - - idash = (idash + idash_incr) % dashCount; } // Shuffle to the next cycle... diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp index 5f0d920..d68a268 100644 --- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp +++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp @@ -1155,16 +1155,20 @@ void QGL2PaintEngineExPrivate::stroke(const QVectorPath &path, const QPen &pen) // prepareForDraw() down below. updateMatrix(); + QRectF clip = q->state()->matrix.inverted().mapRect(q->state()->clipEnabled + ? q->state()->rectangleClip + : QRectF(0, 0, width, height)); + if (penStyle == Qt::SolidLine) { - stroker.process(path, pen); + stroker.process(path, pen, clip); } else { // Some sort of dash - dasher.process(path, pen); + dasher.process(path, pen, clip); QVectorPath dashStroke(dasher.points(), dasher.elementCount(), dasher.elementTypes()); - stroker.process(dashStroke, pen); + stroker.process(dashStroke, pen, clip); } if (opaque) { diff --git a/src/opengl/gl2paintengineex/qtriangulatingstroker.cpp b/src/opengl/gl2paintengineex/qtriangulatingstroker.cpp index 5229d3f..d952988 100644 --- a/src/opengl/gl2paintengineex/qtriangulatingstroker.cpp +++ b/src/opengl/gl2paintengineex/qtriangulatingstroker.cpp @@ -73,7 +73,7 @@ void QTriangulatingStroker::endCapOrJoinClosed(const qreal *start, const qreal * } -void QTriangulatingStroker::process(const QVectorPath &path, const QPen &pen) +void QTriangulatingStroker::process(const QVectorPath &path, const QPen &pen, const QRectF &) { const qreal *pts = path.points(); const QPainterPath::ElementType *types = path.elements(); @@ -480,7 +480,7 @@ QDashedStrokeProcessor::QDashedStrokeProcessor() m_dash_stroker.setCubicToHook(qdashprocessor_cubicTo); } -void QDashedStrokeProcessor::process(const QVectorPath &path, const QPen &pen) +void QDashedStrokeProcessor::process(const QVectorPath &path, const QPen &pen, const QRectF &clip) { const qreal *pts = path.points(); @@ -497,6 +497,7 @@ void QDashedStrokeProcessor::process(const QVectorPath &path, const QPen &pen) m_dash_stroker.setDashPattern(pen.dashPattern()); m_dash_stroker.setStrokeWidth(pen.isCosmetic() ? width * m_inv_scale : width); m_dash_stroker.setMiterLimit(pen.miterLimit()); + m_dash_stroker.setClipRect(clip); qreal curvyness = sqrt(width) * m_inv_scale / 8; if (count < 2) diff --git a/src/opengl/gl2paintengineex/qtriangulatingstroker_p.h b/src/opengl/gl2paintengineex/qtriangulatingstroker_p.h index 06b8a44..956d7cc 100644 --- a/src/opengl/gl2paintengineex/qtriangulatingstroker_p.h +++ b/src/opengl/gl2paintengineex/qtriangulatingstroker_p.h @@ -54,7 +54,7 @@ QT_BEGIN_NAMESPACE class QTriangulatingStroker { public: - void process(const QVectorPath &path, const QPen &pen); + void process(const QVectorPath &path, const QPen &pen, const QRectF &clip); inline int vertexCount() const { return m_vertices.size(); } inline const float *vertices() const { return m_vertices.data(); } @@ -96,7 +96,7 @@ class QDashedStrokeProcessor public: QDashedStrokeProcessor(); - void process(const QVectorPath &path, const QPen &pen); + void process(const QVectorPath &path, const QPen &pen, const QRectF &clip); inline void addElement(QPainterPath::ElementType type, qreal x, qreal y) { m_points.add(x); -- cgit v0.12 From 9b016ce33e4d63725239945a2fcf19a8d6af14cf Mon Sep 17 00:00:00 2001 From: Tom Cooksey Date: Wed, 10 Mar 2010 15:55:23 +0100 Subject: Re-enable tst_QGL::glWidgetRenderPixmap on X11/EGL QGLWidget::renderPixmap now works under X11/EGL. Tested on both Fremantle and Harmattan. Reviewed-By: TrustMe --- tests/auto/qgl/tst_qgl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/auto/qgl/tst_qgl.cpp b/tests/auto/qgl/tst_qgl.cpp index 15c0b66..8ee494f 100644 --- a/tests/auto/qgl/tst_qgl.cpp +++ b/tests/auto/qgl/tst_qgl.cpp @@ -1402,8 +1402,8 @@ void tst_QGL::glWidgetRenderPixmap() QImage reference(fb.size(), QImage::Format_RGB32); reference.fill(0xffff0000); -#ifdef QGL_EGL - QSKIP("renderPixmap() not yet supported under EGL", SkipAll); +#if defined(QGL_EGL) && !defined(Q_WS_X11) + QSKIP("renderPixmap() not yet supported under EGL on your platform", SkipAll); #endif QFUZZY_COMPARE_IMAGES(fb, reference); -- cgit v0.12 From 1436c4f2e41100b45eed58edc5fc290fa94c976b Mon Sep 17 00:00:00 2001 From: Kim Motoyoshi Kalland Date: Wed, 10 Mar 2010 17:11:47 +0100 Subject: Fixed "inconsistent dll linkage" warning on Windows. qt_memrotate90() was declared twice, once with and once without Q_GUI_EXPORT. Reviewed-by: Trond --- src/gui/painting/qmemrotate_p.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/gui/painting/qmemrotate_p.h b/src/gui/painting/qmemrotate_p.h index 8df0520..2911860 100644 --- a/src/gui/painting/qmemrotate_p.h +++ b/src/gui/painting/qmemrotate_p.h @@ -82,8 +82,9 @@ QT_BEGIN_NAMESPACE void Q_GUI_QWS_EXPORT qt_memrotate270(const srctype*, int, int, int, desttype*, int) void Q_GUI_EXPORT qt_memrotate90(const quint32*, int, int, int, quint32*, int); +void Q_GUI_QWS_EXPORT qt_memrotate180(const quint32*, int, int, int, quint32*, int); +void Q_GUI_QWS_EXPORT qt_memrotate270(const quint32*, int, int, int, quint32*, int); -QT_DECL_MEMROTATE(quint32, quint32); QT_DECL_MEMROTATE(quint32, quint16); QT_DECL_MEMROTATE(quint16, quint32); QT_DECL_MEMROTATE(quint16, quint16); -- cgit v0.12 From 7baaea978200c82fdf65e3934cfa373edeca6524 Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Wed, 10 Mar 2010 16:53:06 +0100 Subject: Slow QTreeView::layout() with many (> 10000) children When updating the QTreeViewItem::total field in layout(), we used to call QTreeViewPrivate::viewIndex() to get the parent item, which is O(n). We have now introduced 'parentItem' in QTreeViewItem wich makes this O(1), with a small penality when inserting and removing elements in QTreeViewPrivate::viewItems. The QTreeViewPrivate::checkViewItems() is left inside the code for further debugging. Reviewed-by: Olivier Task-number: QTBUG-8885 --- src/gui/itemviews/qtreeview.cpp | 57 +++++++++++++++++++++++++++++++---------- src/gui/itemviews/qtreeview_p.h | 9 ++++++- 2 files changed, 51 insertions(+), 15 deletions(-) diff --git a/src/gui/itemviews/qtreeview.cpp b/src/gui/itemviews/qtreeview.cpp index 78184a9..2d9f9c6 100644 --- a/src/gui/itemviews/qtreeview.cpp +++ b/src/gui/itemviews/qtreeview.cpp @@ -2480,6 +2480,7 @@ void QTreeView::rowsInserted(const QModelIndex &parent, int start, int end) for (int i = 0; i < delta; ++i) { QTreeViewItem &item = insertedItems[i]; item.index = d->model->index(i + start, 0, parent); + item.parentItem = parentItem; item.level = childLevel; item.hasChildren = d->hasVisibleChildren(item.index); item.hasMoreSiblings = !((i == delta - 1) && (parentRowCount == end +1)); @@ -2518,7 +2519,7 @@ void QTreeView::rowsInserted(const QModelIndex &parent, int start, int end) } } - d->viewItems.insert(insertPos, delta, insertedItems.at(0)); + d->insertViewItems(insertPos, delta, insertedItems.at(0)); if (delta > 1) { qCopy(insertedItems.begin() + 1, insertedItems.end(), d->viewItems.begin() + insertPos + 1); @@ -2952,6 +2953,37 @@ void QTreeViewPrivate::expand(int item, bool emitSignal) } } +void QTreeViewPrivate::insertViewItems(int pos, int count, const QTreeViewItem &viewItem) +{ + viewItems.insert(pos, count, viewItem); + for (int i = pos + count; i < viewItems.count(); i++) + if (viewItems[i].parentItem >= pos) + viewItems[i].parentItem += count; +} + +void QTreeViewPrivate::removeViewItems(int pos, int count) +{ + viewItems.remove(pos, count); + for (int i = pos; i < viewItems.count(); i++) + if (viewItems[i].parentItem >= pos) + viewItems[i].parentItem -= count; +} + +#if 0 +bool QTreeViewPrivate::checkViewItems() const +{ + for (int i = 0; i < viewItems.count(); ++i) { + const QTreeViewItem &vi = viewItems.at(i); + if (vi.parentItem == -1) { + Q_ASSERT(!vi.index.parent().isValid() || vi.index.parent() == root); + } else { + Q_ASSERT(vi.index.parent() == viewItems.at(vi.parentItem).index); + } + } + return true; +} +#endif + void QTreeViewPrivate::collapse(int item, bool emitSignal) { Q_Q(QTreeView); @@ -2980,14 +3012,11 @@ void QTreeViewPrivate::collapse(int item, bool emitSignal) expandedIndexes.erase(it); viewItems[item].expanded = false; int index = item; - QModelIndex parent = modelIndex; - while (parent.isValid() && parent != root) { - Q_ASSERT(index > -1); + while (index > -1) { viewItems[index].total -= total; - parent = parent.parent(); - index = viewIndex(parent); + index = viewItems[index].parentItem; } - viewItems.remove(item + 1, total); // collapse + removeViewItems(item + 1, total); // collapse q->setState(oldState); if (emitSignal) { @@ -3152,7 +3181,7 @@ void QTreeViewPrivate::layout(int i) } viewItems.resize(count); } else if (viewItems[i].total != (uint)count) { - viewItems.insert(i + 1, count, QTreeViewItem()); // expand + insertViewItems(i + 1, count, QTreeViewItem()); // expand } else { expanding = false; } @@ -3174,6 +3203,7 @@ void QTreeViewPrivate::layout(int i) item->hasMoreSiblings = true; item = &viewItems[last]; item->index = current; + item->parentItem = i; item->level = level; item->height = 0; item->spanning = q->isFirstColumnSpanned(current.row(), parent); @@ -3195,16 +3225,14 @@ void QTreeViewPrivate::layout(int i) // remove hidden items if (hidden > 0) - viewItems.remove(last + 1, hidden); // collapse + removeViewItems(last + 1, hidden); // collapse if (!expanding) return; // nothing changed - while (parent != root) { - Q_ASSERT(i > -1); + while (i > -1) { viewItems[i].total += count - hidden; - parent = parent.parent(); - i = viewIndex(parent); + i = viewItems[i].parentItem; } } @@ -3757,7 +3785,7 @@ void QTreeViewPrivate::rowsRemoved(const QModelIndex &parent, item += count; } else if (modelIndex.row() <= end) { // removed - viewItems.remove(item, count); + removeViewItems(item, count); removedCount += count; lastChildItem -= count; } else { @@ -3765,6 +3793,7 @@ void QTreeViewPrivate::rowsRemoved(const QModelIndex &parent, // moved; update the model index viewItems[item].index = model->index( modelIndex.row() - delta, modelIndex.column(), parent); +// viewItems[item].parentItem = parentItem; } item += count; } diff --git a/src/gui/itemviews/qtreeview_p.h b/src/gui/itemviews/qtreeview_p.h index 589a224..7893e04 100644 --- a/src/gui/itemviews/qtreeview_p.h +++ b/src/gui/itemviews/qtreeview_p.h @@ -62,9 +62,10 @@ QT_BEGIN_NAMESPACE struct QTreeViewItem { - QTreeViewItem() : expanded(false), spanning(false), hasChildren(false), + QTreeViewItem() : parentItem(-1), expanded(false), spanning(false), hasChildren(false), hasMoreSiblings(false), total(0), level(0), height(0) {} QModelIndex index; // we remove items whenever the indexes are invalidated + int parentItem; // parent item index in viewItems uint expanded : 1; uint spanning : 1; uint hasChildren : 1; // if the item has visible children (even if collapsed) @@ -136,6 +137,12 @@ public: int viewIndex(const QModelIndex &index) const; QModelIndex modelIndex(int i, int column = 0) const; + void insertViewItems(int pos, int count, const QTreeViewItem &viewItem); + void removeViewItems(int pos, int count); +#if 0 + bool checkViewItems() const; +#endif + int firstVisibleItem(int *offset = 0) const; int columnAt(int x) const; bool hasVisibleChildren( const QModelIndex& parent) const; -- cgit v0.12 From fb27eba721b41cb1b8557ffff663f9747a3922db Mon Sep 17 00:00:00 2001 From: Kim Motoyoshi Kalland Date: Thu, 11 Mar 2010 10:18:59 +0100 Subject: Fixed rounded SVG rectangles when 'rx' or 'ry' is 0. Task-number: QTBUG-8264 Reviewed-by: Trond --- src/svg/qsvghandler.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/svg/qsvghandler.cpp b/src/svg/qsvghandler.cpp index 926b04d..bc4ca76 100644 --- a/src/svg/qsvghandler.cpp +++ b/src/svg/qsvghandler.cpp @@ -2962,9 +2962,9 @@ static QSvgNode *createRectNode(QSvgNode *parent, if (nry > bounds.height()/2) nry = bounds.height()/2; - if (nrx && !nry) + if (!rx.isEmpty() && ry.isEmpty()) nry = nrx; - else if (nry && !nrx) + else if (!ry.isEmpty() && rx.isEmpty()) nrx = nry; //we draw rounded rect from 0...99 -- cgit v0.12 From e788b32e7f059b0f85ca5104279c8f2bcbfff526 Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Thu, 11 Mar 2010 10:33:02 +0100 Subject: Cleaning commit 7baaea978200c82fdf65e3934cfa373edeca6524 Reviewed-by: Trust me --- src/gui/itemviews/qtreeview.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/gui/itemviews/qtreeview.cpp b/src/gui/itemviews/qtreeview.cpp index 2d9f9c6..b7a39b1 100644 --- a/src/gui/itemviews/qtreeview.cpp +++ b/src/gui/itemviews/qtreeview.cpp @@ -3793,7 +3793,6 @@ void QTreeViewPrivate::rowsRemoved(const QModelIndex &parent, // moved; update the model index viewItems[item].index = model->index( modelIndex.row() - delta, modelIndex.column(), parent); -// viewItems[item].parentItem = parentItem; } item += count; } -- cgit v0.12 From 8404d073d0a8f02d77888496986cba7c0b1b1739 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Thu, 11 Mar 2010 11:08:02 +0100 Subject: QTreeView: Optimize by avoiding calling detach QVector::operator[] calls detach. and we should avoid calling it in a loop. QVector::at() cannot be used here because we need a non const reference. Reviewed-by: Gabriel --- src/gui/itemviews/qtreeview.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/gui/itemviews/qtreeview.cpp b/src/gui/itemviews/qtreeview.cpp index b7a39b1..0a7ffb7 100644 --- a/src/gui/itemviews/qtreeview.cpp +++ b/src/gui/itemviews/qtreeview.cpp @@ -2956,17 +2956,19 @@ void QTreeViewPrivate::expand(int item, bool emitSignal) void QTreeViewPrivate::insertViewItems(int pos, int count, const QTreeViewItem &viewItem) { viewItems.insert(pos, count, viewItem); + QTreeViewItem *items = viewItems.data(); for (int i = pos + count; i < viewItems.count(); i++) - if (viewItems[i].parentItem >= pos) - viewItems[i].parentItem += count; + if (items[i].parentItem >= pos) + items[i].parentItem += count; } void QTreeViewPrivate::removeViewItems(int pos, int count) { viewItems.remove(pos, count); + QTreeViewItem *items = viewItems.data(); for (int i = pos; i < viewItems.count(); i++) - if (viewItems[i].parentItem >= pos) - viewItems[i].parentItem -= count; + if (items[i].parentItem >= pos) + items[i].parentItem -= count; } #if 0 -- cgit v0.12 From 6e25e8b7857de7f688c673ba700384f85b4113d4 Mon Sep 17 00:00:00 2001 From: Thierry Bastian Date: Thu, 11 Mar 2010 11:39:37 +0100 Subject: make it possible to use sse2 with mingw All the windows callback functions need an attribute to force the alignment of the arg pointer. Reviewed-by: Benjamin Poulain --- src/3rdparty/phonon/waveout/mediaobject.cpp | 2 +- src/3rdparty/phonon/waveout/mediaobject.h | 2 +- src/activeqt/control/qaxserverbase.cpp | 6 +++--- src/corelib/global/qglobal.h | 10 ++++++++++ src/corelib/io/qprocess_win.cpp | 2 +- src/corelib/kernel/qeventdispatcher_win.cpp | 8 ++++---- src/corelib/kernel/qeventdispatcher_win_p.h | 6 +++--- src/gui/dialogs/qfiledialog_win_p.h | 2 +- src/gui/kernel/qapplication_win.cpp | 5 ++--- src/gui/kernel/qdesktopwidget_win.cpp | 4 ++-- src/gui/kernel/qkeymapper_win.cpp | 2 +- src/gui/kernel/qwidget_win.cpp | 4 ++-- src/gui/kernel/qwidget_wince.cpp | 4 ++-- src/multimedia/audio/qaudioinput_win32_p.cpp | 2 +- src/multimedia/audio/qaudiooutput_win32_p.cpp | 2 +- src/multimedia/audio/qaudiooutput_win32_p.h | 2 +- src/qt3support/other/q3process_win.cpp | 2 +- 17 files changed, 37 insertions(+), 28 deletions(-) diff --git a/src/3rdparty/phonon/waveout/mediaobject.cpp b/src/3rdparty/phonon/waveout/mediaobject.cpp index 08af4ee..fdd81a7 100644 --- a/src/3rdparty/phonon/waveout/mediaobject.cpp +++ b/src/3rdparty/phonon/waveout/mediaobject.cpp @@ -70,7 +70,7 @@ namespace Phonon } - void CALLBACK MediaObject::WaveOutCallBack(HWAVEOUT m_hWaveOut, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2) + void QT_WIN_CALLBACK MediaObject::WaveOutCallBack(HWAVEOUT m_hWaveOut, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2) { Q_UNUSED(m_hWaveOut); Q_UNUSED(dwInstance); diff --git a/src/3rdparty/phonon/waveout/mediaobject.h b/src/3rdparty/phonon/waveout/mediaobject.h index dd6b24b..bb1410a 100644 --- a/src/3rdparty/phonon/waveout/mediaobject.h +++ b/src/3rdparty/phonon/waveout/mediaobject.h @@ -112,7 +112,7 @@ namespace Phonon void deleteValidWaveOutDevice(); void playBuffer(WAVEHDR *waveHeader); - static void CALLBACK WaveOutCallBack(HWAVEOUT hWaveOut, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2); + static void QT_WIN_CALLBACK WaveOutCallBack(HWAVEOUT hWaveOut, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2); struct { WAVEHDR *waveHeader; diff --git a/src/activeqt/control/qaxserverbase.cpp b/src/activeqt/control/qaxserverbase.cpp index ce71490..ca16b39 100644 --- a/src/activeqt/control/qaxserverbase.cpp +++ b/src/activeqt/control/qaxserverbase.cpp @@ -160,7 +160,7 @@ public: void createMenu(QMenuBar *menuBar); void removeMenu(); - static LRESULT CALLBACK ActiveXProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + static LRESULT QT_WIN_CALLBACK ActiveXProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); // Object registration with OLE void registerActiveObject(IUnknown *object); @@ -764,7 +764,7 @@ private: }; // callback for DLL server to hook into non-Qt eventloop -LRESULT CALLBACK axs_FilterProc(int nCode, WPARAM wParam, LPARAM lParam) +LRESULT QT_WIN_CALLBACK axs_FilterProc(int nCode, WPARAM wParam, LPARAM lParam) { if (qApp && !invokeCount) qApp->sendPostedEvents(); @@ -1350,7 +1350,7 @@ class HackWidget : public QWidget The semantics of \a wParam and \a lParam depend on the value of \a uMsg. */ -LRESULT CALLBACK QAxServerBase::ActiveXProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +LRESULT QT_WIN_CALLBACK QAxServerBase::ActiveXProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_CREATE) { CREATESTRUCT *cs = (CREATESTRUCT*)lParam; diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index 4d48b60..6437fb7 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -1064,6 +1064,16 @@ redefine to built-in booleans to make autotests work properly */ # define QT_FASTCALL #endif +//defines the type for the WNDPROC on windows +//the alignment needs to be forced for sse2 to not crash with mingw +#if defined(Q_WS_WIN) +# if defined(Q_CC_MINGW) +# define QT_WIN_CALLBACK CALLBACK __attribute__ ((force_align_arg_pointer)) +# else +# define QT_WIN_CALLBACK CALLBACK +# endif +#endif + typedef int QNoImplicitBoolCast; #if defined(QT_ARCH_ARM) || defined(QT_ARCH_ARMV6) || defined(QT_ARCH_AVR32) || (defined(QT_ARCH_MIPS) && (defined(Q_WS_QWS) || defined(Q_OS_WINCE))) || defined(QT_ARCH_SH) || defined(QT_ARCH_SH4A) diff --git a/src/corelib/io/qprocess_win.cpp b/src/corelib/io/qprocess_win.cpp index f3fc28e..cb25a58 100644 --- a/src/corelib/io/qprocess_win.cpp +++ b/src/corelib/io/qprocess_win.cpp @@ -525,7 +525,7 @@ qint64 QProcessPrivate::readFromStderr(char *data, qint64 maxlen) } -static BOOL CALLBACK qt_terminateApp(HWND hwnd, LPARAM procId) +static BOOL QT_WIN_CALLBACK qt_terminateApp(HWND hwnd, LPARAM procId) { DWORD currentProcId = 0; GetWindowThreadProcessId(hwnd, ¤tProcId); diff --git a/src/corelib/kernel/qeventdispatcher_win.cpp b/src/corelib/kernel/qeventdispatcher_win.cpp index 4755540..2633a7c 100644 --- a/src/corelib/kernel/qeventdispatcher_win.cpp +++ b/src/corelib/kernel/qeventdispatcher_win.cpp @@ -308,7 +308,7 @@ typedef MMRESULT(WINAPI *ptimeKillEvent)(UINT); static ptimeSetEvent qtimeSetEvent = 0; static ptimeKillEvent qtimeKillEvent = 0; -LRESULT CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPARAM lp); +LRESULT QT_WIN_CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPARAM lp); static void resolveTimerAPI() { @@ -420,7 +420,7 @@ Q_CORE_EXPORT bool winGetMessage(MSG* msg, HWND hWnd, UINT wMsgFilterMin, } // This function is called by a workerthread -void WINAPI CALLBACK qt_fast_timer_proc(uint timerId, uint /*reserved*/, DWORD_PTR user, DWORD_PTR /*reserved*/, DWORD_PTR /*reserved*/) +void WINAPI QT_WIN_CALLBACK qt_fast_timer_proc(uint timerId, uint /*reserved*/, DWORD_PTR user, DWORD_PTR /*reserved*/, DWORD_PTR /*reserved*/) { if (!timerId) // sanity check return; @@ -429,7 +429,7 @@ void WINAPI CALLBACK qt_fast_timer_proc(uint timerId, uint /*reserved*/, DWORD_P QCoreApplication::postEvent(t->dispatcher, new QTimerEvent(t->timerId)); } -LRESULT CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPARAM lp) +LRESULT QT_WIN_CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPARAM lp) { if (message == WM_NCCREATE) return true; @@ -506,7 +506,7 @@ LRESULT CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPARAM lp) return DefWindowProc(hwnd, message, wp, lp); } -LRESULT CALLBACK qt_GetMessageHook(int code, WPARAM wp, LPARAM lp) +LRESULT QT_WIN_CALLBACK qt_GetMessageHook(int code, WPARAM wp, LPARAM lp) { if (wp == PM_REMOVE) { QEventDispatcherWin32 *q = qobject_cast(QAbstractEventDispatcher::instance()); diff --git a/src/corelib/kernel/qeventdispatcher_win_p.h b/src/corelib/kernel/qeventdispatcher_win_p.h index ed94c49..788cc44 100644 --- a/src/corelib/kernel/qeventdispatcher_win_p.h +++ b/src/corelib/kernel/qeventdispatcher_win_p.h @@ -62,7 +62,7 @@ class QWinEventNotifier; class QEventDispatcherWin32Private; // forward declaration -LRESULT CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPARAM lp); +LRESULT QT_WIN_CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPARAM lp); class Q_CORE_EXPORT QEventDispatcherWin32 : public QAbstractEventDispatcher { @@ -101,8 +101,8 @@ public: bool event(QEvent *e); private: - friend LRESULT CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPARAM lp); - friend LRESULT CALLBACK qt_GetMessageHook(int, WPARAM, LPARAM); + friend LRESULT QT_WIN_CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPARAM lp); + friend LRESULT QT_WIN_CALLBACK qt_GetMessageHook(int, WPARAM, LPARAM); }; QT_END_NAMESPACE diff --git a/src/gui/dialogs/qfiledialog_win_p.h b/src/gui/dialogs/qfiledialog_win_p.h index 44b7e43..7079925 100644 --- a/src/gui/dialogs/qfiledialog_win_p.h +++ b/src/gui/dialogs/qfiledialog_win_p.h @@ -82,7 +82,7 @@ typedef int GETPROPERTYSTOREFLAGS; #define GPS_BESTEFFORT 0x00000040 #define GPS_MASK_VALID 0x0000007F -typedef int (CALLBACK* BFFCALLBACK)(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData); +typedef int (QT_WIN_CALLBACK* BFFCALLBACK)(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData); // message from browser #define BFFM_INITIALIZED 1 #define BFFM_SELCHANGED 2 diff --git a/src/gui/kernel/qapplication_win.cpp b/src/gui/kernel/qapplication_win.cpp index 9872514..ae9b34c 100644 --- a/src/gui/kernel/qapplication_win.cpp +++ b/src/gui/kernel/qapplication_win.cpp @@ -441,7 +441,7 @@ extern QCursor *qt_grab_cursor(); #define __export #endif -extern "C" LRESULT CALLBACK QtWndProc(HWND, UINT, WPARAM, LPARAM); +extern "C" LRESULT QT_WIN_CALLBACK QtWndProc(HWND, UINT, WPARAM, LPARAM); class QETWidget : public QWidget // event translator widget { @@ -1400,8 +1400,7 @@ static bool qt_is_translatable_mouse_event(UINT message) ; } -extern "C" -LRESULT CALLBACK QtWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +extern "C" LRESULT QT_WIN_CALLBACK QtWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { bool result = true; QEvent::Type evt_type = QEvent::None; diff --git a/src/gui/kernel/qdesktopwidget_win.cpp b/src/gui/kernel/qdesktopwidget_win.cpp index 1fea8d6..07dbc24 100644 --- a/src/gui/kernel/qdesktopwidget_win.cpp +++ b/src/gui/kernel/qdesktopwidget_win.cpp @@ -76,7 +76,7 @@ public: }; typedef BOOL (WINAPI *InfoFunc)(HMONITOR, MONITORINFO*); - typedef BOOL (CALLBACK *EnumProc)(HMONITOR, HDC, LPRECT, LPARAM); + typedef BOOL (QT_WIN_CALLBACK *EnumProc)(HMONITOR, HDC, LPRECT, LPARAM); typedef BOOL (WINAPI *EnumFunc)(HDC, LPCRECT, EnumProc, LPARAM); static EnumFunc enumDisplayMonitors; @@ -107,7 +107,7 @@ static inline void qt_get_sip_info(QRect &rect) #endif -BOOL CALLBACK enumCallback(HMONITOR hMonitor, HDC, LPRECT, LPARAM) +BOOL QT_WIN_CALLBACK enumCallback(HMONITOR hMonitor, HDC, LPRECT, LPARAM) { QDesktopWidgetPrivate::screenCount++; QDesktopWidgetPrivate::rects->resize(QDesktopWidgetPrivate::screenCount); diff --git a/src/gui/kernel/qkeymapper_win.cpp b/src/gui/kernel/qkeymapper_win.cpp index e555c5c..f84b902 100644 --- a/src/gui/kernel/qkeymapper_win.cpp +++ b/src/gui/kernel/qkeymapper_win.cpp @@ -56,7 +56,7 @@ QT_BEGIN_NAMESPACE //#define DEBUG_KEYMAPPER // Implemented elsewhere -extern "C" LRESULT CALLBACK QtWndProc(HWND, UINT, WPARAM, LPARAM); +extern "C" LRESULT QT_WIN_CALLBACK QtWndProc(HWND, UINT, WPARAM, LPARAM); extern Q_CORE_EXPORT QLocale qt_localeFromLCID(LCID id); #ifndef LANG_PASHTO diff --git a/src/gui/kernel/qwidget_win.cpp b/src/gui/kernel/qwidget_win.cpp index 2dcbfc3..7d647b7 100644 --- a/src/gui/kernel/qwidget_win.cpp +++ b/src/gui/kernel/qwidget_win.cpp @@ -243,7 +243,7 @@ static QCursor *mouseGrbCur = 0; static QWidget *keyboardGrb = 0; static HHOOK journalRec = 0; -extern "C" LRESULT CALLBACK QtWndProc(HWND, UINT, WPARAM, LPARAM); +extern "C" LRESULT QT_WIN_CALLBACK QtWndProc(HWND, UINT, WPARAM, LPARAM); #define XCOORD_MAX 16383 #define WRECT_MAX 16383 @@ -825,7 +825,7 @@ QCursor *qt_grab_cursor() // The procedure does nothing, but is required for mousegrabbing to work #ifndef Q_WS_WINCE -LRESULT CALLBACK qJournalRecordProc(int nCode, WPARAM wParam, LPARAM lParam) +LRESULT QT_WIN_CALLBACK qJournalRecordProc(int nCode, WPARAM wParam, LPARAM lParam) { return CallNextHookEx(journalRec, nCode, wParam, lParam); } diff --git a/src/gui/kernel/qwidget_wince.cpp b/src/gui/kernel/qwidget_wince.cpp index fa94703..509847b 100644 --- a/src/gui/kernel/qwidget_wince.cpp +++ b/src/gui/kernel/qwidget_wince.cpp @@ -46,7 +46,7 @@ QT_BEGIN_NAMESPACE const QString qt_reg_winclass(QWidget *w); // defined in qapplication_win.cpp -extern "C" LRESULT CALLBACK QtWndProc(HWND, UINT, WPARAM, LPARAM); +extern "C" LRESULT QT_WIN_CALLBACK QtWndProc(HWND, UINT, WPARAM, LPARAM); //#define TABLET_DEBUG #define PACKETDATA (PK_X | PK_Y | PK_BUTTONS | PK_NORMAL_PRESSURE | PK_TANGENT_PRESSURE \ @@ -586,7 +586,7 @@ void QWidgetPrivate::setWindowOpacity_sys(qreal level) { } // The procedure does nothing, but is required for mousegrabbing to work -LRESULT CALLBACK qJournalRecordProc(int nCode, WPARAM wParam, LPARAM lParam) { +LRESULT QT_WIN_CALLBACK qJournalRecordProc(int nCode, WPARAM wParam, LPARAM lParam) { Q_UNUSED(nCode); Q_UNUSED(wParam); Q_UNUSED(lParam); diff --git a/src/multimedia/audio/qaudioinput_win32_p.cpp b/src/multimedia/audio/qaudioinput_win32_p.cpp index 594f6ca..180cbda 100644 --- a/src/multimedia/audio/qaudioinput_win32_p.cpp +++ b/src/multimedia/audio/qaudioinput_win32_p.cpp @@ -88,7 +88,7 @@ QAudioInputPrivate::~QAudioInputPrivate() DeleteCriticalSection(&waveInCriticalSection); } -void CALLBACK QAudioInputPrivate::waveInProc( HWAVEIN hWaveIn, UINT uMsg, +void QT_WIN_CALLBACK QAudioInputPrivate::waveInProc( HWAVEIN hWaveIn, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2 ) { Q_UNUSED(dwParam1) diff --git a/src/multimedia/audio/qaudiooutput_win32_p.cpp b/src/multimedia/audio/qaudiooutput_win32_p.cpp index 6200160..c7f5752 100644 --- a/src/multimedia/audio/qaudiooutput_win32_p.cpp +++ b/src/multimedia/audio/qaudiooutput_win32_p.cpp @@ -88,7 +88,7 @@ QAudioOutputPrivate::~QAudioOutputPrivate() DeleteCriticalSection(&waveOutCriticalSection); } -void CALLBACK QAudioOutputPrivate::waveOutProc( HWAVEOUT hWaveOut, UINT uMsg, +void QT_WIN_CALLBACK QAudioOutputPrivate::waveOutProc( HWAVEOUT hWaveOut, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2 ) { Q_UNUSED(dwParam1) diff --git a/src/multimedia/audio/qaudiooutput_win32_p.h b/src/multimedia/audio/qaudiooutput_win32_p.h index 6e0899f..bb176a0 100644 --- a/src/multimedia/audio/qaudiooutput_win32_p.h +++ b/src/multimedia/audio/qaudiooutput_win32_p.h @@ -116,7 +116,7 @@ private: qint64 totalTimeValue; bool pullMode; int intervalTime; - static void CALLBACK waveOutProc( HWAVEOUT hWaveOut, UINT uMsg, + static void QT_WIN_CALLBACK waveOutProc( HWAVEOUT hWaveOut, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2 ); WAVEHDR* allocateBlocks(int size, int count); diff --git a/src/qt3support/other/q3process_win.cpp b/src/qt3support/other/q3process_win.cpp index da39bdc..9b69520 100644 --- a/src/qt3support/other/q3process_win.cpp +++ b/src/qt3support/other/q3process_win.cpp @@ -384,7 +384,7 @@ bool Q3Process::start( QStringList *env ) return true; } -static BOOL CALLBACK qt_terminateApp( HWND hwnd, LPARAM procId ) +static BOOL QT_WIN_CALLBACK qt_terminateApp( HWND hwnd, LPARAM procId ) { DWORD procId_win; GetWindowThreadProcessId( hwnd, &procId_win ); -- cgit v0.12 From f18e95849be93b86ff014147086fa538993abc21 Mon Sep 17 00:00:00 2001 From: Daisuke Kameda Date: Thu, 11 Mar 2010 13:39:15 +0100 Subject: Fixed problem displaying half width character as full width There is the problem that Qt displays half width character (e.g. alphabet) as full width. This is reported in #QTBUG-1726. This occurs in the following fonts. - Monospace font - Selif font - IPA font (Ver.0301) - NSimSun In Cario and fontconfig, the FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH is specified as flag of FT_Load_Glyph function to solve this problem. According to the document of freetype, this flag exists to support buggy CJK fonts. So this flag is specified as default flag of QFontEngineFT. Merge-request: 2319 Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/gui/text/qfontengine_ft.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp index 6b40aad..a9def8e 100644 --- a/src/gui/text/qfontengine_ft.cpp +++ b/src/gui/text/qfontengine_ft.cpp @@ -619,7 +619,7 @@ QFontEngineFT::QFontEngineFT(const QFontDef &fd) transform = false; antialias = true; freetype = 0; - default_load_flags = 0; + default_load_flags = FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH; default_hint_style = HintNone; subpixelType = Subpixel_None; lcdFilterType = 0; -- cgit v0.12 From 5f5c9ba6810071bc7bb369afd2aac99064177ce7 Mon Sep 17 00:00:00 2001 From: Paul Olav Tvete Date: Thu, 11 Mar 2010 12:23:32 +0100 Subject: Fix 1-bit to 8-bit conversion for bitmap fonts on QWS QImage doesn't know that we are abusing Format_Indexed8 as an alpha map. The proper solution is to add new image formats. This is just a quick fix. Task-number: QTBUG-5936 Reviewed-by: Jeremy --- src/gui/text/qfontengine_qpf.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/gui/text/qfontengine_qpf.cpp b/src/gui/text/qfontengine_qpf.cpp index 136737d..a0593cc 100644 --- a/src/gui/text/qfontengine_qpf.cpp +++ b/src/gui/text/qfontengine_qpf.cpp @@ -920,8 +920,18 @@ void QFontEngineQPF::loadGlyph(glyph_t glyph) if (!renderingFontEngine) return; - - QImage img = renderingFontEngine->alphaMapForGlyph(glyph).convertToFormat(QImage::Format_Indexed8); + QImage img = renderingFontEngine->alphaMapForGlyph(glyph); + if (img.format() != QImage::Format_Indexed8) { + bool mono = img.depth() == 1; + img = img.convertToFormat(QImage::Format_Indexed8); + if (mono) { + //### we know that 1 is opaque and 0 is transparent + uchar *byte = img.bits(); + int count = img.byteCount(); + while (count--) + *byte++ *= 0xff; + } + } glyph_metrics_t metrics = renderingFontEngine->boundingBox(glyph); renderingFontEngine->removeGlyphFromCache(glyph); -- cgit v0.12 From c5cb91a714f3fa38aeab41c6e793a5a3d071dcef Mon Sep 17 00:00:00 2001 From: Paul Olav Tvete Date: Thu, 11 Mar 2010 13:53:43 +0100 Subject: Add support for QFont::NoAntialias on QWS Task-number: QTBUG-5936 Reviewed-by: Eskil --- src/gui/text/qfontdatabase_qws.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/gui/text/qfontdatabase_qws.cpp b/src/gui/text/qfontdatabase_qws.cpp index 62d7793..a3d8d65 100644 --- a/src/gui/text/qfontdatabase_qws.cpp +++ b/src/gui/text/qfontdatabase_qws.cpp @@ -632,8 +632,9 @@ QFontEngine *loadSingleEngine(int script, const QFontPrivate *fp, #ifndef QT_NO_FREETYPE QScopedPointer fte(new QFontEngineFT(def)); - if (fte->init(faceId, style->antialiased, - style->antialiased ? QFontEngineFT::Format_A8 : QFontEngineFT::Format_Mono)) { + bool antialias = style->antialiased && !(request.styleStrategy & QFont::NoAntialias); + if (fte->init(faceId, antialias, + antialias ? QFontEngineFT::Format_A8 : QFontEngineFT::Format_Mono)) { #ifdef QT_NO_QWS_QPF2 return fte.take(); #else @@ -793,7 +794,7 @@ QFontDatabase::findFont(int script, const QFontPrivate *fp, " family: %s [%s], script: %d\n" " weight: %d, style: %d\n" " stretch: %d\n" - " pixelSize: %d\n" + " pixelSize: %g\n" " pitch: %c", family_name.isEmpty() ? "-- first in script --" : family_name.toLatin1().constData(), foundry_name.isEmpty() ? "-- any --" : foundry_name.toLatin1().constData(), -- cgit v0.12 From 82fa80a6b28ea5a4d3e245f531fea22a689c7ad3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trond=20Kjern=C3=A5sen?= Date: Thu, 11 Mar 2010 15:52:37 +0100 Subject: Made QGLTextureCache::instance() threadsafe. Reviewed-by: Tom Cooksey --- src/opengl/qgl.cpp | 27 +++++++-------------------- src/opengl/qgl_p.h | 1 - 2 files changed, 7 insertions(+), 21 deletions(-) diff --git a/src/opengl/qgl.cpp b/src/opengl/qgl.cpp index 7839191..c6ecef6 100644 --- a/src/opengl/qgl.cpp +++ b/src/opengl/qgl.cpp @@ -1688,14 +1688,12 @@ typedef void (*_qt_image_cleanup_hook_64)(qint64); extern Q_GUI_EXPORT _qt_pixmap_cleanup_hook_64 qt_pixmap_cleanup_hook_64; extern Q_GUI_EXPORT _qt_image_cleanup_hook_64 qt_image_cleanup_hook_64; -static QGLTextureCache *qt_gl_texture_cache = 0; + +Q_GLOBAL_STATIC(QGLTextureCache, qt_gl_texture_cache) QGLTextureCache::QGLTextureCache() : m_cache(64*1024) // cache ~64 MB worth of textures - this is not accurate though { - Q_ASSERT(qt_gl_texture_cache == 0); - qt_gl_texture_cache = this; - QImagePixmapCleanupHooks::instance()->addPixmapDataModificationHook(cleanupTexturesForPixampData); QImagePixmapCleanupHooks::instance()->addPixmapDataDestructionHook(cleanupBeforePixmapDestruction); QImagePixmapCleanupHooks::instance()->addImageHook(cleanupTexturesForCacheKey); @@ -1703,8 +1701,7 @@ QGLTextureCache::QGLTextureCache() QGLTextureCache::~QGLTextureCache() { - qt_gl_texture_cache = 0; - + Q_ASSERT(size() == 0); QImagePixmapCleanupHooks::instance()->removePixmapDataModificationHook(cleanupTexturesForPixampData); QImagePixmapCleanupHooks::instance()->removePixmapDataDestructionHook(cleanupBeforePixmapDestruction); QImagePixmapCleanupHooks::instance()->removeImageHook(cleanupTexturesForCacheKey); @@ -1754,22 +1751,14 @@ void QGLTextureCache::removeContextTextures(QGLContext* ctx) } } -QGLTextureCache* QGLTextureCache::instance() -{ - if (!qt_gl_texture_cache) - qt_gl_texture_cache = new QGLTextureCache; - - return qt_gl_texture_cache; -} - /* a hook that removes textures from the cache when a pixmap/image is deref'ed */ void QGLTextureCache::cleanupTexturesForCacheKey(qint64 cacheKey) { - instance()->remove(cacheKey); - Q_ASSERT(instance()->getTexture(cacheKey) == 0); + qt_gl_texture_cache()->remove(cacheKey); + Q_ASSERT(qt_gl_texture_cache()->getTexture(cacheKey) == 0); } @@ -1791,10 +1780,9 @@ void QGLTextureCache::cleanupBeforePixmapDestruction(QPixmapData* pmd) #endif } -void QGLTextureCache::deleteIfEmpty() +QGLTextureCache *QGLTextureCache::instance() { - if (instance()->size() == 0) - delete instance(); + return qt_gl_texture_cache(); } // DDS format structure @@ -1960,7 +1948,6 @@ QGLContext::~QGLContext() { // remove any textures cached in this context QGLTextureCache::instance()->removeContextTextures(this); - QGLTextureCache::deleteIfEmpty(); // ### thread safety d_ptr->group->cleanupResources(this); diff --git a/src/opengl/qgl_p.h b/src/opengl/qgl_p.h index ed34f79..5e524a7 100644 --- a/src/opengl/qgl_p.h +++ b/src/opengl/qgl_p.h @@ -532,7 +532,6 @@ public: bool remove(QGLContext *ctx, GLuint textureId); void removeContextTextures(QGLContext *ctx); static QGLTextureCache *instance(); - static void deleteIfEmpty(); static void cleanupTexturesForCacheKey(qint64 cacheKey); static void cleanupTexturesForPixampData(QPixmapData* pixmap); static void cleanupBeforePixmapDestruction(QPixmapData* pixmap); -- cgit v0.12 From fc0e0198c5e7ef75d1650bca39a5f06ebddfb932 Mon Sep 17 00:00:00 2001 From: Tom Cooksey Date: Thu, 11 Mar 2010 15:44:08 +0100 Subject: Delete the QGLContext in ~QX11GLPixmapData This also includes changes which allow QGLContext to not own it's own QEglContext. With X11GL, the QEglContext gets reused by multiple QGLContexts so it is important QGLContext doesn't delete it. Reviewed-By: TrustMe --- src/gui/egl/qegl.cpp | 2 +- src/opengl/qgl.cpp | 1 + src/opengl/qgl_egl.cpp | 5 +++-- src/opengl/qgl_p.h | 1 + src/opengl/qgl_qws.cpp | 1 + src/opengl/qgl_wince.cpp | 1 + src/opengl/qgl_x11egl.cpp | 1 + src/opengl/qpixmapdata_x11gl_egl.cpp | 3 +++ 8 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/gui/egl/qegl.cpp b/src/gui/egl/qegl.cpp index 6e0331f..b870523 100644 --- a/src/gui/egl/qegl.cpp +++ b/src/gui/egl/qegl.cpp @@ -60,7 +60,7 @@ static QEglContext * volatile currentVGContext = 0; QEglContext::QEglContext() : apiType(QEgl::OpenGL) , ctx(EGL_NO_CONTEXT) - , cfg(0) + , cfg(QEGL_NO_CONFIG) , currentSurface(EGL_NO_SURFACE) , current(false) , ownsContext(true) diff --git a/src/opengl/qgl.cpp b/src/opengl/qgl.cpp index c6ecef6..58ac642 100644 --- a/src/opengl/qgl.cpp +++ b/src/opengl/qgl.cpp @@ -1583,6 +1583,7 @@ void QGLContextPrivate::init(QPaintDevice *dev, const QGLFormat &format) vi = 0; #endif #if defined(QT_OPENGL_ES) + ownsEglContext = false; eglContext = 0; eglSurface = EGL_NO_SURFACE; #endif diff --git a/src/opengl/qgl_egl.cpp b/src/opengl/qgl_egl.cpp index c08d6fd..aa8d2bc 100644 --- a/src/opengl/qgl_egl.cpp +++ b/src/opengl/qgl_egl.cpp @@ -164,10 +164,11 @@ void QGLContext::reset() return; d->cleanup(); doneCurrent(); - if (d->eglContext) { + if (d->eglContext && d->ownsEglContext) { d->destroyEglSurfaceForDevice(); delete d->eglContext; } + d->ownsEglContext = false; d->eglContext = 0; d->eglSurface = EGL_NO_SURFACE; d->crWin = false; @@ -215,7 +216,7 @@ void QGLContextPrivate::destroyEglSurfaceForDevice() #ifdef Q_WS_X11 // Make sure we don't call eglDestroySurface on a surface which // was created for a different winId: - if (paintDevice->devType() == QInternal::Widget) { + if (paintDevice && paintDevice->devType() == QInternal::Widget) { QGLWidget* w = static_cast(paintDevice); if (w->d_func()->eglSurfaceWindowId == w->winId()) diff --git a/src/opengl/qgl_p.h b/src/opengl/qgl_p.h index 5e524a7..f66031a 100644 --- a/src/opengl/qgl_p.h +++ b/src/opengl/qgl_p.h @@ -347,6 +347,7 @@ public: HDC hbitmap_hdc; #endif #if defined(QT_OPENGL_ES) + bool ownsEglContext; QEglContext *eglContext; EGLSurface eglSurface; void destroyEglSurfaceForDevice(); diff --git a/src/opengl/qgl_qws.cpp b/src/opengl/qgl_qws.cpp index 96b2454..38c3774 100644 --- a/src/opengl/qgl_qws.cpp +++ b/src/opengl/qgl_qws.cpp @@ -182,6 +182,7 @@ bool QGLContext::chooseContext(const QGLContext* shareContext) // Get the display and initialize it. d->eglContext = new QEglContext(); + d->ownsEglContext = true; d->eglContext->setApi(QEgl::OpenGL); // Construct the configuration we need for this surface. diff --git a/src/opengl/qgl_wince.cpp b/src/opengl/qgl_wince.cpp index fefcca2..47a19b5 100644 --- a/src/opengl/qgl_wince.cpp +++ b/src/opengl/qgl_wince.cpp @@ -145,6 +145,7 @@ bool QGLContext::chooseContext(const QGLContext* shareContext) // Get the display and initialize it. d->eglContext = new QEglContext(); + d->ownsEglContext = true; d->eglContext->setApi(QEgl::OpenGL); // Construct the configuration we need for this surface. diff --git a/src/opengl/qgl_x11egl.cpp b/src/opengl/qgl_x11egl.cpp index fe87c65..0954e69 100644 --- a/src/opengl/qgl_x11egl.cpp +++ b/src/opengl/qgl_x11egl.cpp @@ -182,6 +182,7 @@ bool QGLContext::chooseContext(const QGLContext* shareContext) // Only create the eglContext if we don't already have one: if (d->eglContext == 0) { d->eglContext = new QEglContext(); + d->ownsEglContext = true; d->eglContext->setApi(QEgl::OpenGL); // If the device is a widget with WA_TranslucentBackground set, make sure the glFormat diff --git a/src/opengl/qpixmapdata_x11gl_egl.cpp b/src/opengl/qpixmapdata_x11gl_egl.cpp index d7fae16..a01eec4 100644 --- a/src/opengl/qpixmapdata_x11gl_egl.cpp +++ b/src/opengl/qpixmapdata_x11gl_egl.cpp @@ -181,6 +181,8 @@ QX11GLPixmapData::QX11GLPixmapData() QX11GLPixmapData::~QX11GLPixmapData() { + if (ctx) + delete ctx; } #if !defined(QT_OPENGL_ES_1) @@ -245,6 +247,7 @@ void QX11GLPixmapData::beginPaint() if ((EGLSurface)gl_surface == EGL_NO_SURFACE) { QPixmap tmpPixmap(this); EGLConfig cfg = ctx->d_func()->eglContext->config(); + Q_ASSERT(cfg != QEGL_NO_CONFIG); EGLSurface surface = QEgl::createSurface(&tmpPixmap, cfg); if (surface == EGL_NO_SURFACE) { -- cgit v0.12 From 5ccbd1a3fc856d6ccdcbf71657a8cd89f9af9173 Mon Sep 17 00:00:00 2001 From: Tom Cooksey Date: Thu, 11 Mar 2010 16:43:03 +0100 Subject: Remove debug output from qt_eglproperties_set_glformat Reviewed-By: TrustMe --- src/opengl/qgl_egl.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/opengl/qgl_egl.cpp b/src/opengl/qgl_egl.cpp index aa8d2bc..822c9f6 100644 --- a/src/opengl/qgl_egl.cpp +++ b/src/opengl/qgl_egl.cpp @@ -63,10 +63,8 @@ void qt_eglproperties_set_glformat(QEglProperties& eglProperties, const QGLForma // QGLFormat uses a magic value of -1 to indicate "don't care", even when a buffer of that // type has been requested. So we must check QGLFormat's booleans too if size is -1: - if (glFormat.alpha() && alphaSize <= 0) { - qDebug("QGLFormat::alpha() returned true"); + if (glFormat.alpha() && alphaSize <= 0) alphaSize = 1; - } if (glFormat.depth() && depthSize <= 0) depthSize = 1; if (glFormat.stencil() && stencilSize <= 0) -- cgit v0.12 From dfa979eea762ec94fb3f7b8eb6562756272b6c18 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Thu, 11 Mar 2010 14:12:08 +0100 Subject: QTreeView: speedup more QTreeViewPrivate::layout(-1) Specially when called from expandAll Reviewed-by: Gabriel --- src/gui/itemviews/qtreeview.cpp | 38 +++++++++++++++++++++++--------------- src/gui/itemviews/qtreeview_p.h | 5 ++++- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/gui/itemviews/qtreeview.cpp b/src/gui/itemviews/qtreeview.cpp index 0a7ffb7..18ee5d3 100644 --- a/src/gui/itemviews/qtreeview.cpp +++ b/src/gui/itemviews/qtreeview.cpp @@ -2662,17 +2662,8 @@ void QTreeView::expandAll() { Q_D(QTreeView); d->viewItems.clear(); - d->expandedIndexes.clear(); d->interruptDelayedItemsLayout(); - d->layout(-1); - for (int i = 0; i < d->viewItems.count(); ++i) { - if (d->viewItems[i].expanded) - continue; - d->viewItems[i].expanded = true; - d->layout(i); - QModelIndex idx = d->viewItems.at(i).index; - d->expandedIndexes.insert(idx); - } + d->layout(-1, true); updateGeometries(); d->viewport->update(); } @@ -3155,7 +3146,14 @@ void QTreeViewPrivate::_q_columnsRemoved(const QModelIndex &parent, int start, i QAbstractItemViewPrivate::_q_columnsRemoved(parent, start, end); } -void QTreeViewPrivate::layout(int i) +/** \internal + creates and initialize the viewItem structure of the children of the element \i + + set \a recursiveExpanding if the function has to expand all the children (called from expandAll) + \a afterIsUninitialized is when we recurse from layout(-1), it means all the items after 'i' are + not yet initialized and need not to be moved + */ +void QTreeViewPrivate::layout(int i, bool recursiveExpanding, bool afterIsUninitialized) { Q_Q(QTreeView); QModelIndex current; @@ -3182,8 +3180,12 @@ void QTreeViewPrivate::layout(int i) defaultItemHeight = q->indexRowSizeHint(index); } viewItems.resize(count); + afterIsUninitialized = true; } else if (viewItems[i].total != (uint)count) { + if (!afterIsUninitialized) insertViewItems(i + 1, count, QTreeViewItem()); // expand + else if (count > 0) + viewItems.resize(viewItems.count() + count); } else { expanding = false; } @@ -3212,9 +3214,11 @@ void QTreeViewPrivate::layout(int i) item->expanded = false; item->total = 0; item->hasMoreSiblings = false; - if (isIndexExpanded(current)) { + if (recursiveExpanding || isIndexExpanded(current)) { + if (recursiveExpanding) + expandedIndexes.insert(current); item->expanded = true; - layout(last); + layout(last, recursiveExpanding, afterIsUninitialized); item = &viewItems[last]; children += item->total; item->hasChildren = item->total > 0; @@ -3226,8 +3230,12 @@ void QTreeViewPrivate::layout(int i) } // remove hidden items - if (hidden > 0) - removeViewItems(last + 1, hidden); // collapse + if (hidden > 0) { + if (!afterIsUninitialized) + removeViewItems(last + 1, hidden); + else + viewItems.resize(viewItems.size() - hidden); + } if (!expanding) return; // nothing changed diff --git a/src/gui/itemviews/qtreeview_p.h b/src/gui/itemviews/qtreeview_p.h index 7893e04..48997b7 100644 --- a/src/gui/itemviews/qtreeview_p.h +++ b/src/gui/itemviews/qtreeview_p.h @@ -55,6 +55,7 @@ #include "private/qabstractitemview_p.h" #include +#include #ifndef QT_NO_TREEVIEW @@ -75,6 +76,8 @@ struct QTreeViewItem int height : 16; // row height }; +Q_DECLARE_TYPEINFO(QTreeViewItem, Q_MOVABLE_TYPE); + class QTreeViewPrivate : public QAbstractItemViewPrivate { Q_DECLARE_PUBLIC(QTreeView) @@ -124,7 +127,7 @@ public: void _q_sortIndicatorChanged(int column, Qt::SortOrder order); void _q_modelDestroyed(); - void layout(int item); + void layout(int item, bool recusiveExpanding = false, bool afterIsUninitialized = false); int pageUp(int item) const; int pageDown(int item) const; -- cgit v0.12 From 4ae11be00b7aa2257d15140373f24ab1c28c0af7 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Thu, 11 Mar 2010 14:46:56 +0100 Subject: Optimize QSortFilterProxyModel - use QHash instead of QMap - use QVector::reserve when the size is known Reviewed-by: Gabriel --- src/gui/itemviews/qsortfilterproxymodel.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/gui/itemviews/qsortfilterproxymodel.cpp b/src/gui/itemviews/qsortfilterproxymodel.cpp index c63a07b..5c7d24b7 100644 --- a/src/gui/itemviews/qsortfilterproxymodel.cpp +++ b/src/gui/itemviews/qsortfilterproxymodel.cpp @@ -122,10 +122,10 @@ public: QVector proxy_rows; QVector proxy_columns; QVector mapped_children; - QMap::const_iterator map_iter; + QHash::const_iterator map_iter; }; - mutable QMap source_index_mapping; + mutable QHash source_index_mapping; int source_sort_column; int proxy_sort_column; @@ -142,7 +142,7 @@ public: QModelIndexPairList saved_persistent_indexes; - QMap::const_iterator create_mapping( + QHash::const_iterator create_mapping( const QModelIndex &source_parent) const; QModelIndex proxy_to_source(const QModelIndex &proxyIndex) const; QModelIndex source_to_proxy(const QModelIndex &sourceIndex) const; @@ -150,14 +150,14 @@ public: void remove_from_mapping(const QModelIndex &source_parent); - inline QMap::const_iterator index_to_iterator( + inline QHash::const_iterator index_to_iterator( const QModelIndex &proxy_index) const { Q_ASSERT(proxy_index.isValid()); Q_ASSERT(proxy_index.model() == q_func()); const void *p = proxy_index.internalPointer(); Q_ASSERT(p); - QMap::const_iterator it = + QHash::const_iterator it = static_cast(p)->map_iter; Q_ASSERT(it != source_index_mapping.constEnd()); Q_ASSERT(it.value()); @@ -165,7 +165,7 @@ public: } inline QModelIndex create_index(int row, int column, - QMap::const_iterator it) const + QHash::const_iterator it) const { return q_func()->createIndex(row, column, *it); } @@ -246,7 +246,7 @@ public: virtual void _q_sourceModelDestroyed(); }; -typedef QMap IndexMap; +typedef QHash IndexMap; void QSortFilterProxyModelPrivate::_q_sourceModelDestroyed() { @@ -292,11 +292,13 @@ IndexMap::const_iterator QSortFilterProxyModelPrivate::create_mapping( Mapping *m = new Mapping; int source_rows = model->rowCount(source_parent); + m->source_rows.reserve(source_rows); for (int i = 0; i < source_rows; ++i) { if (q->filterAcceptsRow(i, source_parent)) m->source_rows.append(i); } int source_cols = model->columnCount(source_parent); + m->source_columns.reserve(source_cols); for (int i = 0; i < source_cols; ++i) { if (q->filterAcceptsColumn(i, source_parent)) m->source_columns.append(i); -- cgit v0.12 From f98d645e7b260fa5098360a5cc4fbb381a30004a Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Thu, 11 Mar 2010 13:50:23 +0100 Subject: QTreeView: Optimise QTreeViewPrivate::viewIndex ... by first looking around the last find item. This was already done, but only for the 4 closest item. Now start searching from the last index and continue. Reviewed-by: Gabriel Task-number: QTBUG-8886 --- src/gui/itemviews/qtreeview.cpp | 62 ++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 35 deletions(-) diff --git a/src/gui/itemviews/qtreeview.cpp b/src/gui/itemviews/qtreeview.cpp index 18ee5d3..4135ba0 100644 --- a/src/gui/itemviews/qtreeview.cpp +++ b/src/gui/itemviews/qtreeview.cpp @@ -2407,9 +2407,9 @@ void QTreeView::reexpand() /*! \internal + This function assume that left is a (grand-)child of the parent of left. */ -static bool treeViewItemLessThan(const QTreeViewItem &left, - const QTreeViewItem &right) +static bool treeViewItemLessThanInInsert(const QTreeViewItem &left, const QTreeViewItem &right) { if (left.level != right.level) { Q_ASSERT(left.level > right.level); @@ -2496,7 +2496,7 @@ void QTreeView::rowsInserted(const QModelIndex &parent, int start, int end) QVector::iterator it; it = qLowerBound(d->viewItems.begin() + firstChildItem, d->viewItems.begin() + lastChildItem + 1, - insertedItems.at(0), treeViewItemLessThan); + insertedItems.at(0), treeViewItemLessThanInInsert); insertPos = it - d->viewItems.begin(); // update stale model indexes of siblings @@ -3397,46 +3397,39 @@ int QTreeViewPrivate::viewIndex(const QModelIndex &_index) const const int totalCount = viewItems.count(); const QModelIndex index = _index.sibling(_index.row(), 0); + const int row = index.row(); + const quint64 internalId = index.internalId(); - - // A quick check near the last item to see if we are just incrementing - const int start = lastViewedItem > 2 ? lastViewedItem - 2 : 0; - const int end = lastViewedItem < totalCount - 2 ? lastViewedItem + 2 : totalCount; - int row = index.row(); - for (int i = start; i < end; ++i) { - const QModelIndex &idx = viewItems.at(i).index; - if (idx.row() == row) { - if (idx.internalId() == index.internalId()) { - lastViewedItem = i; - return i; - } + // We start nearest to the lastViewedItem + int localCount = qMin(lastViewedItem - 1, totalCount - lastViewedItem); + for (int i = 0; i < localCount; ++i) { + const QModelIndex &idx1 = viewItems.at(lastViewedItem + i).index; + if (idx1.row() == row && idx1.internalId() == internalId) { + lastViewedItem = lastViewedItem + i; + return lastViewedItem; + } + const QModelIndex &idx2 = viewItems.at(lastViewedItem - i - 1).index; + if (idx2.row() == row && idx2.internalId() == internalId) { + lastViewedItem = lastViewedItem - i - 1; + return lastViewedItem; } } - // NOTE: this function is slow if the item is outside the visible area - // search in visible items first and below - int t = firstVisibleItem(); - t = t > 100 ? t - 100 : 0; // start 100 items above the visible area - - for (int i = t; i < totalCount; ++i) { - const QModelIndex &idx = viewItems.at(i).index; - if (idx.row() == row) { - if (idx.internalId() == index.internalId()) { - lastViewedItem = i; - return i; - } + for (int j = qMax(0, lastViewedItem + localCount); j < totalCount; ++j) { + const QModelIndex &idx = viewItems.at(j).index; + if (idx.row() == row && idx.internalId() == internalId) { + lastViewedItem = j; + return j; } } - // search from top to first visible - for (int j = 0; j < t; ++j) { + for (int j = qMin(totalCount, lastViewedItem - localCount) - 1; j >= 0; --j) { const QModelIndex &idx = viewItems.at(j).index; - if (idx.row() == row) { - if (idx.internalId() == index.internalId()) { - lastViewedItem = j; - return j; - } + if (idx.row() == row && idx.internalId() == internalId) { + lastViewedItem = j; + return j; } } + // nothing found return -1; } @@ -3761,7 +3754,6 @@ bool QTreeViewPrivate::hasVisibleChildren(const QModelIndex& parent) const void QTreeViewPrivate::rowsRemoved(const QModelIndex &parent, int start, int end, bool after) { - Q_Q(QTreeView); // if we are going to do a complete relayout anyway, there is no need to update if (delayedPendingLayout) { _q_rowsRemoved(parent, start, end); -- cgit v0.12 From a3e2e9efd4ed4baed3b5ca71cf518b3d3fda4716 Mon Sep 17 00:00:00 2001 From: Dmytro Poplavskiy Date: Fri, 12 Mar 2010 15:03:58 +1000 Subject: QPainterVideoSurface: assume yuv 420p and YV12 lines are 4 byte aligned. Reviewed-by: Andrew den Exter --- src/multimedia/base/qpaintervideosurface.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/multimedia/base/qpaintervideosurface.cpp b/src/multimedia/base/qpaintervideosurface.cpp index fc3d493..ed93fad 100644 --- a/src/multimedia/base/qpaintervideosurface.cpp +++ b/src/multimedia/base/qpaintervideosurface.cpp @@ -434,6 +434,9 @@ void QVideoSurfaceGLPainter::initRgbTextureInfo( void QVideoSurfaceGLPainter::initYuv420PTextureInfo(const QSize &size) { + int w = (size.width() + 3) & ~3; + int w2 = (size.width()/2 + 3) & ~3; + m_yuv = true; m_textureInternalFormat = GL_LUMINANCE; m_textureFormat = GL_LUMINANCE; @@ -444,14 +447,17 @@ void QVideoSurfaceGLPainter::initYuv420PTextureInfo(const QSize &size) m_textureOffsets[0] = 0; m_textureWidths[1] = size.width() / 2; m_textureHeights[1] = size.height() / 2; - m_textureOffsets[1] = size.width() * size.height(); + m_textureOffsets[1] = w * size.height(); m_textureWidths[2] = size.width() / 2; m_textureHeights[2] = size.height() / 2; - m_textureOffsets[2] = size.width() * size.height() * 5 / 4; + m_textureOffsets[2] = w * size.height() + w2 * (size.height() / 2); } void QVideoSurfaceGLPainter::initYv12TextureInfo(const QSize &size) { + int w = (size.width() + 3) & ~3; + int w2 = (size.width()/2 + 3) & ~3; + m_yuv = true; m_textureInternalFormat = GL_LUMINANCE; m_textureFormat = GL_LUMINANCE; @@ -462,10 +468,10 @@ void QVideoSurfaceGLPainter::initYv12TextureInfo(const QSize &size) m_textureOffsets[0] = 0; m_textureWidths[1] = size.width() / 2; m_textureHeights[1] = size.height() / 2; - m_textureOffsets[1] = size.width() * size.height() * 5 / 4; + m_textureOffsets[1] = w * size.height() + w2 * (size.height() / 2); m_textureWidths[2] = size.width() / 2; m_textureHeights[2] = size.height() / 2; - m_textureOffsets[2] = size.width() * size.height(); + m_textureOffsets[2] = w * size.height(); } #ifndef QT_OPENGL_ES -- cgit v0.12 From 6e8c0095d0410a30ffa06bb0b0cb71f979becfb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trond=20Kjern=C3=A5sen?= Date: Fri, 12 Mar 2010 12:49:38 +0100 Subject: Made QGLExtensions::glExtensions() thread-safe. Reviewed-by: Gunnar --- src/opengl/qgl.cpp | 37 ++++++++++++++++++------------------- src/opengl/qgl_p.h | 2 -- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/src/opengl/qgl.cpp b/src/opengl/qgl.cpp index 58ac642..e0030ad 100644 --- a/src/opengl/qgl.cpp +++ b/src/opengl/qgl.cpp @@ -5060,6 +5060,20 @@ QGLExtensions::Extensions QGLExtensions::currentContextExtensions() return glExtensions; } + +class QGLDefaultExtensions +{ +public: + QGLDefaultExtensions() { + QGLTemporaryContext tempContext; + extensions = QGLExtensions::currentContextExtensions(); + } + + QGLExtensions::Extensions extensions; +}; + +Q_GLOBAL_STATIC(QGLDefaultExtensions, qtDefaultExtensions) + /* Returns the GL extensions for the current QGLContext. If there is no current QGLContext, a default context will be created and the extensions @@ -5067,34 +5081,19 @@ QGLExtensions::Extensions QGLExtensions::currentContextExtensions() */ QGLExtensions::Extensions QGLExtensions::glExtensions() { - QGLTemporaryContext *tmpContext = 0; - static bool cachedDefault = false; - static Extensions defaultExtensions = 0; + Extensions extensionFlags = 0; QGLContext *currentCtx = const_cast(QGLContext::currentContext()); if (currentCtx && currentCtx->d_func()->extension_flags_cached) return currentCtx->d_func()->extension_flags; if (!currentCtx) { - if (cachedDefault) { - return defaultExtensions; - } else { - tmpContext = new QGLTemporaryContext; - cachedDefault = true; - } - } - - Extensions extensionFlags = currentContextExtensions(); - if (currentCtx) { + extensionFlags = qtDefaultExtensions()->extensions; + } else { + extensionFlags = currentContextExtensions(); currentCtx->d_func()->extension_flags_cached = true; currentCtx->d_func()->extension_flags = extensionFlags; - } else { - defaultExtensions = extensionFlags; } - - if (tmpContext) - delete tmpContext; - return extensionFlags; } diff --git a/src/opengl/qgl_p.h b/src/opengl/qgl_p.h index f66031a..45f8f30 100644 --- a/src/opengl/qgl_p.h +++ b/src/opengl/qgl_p.h @@ -278,8 +278,6 @@ public: Q_DECLARE_FLAGS(Extensions, Extension) static Extensions glExtensions(); - -private: static Extensions currentContextExtensions(); }; -- cgit v0.12 From 4f1b0d758e42872d2852e0eedd2417a858d603e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trond=20Kjern=C3=A5sen?= Date: Fri, 12 Mar 2010 12:52:37 +0100 Subject: Removed a Valgrind warning. Reviewed-by: Gunnar --- src/gui/painting/qcups.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/gui/painting/qcups.cpp b/src/gui/painting/qcups.cpp index ac41692..1ea1670 100644 --- a/src/gui/painting/qcups.cpp +++ b/src/gui/painting/qcups.cpp @@ -343,7 +343,8 @@ bool QCUPSSupport::printerHasPPD(const char *printerName) if (!isAvailable()) return false; const char *ppdFile = _cupsGetPPD(printerName); - unlink(ppdFile); + if (ppdFile) + unlink(ppdFile); return (ppdFile != 0); } -- cgit v0.12 From df77be2a58a36c756592465616beaaeed06d134b Mon Sep 17 00:00:00 2001 From: Rhys Weatherley Date: Mon, 15 Mar 2010 08:11:13 +1000 Subject: Fix compilation of OpenVG paint engine with OpenVG 1.0 Task-number: QTBUG-9006 --- src/openvg/qpaintengine_vg.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/openvg/qpaintengine_vg.cpp b/src/openvg/qpaintengine_vg.cpp index 2c850c9..4902cbd 100644 --- a/src/openvg/qpaintengine_vg.cpp +++ b/src/openvg/qpaintengine_vg.cpp @@ -3307,6 +3307,7 @@ void QVGPaintEngine::drawStaticTextItem(QStaticTextItem *textItem) bool QVGPaintEngine::drawCachedGlyphs(int numGlyphs, const glyph_t *glyphs, const QFont &font, QFontEngine *fontEngine, const QPointF &p) { +#if !defined(QVG_NO_DRAW_GLYPHS) Q_D(QVGPaintEngine); // Find the glyph cache for this font. @@ -3361,6 +3362,14 @@ void QVGPaintEngine::drawStaticTextItem(QStaticTextItem *textItem) NULL, NULL, VG_FILL_PATH, VG_TRUE); return true; +#else + Q_UNUSED(numGlyphs); + Q_UNUSED(glyphs); + Q_UNUSED(font); + Q_UNUSED(fontEngine); + Q_UNUSED(p); + return false; +#endif } void QVGPaintEngine::setState(QPainterState *s) -- cgit v0.12 From 2181d48844e923058b136c810a8b9457651e5bbc Mon Sep 17 00:00:00 2001 From: Justin McPherson Date: Mon, 15 Mar 2010 10:20:55 +1000 Subject: Install plugins to correct path. Task-number: QTBUG-9001 Reviewed-by: Kurt Korbatits --- src/plugins/mediaservices/directshow/directshow.pro | 2 +- src/plugins/mediaservices/gstreamer/gstreamer.pro | 2 +- src/plugins/mediaservices/qt7/qt7.pro | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/mediaservices/directshow/directshow.pro b/src/plugins/mediaservices/directshow/directshow.pro index a3080d3..ea133f9 100644 --- a/src/plugins/mediaservices/directshow/directshow.pro +++ b/src/plugins/mediaservices/directshow/directshow.pro @@ -9,6 +9,6 @@ SOURCES += dsserviceplugin.cpp include(mediaplayer/mediaplayer.pri) QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/mediaservices -target.path = $$[QT_INSTALL_PLUGINS]/plugins/mediaservices +target.path = $$[QT_INSTALL_PLUGINS]/mediaservices INSTALLS += target diff --git a/src/plugins/mediaservices/gstreamer/gstreamer.pro b/src/plugins/mediaservices/gstreamer/gstreamer.pro index 22e3c16..d1bfe44 100644 --- a/src/plugins/mediaservices/gstreamer/gstreamer.pro +++ b/src/plugins/mediaservices/gstreamer/gstreamer.pro @@ -46,5 +46,5 @@ SOURCES += \ include(mediaplayer/mediaplayer.pri) QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/mediaservices -target.path = $$[QT_INSTALL_PLUGINS]/plugins/mediaservices +target.path = $$[QT_INSTALL_PLUGINS]/mediaservices INSTALLS += target diff --git a/src/plugins/mediaservices/qt7/qt7.pro b/src/plugins/mediaservices/qt7/qt7.pro index 13d14d7..6624d13 100644 --- a/src/plugins/mediaservices/qt7/qt7.pro +++ b/src/plugins/mediaservices/qt7/qt7.pro @@ -40,6 +40,6 @@ OBJECTIVE_SOURCES += \ include(mediaplayer/mediaplayer.pri) QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/mediaservices -target.path = $$[QT_INSTALL_PLUGINS]/plugins/mediaservices +target.path = $$[QT_INSTALL_PLUGINS]/mediaservices INSTALLS += target -- cgit v0.12 From cffc92bac940fd7fcae0a9ff82a54a124d70ebed Mon Sep 17 00:00:00 2001 From: Dmytro Poplavskiy Date: Mon, 15 Mar 2010 14:01:51 +1000 Subject: Gstreamer player: allow video output changes during video playback. Reviewed-by: Andrew den Exter --- .../mediaplayer/qgstreamerplayersession.cpp | 191 +++++++++++++++++++-- .../mediaplayer/qgstreamerplayersession.h | 13 +- 2 files changed, 186 insertions(+), 18 deletions(-) diff --git a/src/plugins/mediaservices/gstreamer/mediaplayer/qgstreamerplayersession.cpp b/src/plugins/mediaservices/gstreamer/mediaplayer/qgstreamerplayersession.cpp index 392a7a8..56cdb04 100644 --- a/src/plugins/mediaservices/gstreamer/mediaplayer/qgstreamerplayersession.cpp +++ b/src/plugins/mediaservices/gstreamer/mediaplayer/qgstreamerplayersession.cpp @@ -51,6 +51,9 @@ //#define USE_PLAYBIN2 +//#define DEBUG_VO_BIN_DUMP +//#define DEBUG_PLAYBIN_STATES + QT_BEGIN_NAMESPACE @@ -59,7 +62,9 @@ QGstreamerPlayerSession::QGstreamerPlayerSession(QObject *parent) m_state(QMediaPlayer::StoppedState), m_busHelper(0), m_playbin(0), - m_nullVideoOutput(0), + m_videoSink(0), + m_pendingVideoSink(0), + m_nullVideoSink(0), m_bus(0), m_renderer(0), m_volume(100), @@ -83,6 +88,25 @@ QGstreamerPlayerSession::QGstreamerPlayerSession(QObject *parent) m_playbin = gst_element_factory_make("playbin", NULL); #endif + m_videoOutputBin = gst_bin_new("video-output-bin"); + gst_object_ref(GST_OBJECT(m_videoOutputBin)); + + m_videoIdentity = gst_element_factory_make("identity", "identity-vo"); + m_colorSpace = gst_element_factory_make("ffmpegcolorspace", "ffmpegcolorspace-vo"); + m_videoScale = gst_element_factory_make("videoscale","videoscale-vo"); + m_nullVideoSink = gst_element_factory_make("fakesink", NULL); + gst_object_ref(GST_OBJECT(m_nullVideoSink)); + gst_bin_add_many(GST_BIN(m_videoOutputBin), m_videoIdentity, m_colorSpace, m_videoScale, m_nullVideoSink, NULL); + gst_element_link_many(m_videoIdentity, m_colorSpace, m_videoScale, m_nullVideoSink, NULL); + + m_videoSink = m_nullVideoSink; + + // add ghostpads + GstPad *pad = gst_element_get_static_pad(m_videoIdentity,"sink"); + gst_element_add_pad(GST_ELEMENT(m_videoOutputBin), gst_ghost_pad_new("videosink", pad)); + gst_object_unref(GST_OBJECT(pad)); + + if (m_playbin != 0) { // Sort out messages m_bus = gst_element_get_bus(m_playbin); @@ -90,9 +114,7 @@ QGstreamerPlayerSession::QGstreamerPlayerSession(QObject *parent) connect(m_busHelper, SIGNAL(message(QGstreamerMessage)), SLOT(busMessage(QGstreamerMessage))); m_busHelper->installSyncEventFilter(this); - m_nullVideoOutput = gst_element_factory_make("fakesink", NULL); - gst_object_ref(GST_OBJECT(m_nullVideoOutput)); - g_object_set(G_OBJECT(m_playbin), "video-sink", m_nullVideoOutput, NULL); + g_object_set(G_OBJECT(m_playbin), "video-sink", m_videoOutputBin, NULL); // Initial volume double volume = 1.0; @@ -109,7 +131,8 @@ QGstreamerPlayerSession::~QGstreamerPlayerSession() delete m_busHelper; gst_object_unref(GST_OBJECT(m_bus)); gst_object_unref(GST_OBJECT(m_playbin)); - gst_object_unref(GST_OBJECT(m_nullVideoOutput)); + gst_object_unref(GST_OBJECT(m_nullVideoSink)); + gst_object_unref(GST_OBJECT(m_videoOutputBin)); } } @@ -242,13 +265,141 @@ bool QGstreamerPlayerSession::isAudioAvailable() const return m_audioAvailable; } +static void block_pad_cb(GstPad *pad, gboolean blocked, gpointer user_data) +{ + Q_UNUSED(pad); + //qDebug() << "block_pad_cb" << blocked; + + if (blocked && user_data) { + QGstreamerPlayerSession *session = reinterpret_cast(user_data); + QMetaObject::invokeMethod(session, "finishVideoOutputChange", Qt::QueuedConnection); + } +} + +#ifdef DEBUG_VO_BIN_DUMP + static int dumpNum = 0; +#endif + void QGstreamerPlayerSession::setVideoRenderer(QObject *videoOutput) { - m_renderer = qobject_cast(videoOutput); - if (m_renderer) - g_object_set(G_OBJECT(m_playbin), "video-sink", m_renderer->videoSink(), NULL); - else - g_object_set(G_OBJECT(m_playbin), "video-sink", m_nullVideoOutput, NULL); + QGstreamerVideoRendererInterface* renderer = qobject_cast(videoOutput); + + if (m_renderer == renderer) + return; + +#ifdef DEBUG_VO_BIN_DUMP + dumpNum++; + + _gst_debug_bin_to_dot_file(GST_BIN(m_videoOutputBin), + GstDebugGraphDetails(GST_DEBUG_GRAPH_SHOW_ALL /* GST_DEBUG_GRAPH_SHOW_MEDIA_TYPE | GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS | GST_DEBUG_GRAPH_SHOW_STATES*/), + QString("video_output_change_%1_set").arg(dumpNum).toAscii().constData()); +#endif + + m_renderer = renderer; + + GstElement *videoSink = m_renderer ? m_renderer->videoSink() : m_nullVideoSink; + + if (m_state == QMediaPlayer::StoppedState) { + m_pendingVideoSink = 0; + gst_element_unlink(m_videoScale, m_videoSink); + + gst_bin_remove(GST_BIN(m_videoOutputBin), m_videoSink); + + m_videoSink = videoSink; + + gst_bin_add(GST_BIN(m_videoOutputBin), m_videoSink); + gst_element_link(m_videoScale, m_videoSink); + + } else { + if (m_pendingVideoSink) { + m_pendingVideoSink = videoSink; + return; + } + + m_pendingVideoSink = videoSink; + + //block pads, async to avoid locking in paused state + GstPad *srcPad = gst_element_get_static_pad(m_videoIdentity, "src"); + gst_pad_set_blocked_async(srcPad, true, &block_pad_cb, this); + gst_object_unref(GST_OBJECT(srcPad)); + } +} + +void QGstreamerPlayerSession::finishVideoOutputChange() +{ + if (!m_pendingVideoSink) + return; + + GstPad *srcPad = gst_element_get_static_pad(m_videoIdentity, "src"); + + if (!gst_pad_is_blocked(srcPad)) { + //pad is not blocked, it's possible to swap outputs only in the null state + GstState identityElementState = GST_STATE_NULL; + gst_element_get_state(m_videoIdentity, &identityElementState, NULL, GST_CLOCK_TIME_NONE); + if (identityElementState != GST_STATE_NULL) { + gst_object_unref(GST_OBJECT(srcPad)); + return; //can't change vo yet, received async call from the previous change + } + + } + + if (m_pendingVideoSink == m_videoSink) { + //video output was change back to the current one, + //no need to torment the pipeline, just unblock the pad + if (gst_pad_is_blocked(srcPad)) + gst_pad_set_blocked_async(srcPad, false, &block_pad_cb, 0); + + m_pendingVideoSink = 0; + gst_object_unref(GST_OBJECT(srcPad)); + return; + } + + gst_element_set_state(m_colorSpace, GST_STATE_NULL); + gst_element_set_state(m_videoScale, GST_STATE_NULL); + gst_element_set_state(m_videoSink, GST_STATE_NULL); + + gst_element_unlink(m_videoScale, m_videoSink); + + gst_bin_remove(GST_BIN(m_videoOutputBin), m_videoSink); + + m_videoSink = m_pendingVideoSink; + m_pendingVideoSink = 0; + + gst_bin_add(GST_BIN(m_videoOutputBin), m_videoSink); + if (!gst_element_link(m_videoScale, m_videoSink)) + qWarning() << "Linking video output element failed"; + + GstState state; + + switch (m_state) { + case QMediaPlayer::StoppedState: + state = GST_STATE_NULL; + break; + case QMediaPlayer::PausedState: + state = GST_STATE_PAUSED; + break; + case QMediaPlayer::PlayingState: + state = GST_STATE_PLAYING; + break; + } + + gst_element_set_state(m_colorSpace, state); + gst_element_set_state(m_videoScale, state); + gst_element_set_state(m_videoSink, state); + + //don't have to wait here, it will unblock eventually + if (gst_pad_is_blocked(srcPad)) + gst_pad_set_blocked_async(srcPad, false, &block_pad_cb, 0); + gst_object_unref(GST_OBJECT(srcPad)); + +#ifdef DEBUG_VO_BIN_DUMP + dumpNum++; + + _gst_debug_bin_to_dot_file(GST_BIN(m_videoOutputBin), + GstDebugGraphDetails(/*GST_DEBUG_GRAPH_SHOW_ALL */ GST_DEBUG_GRAPH_SHOW_MEDIA_TYPE | GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS | GST_DEBUG_GRAPH_SHOW_STATES), + QString("video_output_change_%1_finish").arg(dumpNum).toAscii().constData()); +#endif + } bool QGstreamerPlayerSession::isVideoAvailable() const @@ -298,16 +449,22 @@ void QGstreamerPlayerSession::stop() if (m_playbin) { gst_element_set_state(m_playbin, GST_STATE_NULL); + QMediaPlayer::State oldState = QMediaPlayer::StoppedState; + m_state = QMediaPlayer::StoppedState; + + finishVideoOutputChange(); + //we have to do it here, since gstreamer will not emit bus messages any more - if (m_state != QMediaPlayer::StoppedState) - emit stateChanged(m_state = QMediaPlayer::StoppedState); + if (oldState != m_state) + emit stateChanged(m_state); } } bool QGstreamerPlayerSession::seek(qint64 ms) { - if (m_playbin && m_state != QMediaPlayer::StoppedState) { - gint64 position = (gint64)ms * 1000000; + //seek locks when the video output sink is changing and pad is blocked + if (m_playbin && !m_pendingVideoSink && m_state != QMediaPlayer::StoppedState) { + gint64 position = qMax(ms,qint64(0)) * 1000000; return gst_element_seek_simple(m_playbin, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, position); } @@ -466,13 +623,15 @@ void QGstreamerPlayerSession::busMessage(const QGstreamerMessage &message) gst_message_parse_state_changed(gm, &oldState, &newState, &pending); - /*QStringList states; +#ifdef DEBUG_PLAYBIN_STATES + QStringList states; states << "GST_STATE_VOID_PENDING" << "GST_STATE_NULL" << "GST_STATE_READY" << "GST_STATE_PAUSED" << "GST_STATE_PLAYING"; qDebug() << QString("state changed: old: %1 new: %2 pending: %3") \ .arg(states[oldState]) \ .arg(states[newState]) \ - .arg(states[pending]);*/ + .arg(states[pending]); +#endif switch (newState) { case GST_STATE_VOID_PENDING: diff --git a/src/plugins/mediaservices/gstreamer/mediaplayer/qgstreamerplayersession.h b/src/plugins/mediaservices/gstreamer/mediaplayer/qgstreamerplayersession.h index edfec5b..867a0e0 100644 --- a/src/plugins/mediaservices/gstreamer/mediaplayer/qgstreamerplayersession.h +++ b/src/plugins/mediaservices/gstreamer/mediaplayer/qgstreamerplayersession.h @@ -99,7 +99,7 @@ public: // int activeStream(QMediaStreamsControl::StreamType streamType) const; // void setActiveStream(QMediaStreamsControl::StreamType streamType, int streamNumber); - bool processSyncMessage(const QGstreamerMessage &message); + bool processSyncMessage(const QGstreamerMessage &message); public slots: void load(const QUrl &url); @@ -133,13 +133,22 @@ private slots: void busMessage(const QGstreamerMessage &message); void getStreamsInfo(); void setSeekable(bool); + void finishVideoOutputChange(); private: QUrl m_url; QMediaPlayer::State m_state; QGstreamerBusHelper* m_busHelper; GstElement* m_playbin; - GstElement* m_nullVideoOutput; + + GstElement* m_videoOutputBin; + GstElement* m_videoIdentity; + GstElement* m_colorSpace; + GstElement* m_videoScale; + GstElement* m_videoSink; + GstElement* m_pendingVideoSink; + GstElement* m_nullVideoSink; + GstBus* m_bus; QGstreamerVideoRendererInterface *m_renderer; -- cgit v0.12