From bff683416c73329eb91bdb0bc282f4022c9fec7e Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Fri, 8 Jul 2016 14:41:49 +0200 Subject: QDateTimeEditPrivate:: only ask for fieldInfo() if section index is real On construction, currentSectionIndex has the fake value FirstSectionIndex, which upsets fieldInfo(), leading to a qWarning(). Make interpret(), when deciding whether to delegate to base or handle the value itself, treat fake index value as an invalid state. Task-number: QTBUG-54654 Change-Id: I6d0f71874839abfafcbfaaa0018362288f32a3cd Reviewed-by: Andy Shaw --- src/widgets/widgets/qdatetimeedit.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/widgets/widgets/qdatetimeedit.cpp b/src/widgets/widgets/qdatetimeedit.cpp index 96a37197e9..98b0489dfc 100644 --- a/src/widgets/widgets/qdatetimeedit.cpp +++ b/src/widgets/widgets/qdatetimeedit.cpp @@ -2344,7 +2344,9 @@ void QDateTimeEditPrivate::interpret(EmitPolicy ep) const QValidator::State state = q->validate(tmp, pos); if (state != QValidator::Acceptable && correctionMode == QAbstractSpinBox::CorrectToPreviousValue - && (state == QValidator::Invalid || !(fieldInfo(currentSectionIndex) & AllowPartial))) { + && (state == QValidator::Invalid + || currentSectionIndex < 0 + || !(fieldInfo(currentSectionIndex) & AllowPartial))) { setValue(value, ep); updateTimeSpec(); } else { -- cgit v1.2.3 From 8356caea45cfd24bb11ab673f16f6761768e6811 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Mon, 10 Oct 2016 14:20:43 +0200 Subject: Fix QPixelFormat::typeInterpretation() for Format_RGB888 RGB888 is byte oriented like the RGBA8888 formats. Task-number: QTBUG-56250 Change-Id: Idbd496e4913e5d168decdd41557e28a71574a85b Reviewed-by: Laszlo Agocs --- src/gui/image/qimage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp index 17d3c02e36..856ba64204 100644 --- a/src/gui/image/qimage.cpp +++ b/src/gui/image/qimage.cpp @@ -5008,7 +5008,7 @@ static Q_CONSTEXPR QPixelFormat pixelformats[] = { /*ALPHA USAGE*/ QPixelFormat::IgnoresAlpha, /*ALPHA POSITION*/ QPixelFormat::AtBeginning, /*PREMULTIPLIED*/ QPixelFormat::NotPremultiplied, - /*INTERPRETATION*/ QPixelFormat::UnsignedInteger, + /*INTERPRETATION*/ QPixelFormat::UnsignedByte, /*BYTE ORDER*/ QPixelFormat::CurrentSystemEndian), //QImage::Format_RGB444: QPixelFormat(QPixelFormat::RGB, -- cgit v1.2.3 From 940ea856f0b5796b43d1053bc7549d50f9afd31c Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Thu, 6 Oct 2016 18:58:23 +0200 Subject: QtSql: compile with GCC 7 GCC 7 warns about implicit fall-throughs now. Fix by adding the missing comments. Change-Id: I7383f47e690b6334ef69c9df745c2205247ca7d0 Reviewed-by: Thiago Macieira Reviewed-by: Mark Brand --- src/sql/kernel/qsqldriver.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/sql/kernel/qsqldriver.cpp b/src/sql/kernel/qsqldriver.cpp index adaeb8c846..7ff89cd5dc 100644 --- a/src/sql/kernel/qsqldriver.cpp +++ b/src/sql/kernel/qsqldriver.cpp @@ -654,6 +654,7 @@ QString QSqlDriver::formatValue(const QSqlField &field, bool trimStrings) const break; } } + // fall through default: r = field.value().toString(); break; -- cgit v1.2.3 From 4e13abb9ebea4fda4af47124983b8600b5bf6a76 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Wed, 5 Oct 2016 15:45:24 +0200 Subject: Doc: Mention context menu related API in QWidget overview Change-Id: I357e3468694cc7e2af2f5e8d6dd28c16d2772192 Reviewed-by: Leena Miettinen --- src/widgets/kernel/qwidget.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src') diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index b2973349e5..a2920a6a8b 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -809,6 +809,10 @@ void QWidget::setAutoFillBackground(bool enabled) parentWidget(), window(), setParent(), winId(), find(), metric(). + \row \li Context menu \li + contextMenuPolicy, contextMenuEvent(), + customContextMenuRequested(), actions() + \row \li Interactive help \li setToolTip(), setWhatsThis() -- cgit v1.2.3 From 9ad4157530e86a1bac7ab8ca50ba3ee9f839f536 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Mon, 10 Oct 2016 11:30:51 +0200 Subject: Fix gradient race condition / read-after-free A gradient table may be deallocated while in use because we don't keep track of references. To fix it we now reference count the cache entries. Task-number: QTBUG-14614 Change-Id: I772ebf565ccf41d476811ca9a51b721f10de8aeb Reviewed-by: Marc Mutz --- src/gui/painting/qdrawhelper_p.h | 2 ++ src/gui/painting/qpaintengine_raster.cpp | 51 ++++++++++++++++---------------- 2 files changed, 27 insertions(+), 26 deletions(-) (limited to 'src') diff --git a/src/gui/painting/qdrawhelper_p.h b/src/gui/painting/qdrawhelper_p.h index d636eabe3f..1c6cd5db8a 100644 --- a/src/gui/painting/qdrawhelper_p.h +++ b/src/gui/painting/qdrawhelper_p.h @@ -329,6 +329,8 @@ struct QSpanData QGradientData gradient; QTextureData texture; }; + QExplicitlySharedDataPointer cachedGradient; + void init(QRasterBuffer *rb, const QRasterPaintEngine *pe); void setup(const QBrush &brush, int alpha, QPainter::CompositionMode compositionMode); diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp index 278d7bb99e..f87b052df2 100644 --- a/src/gui/painting/qpaintengine_raster.cpp +++ b/src/gui/painting/qpaintengine_raster.cpp @@ -4137,7 +4137,8 @@ void QRasterBuffer::flushToARGBImage(QImage *target) const class QGradientCache { - struct CacheInfo +public: + struct CacheInfo : public QSharedData { inline CacheInfo(QGradientStops s, int op, QGradient::InterpolationMode mode) : stops(qMove(s)), opacity(op), interpolationMode(mode) {} @@ -4148,12 +4149,9 @@ class QGradientCache QGradient::InterpolationMode interpolationMode; }; - typedef QMultiHash QGradientColorTableHash; - -public: - typedef QPair ColorBufferPair; + typedef QMultiHash > QGradientColorTableHash; - inline ColorBufferPair getBuffer(const QGradient &gradient, int opacity) { + inline QExplicitlySharedDataPointer getBuffer(const QGradient &gradient, int opacity) { quint64 hash_val = 0; const QGradientStops stops = gradient.stops(); @@ -4167,10 +4165,9 @@ public: return addCacheElement(hash_val, gradient, opacity); else { do { - const CacheInfo &cache_info = it.value(); - if (cache_info.stops == stops && cache_info.opacity == opacity && cache_info.interpolationMode == gradient.interpolationMode()) - return qMakePair(reinterpret_cast(cache_info.buffer32), - reinterpret_cast(cache_info.buffer64)); + const QExplicitlySharedDataPointer &cache_info = it.value(); + if (cache_info->stops == stops && cache_info->opacity == opacity && cache_info->interpolationMode == gradient.interpolationMode()) + return cache_info; ++it; } while (it != cache.constEnd() && it.key() == hash_val); // an exact match for these stops and opacity was not found, create new cache @@ -4184,18 +4181,16 @@ protected: inline void generateGradientColorTable(const QGradient& g, QRgba64 *colorTable, int size, int opacity) const; - ColorBufferPair addCacheElement(quint64 hash_val, const QGradient &gradient, int opacity) { + QExplicitlySharedDataPointer addCacheElement(quint64 hash_val, const QGradient &gradient, int opacity) { if (cache.size() == maxCacheSize()) { // may remove more than 1, but OK cache.erase(cache.begin() + (qrand() % maxCacheSize())); } - CacheInfo cache_entry(gradient.stops(), opacity, gradient.interpolationMode()); - generateGradientColorTable(gradient, cache_entry.buffer64, paletteSize(), opacity); + QExplicitlySharedDataPointer cache_entry(new CacheInfo (gradient.stops(), opacity, gradient.interpolationMode())); + generateGradientColorTable(gradient, cache_entry->buffer64, paletteSize(), opacity); for (int i = 0; i < GRADIENT_STOPTABLE_SIZE; ++i) - cache_entry.buffer32[i] = cache_entry.buffer64[i].toArgb32(); - CacheInfo &cache_value = cache.insert(hash_val, cache_entry).value(); - return qMakePair(reinterpret_cast(cache_value.buffer32), - reinterpret_cast(cache_value.buffer64)); + cache_entry->buffer32[i] = cache_entry->buffer64[i].toArgb32(); + return cache.insert(hash_val, cache_entry).value(); } QGradientColorTableHash cache; @@ -4414,6 +4409,7 @@ Q_GUI_EXPORT extern QImage qt_imageForBrush(int brushStyle, bool invert); void QSpanData::setup(const QBrush &brush, int alpha, QPainter::CompositionMode compositionMode) { Qt::BrushStyle brushStyle = qbrush_style(brush); + cachedGradient.reset(); switch (brushStyle) { case Qt::SolidPattern: { type = Solid; @@ -4430,9 +4426,10 @@ void QSpanData::setup(const QBrush &brush, int alpha, QPainter::CompositionMode const QLinearGradient *g = static_cast(brush.gradient()); gradient.alphaColor = !brush.isOpaque() || alpha != 256; - QGradientCache::ColorBufferPair colorBuffers = qt_gradient_cache()->getBuffer(*g, alpha); - gradient.colorTable64 = colorBuffers.second; - gradient.colorTable32 = colorBuffers.first; + QExplicitlySharedDataPointer cacheInfo = qt_gradient_cache()->getBuffer(*g, alpha); + cachedGradient = cacheInfo; + gradient.colorTable32 = cacheInfo->buffer32; + gradient.colorTable64 = cacheInfo->buffer64; gradient.spread = g->spread(); @@ -4451,9 +4448,10 @@ void QSpanData::setup(const QBrush &brush, int alpha, QPainter::CompositionMode const QRadialGradient *g = static_cast(brush.gradient()); gradient.alphaColor = !brush.isOpaque() || alpha != 256; - QGradientCache::ColorBufferPair colorBuffers = qt_gradient_cache()->getBuffer(*g, alpha); - gradient.colorTable64 = colorBuffers.second; - gradient.colorTable32 = colorBuffers.first; + QExplicitlySharedDataPointer cacheInfo = qt_gradient_cache()->getBuffer(*g, alpha); + cachedGradient = cacheInfo; + gradient.colorTable32 = cacheInfo->buffer32; + gradient.colorTable64 = cacheInfo->buffer64; gradient.spread = g->spread(); @@ -4476,9 +4474,10 @@ void QSpanData::setup(const QBrush &brush, int alpha, QPainter::CompositionMode const QConicalGradient *g = static_cast(brush.gradient()); gradient.alphaColor = !brush.isOpaque() || alpha != 256; - QGradientCache::ColorBufferPair colorBuffers = qt_gradient_cache()->getBuffer(*g, alpha); - gradient.colorTable64 = colorBuffers.second; - gradient.colorTable32 = colorBuffers.first; + QExplicitlySharedDataPointer cacheInfo = qt_gradient_cache()->getBuffer(*g, alpha); + cachedGradient = cacheInfo; + gradient.colorTable32 = cacheInfo->buffer32; + gradient.colorTable64 = cacheInfo->buffer64; gradient.spread = QGradient::RepeatSpread; -- cgit v1.2.3 From dafa7cc7b5bc35f06f63a78b8f29a7d71fc93f5d Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Mon, 10 Oct 2016 20:34:54 +0200 Subject: QFileDialog: add missing break statements in switch in labelText() It is of course wrong to potentially return the text of the Cancel button if the text of the Accept role button was asked for. Found independently by GCC 7 and Coverity. Coverity-Id: 11150 Change-Id: Ie30f7875daee16a78eeff4b314ce17cbd7cd3aa8 Reviewed-by: Edward Welbourne --- src/widgets/dialogs/qfiledialog.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src') diff --git a/src/widgets/dialogs/qfiledialog.cpp b/src/widgets/dialogs/qfiledialog.cpp index 3aa9052917..61f5f7b0d2 100644 --- a/src/widgets/dialogs/qfiledialog.cpp +++ b/src/widgets/dialogs/qfiledialog.cpp @@ -2042,10 +2042,12 @@ QString QFileDialog::labelText(DialogLabel label) const button = d->qFileDialogUi->buttonBox->button(QDialogButtonBox::Save); if (button) return button->text(); + break; case Reject: button = d->qFileDialogUi->buttonBox->button(QDialogButtonBox::Cancel); if (button) return button->text(); + break; } return QString(); } -- cgit v1.2.3 From eec2d5e68af7b65342e4e5a95e47481a483be67e Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Sat, 8 Oct 2016 00:48:02 +0200 Subject: QCalendarWidget: fix a missing break statement GCC 7 warns about implicit fall-throughs, and here it looks like a break was indeed missing. It surely isn't catastrophic that the other update code is executed, too, but it's also useless. Turns out Coverity knew it all along... Coverity-Id: 11162 Change-Id: I88fc0174a66ec337b2d93c006e70be8d5f3bbc33 Reviewed-by: Edward Welbourne --- src/widgets/widgets/qcalendarwidget.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/widgets/widgets/qcalendarwidget.cpp b/src/widgets/widgets/qcalendarwidget.cpp index 89cde851e5..3823b9c10f 100644 --- a/src/widgets/widgets/qcalendarwidget.cpp +++ b/src/widgets/widgets/qcalendarwidget.cpp @@ -2994,6 +2994,7 @@ bool QCalendarWidget::event(QEvent *event) switch (event->type()) { case QEvent::LayoutDirectionChange: d->updateButtonIcons(); + break; case QEvent::LocaleChange: d->m_model->setFirstColumnDay(locale().firstDayOfWeek()); d->cachedSizeHint = QSize(); -- cgit v1.2.3 From 2ecd95bbe907cc9199773bb7930f781058735e1c Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Mon, 10 Oct 2016 20:47:40 +0200 Subject: QCalendarWidget: fix misleading if-else cascade in QCalendarDayValidator::text() By the time we hit the last else, its if condition is trivially true, so don't check it (but leave it as a comment). Consequently, remove the trailing (dead) return of a default- constructed QString. Coverity-Id: 62766 Change-Id: I47e1a49f40e6ec95d29c5052c78bfadb63af3b84 Reviewed-by: Edward Welbourne --- src/widgets/widgets/qcalendarwidget.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src') diff --git a/src/widgets/widgets/qcalendarwidget.cpp b/src/widgets/widgets/qcalendarwidget.cpp index 3823b9c10f..7895dc04d9 100644 --- a/src/widgets/widgets/qcalendarwidget.cpp +++ b/src/widgets/widgets/qcalendarwidget.cpp @@ -205,10 +205,9 @@ QString QCalendarDayValidator::text(const QDate &date, int repeat) const return formatNumber(date.day(), 2); } else if (repeat == 3) { return m_locale.dayName(date.dayOfWeek(), QLocale::ShortFormat); - } else if (repeat >= 4) { + } else /* repeat >= 4 */ { return m_locale.dayName(date.dayOfWeek(), QLocale::LongFormat); } - return QString(); } ////////////////////////////////// -- cgit v1.2.3 From 1ab521e7f46ad4e3c925d4eececdf3a2ff8b493b Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Tue, 11 Oct 2016 00:56:59 +0200 Subject: QFusionStyle: add missing break in switch in drawControl() The old code fell through into from the CE_RubberBand case into the CE_SizeGrip case if the cast of the the QStyleOption to a QStyleOptionRubberBand failed. Quite obviously, the drawing of a rubber band was requested by the caller, drawing a size grip instead must be considered a bug, regardless of any additional guards employed by the size grip case. So, fix by removing the conditional return in the success case and adding an unconditional break. The function ends after the switch, and all other cases also break instead of return, so consider the switch from return to break a contribution to the internal consistency of the function. Discovered independently by GCC 7 and Coverity. Coverity-Id: 11182 Change-Id: I2158f03b9eb018b952716ffa5e615c7b3cc49132 Reviewed-by: Friedemann Kleint Reviewed-by: Olivier Goffart (Woboq GmbH) --- src/widgets/styles/qfusionstyle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/widgets/styles/qfusionstyle.cpp b/src/widgets/styles/qfusionstyle.cpp index e9e1f349c5..dcc99496e3 100644 --- a/src/widgets/styles/qfusionstyle.cpp +++ b/src/widgets/styles/qfusionstyle.cpp @@ -1077,8 +1077,8 @@ void QFusionStyle::drawControl(ControlElement element, const QStyleOption *optio painter->setPen(innerLine); painter->drawRoundedRect(option->rect.adjusted(1, 1, -2, -2), 1, 1); painter->restore(); - return; } + break; case CE_SizeGrip: painter->save(); { -- cgit v1.2.3 From c34c8a564ef029144db6d2be256de7e46f91199a Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Mon, 10 Oct 2016 21:43:05 +0200 Subject: QComboBox: add missing break in switch in keyPressEvent() If the Key_Space case falls through, it does because !d->lineEdit, which makes the following case dead code, because it is guarded by the same condition. Fix by adding the break, which ensures that if those two cases ever diverge, the code stays working by intention, not chance. Independently discovered by GCC 7 and Coverity. Coverity-Id: 11157 Change-Id: Id14114b4157549d0f6fa036e8aa2bf0fa5a863cf Reviewed-by: Olivier Goffart (Woboq GmbH) --- src/widgets/widgets/qcombobox.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp index 181671c493..450c27d573 100644 --- a/src/widgets/widgets/qcombobox.cpp +++ b/src/widgets/widgets/qcombobox.cpp @@ -3160,6 +3160,7 @@ void QComboBox::keyPressEvent(QKeyEvent *e) showPopup(); return; } + break; case Qt::Key_Enter: case Qt::Key_Return: case Qt::Key_Escape: -- cgit v1.2.3 From eade394e993bb190bb71152ea0bd805beade6f59 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Thu, 6 Oct 2016 18:58:23 +0200 Subject: QtDBus: compile with GCC 7 GCC 7 warns about implicit fall-throughs now. Fix by adding the missing comments. Change-Id: I629fb3aced9296c81496f19f6ff78c7a5a12e991 Reviewed-by: Thiago Macieira --- src/dbus/qdbusabstractinterface.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'src') diff --git a/src/dbus/qdbusabstractinterface.cpp b/src/dbus/qdbusabstractinterface.cpp index d63a317612..d12a7d127e 100644 --- a/src/dbus/qdbusabstractinterface.cpp +++ b/src/dbus/qdbusabstractinterface.cpp @@ -755,18 +755,25 @@ QDBusMessage QDBusAbstractInterface::call(QDBus::CallMode mode, const QString &m switch (count) { case 8: argList.prepend(arg8); + // fall through case 7: argList.prepend(arg7); + // fall through case 6: argList.prepend(arg6); + // fall through case 5: argList.prepend(arg5); + // fall through case 4: argList.prepend(arg4); + // fall through case 3: argList.prepend(arg3); + // fall through case 2: argList.prepend(arg2); + // fall through case 1: argList.prepend(arg1); } @@ -813,18 +820,25 @@ QDBusPendingCall QDBusAbstractInterface::asyncCall(const QString &method, const switch (count) { case 8: argList.prepend(arg8); + // fall through case 7: argList.prepend(arg7); + // fall through case 6: argList.prepend(arg6); + // fall through case 5: argList.prepend(arg5); + // fall through case 4: argList.prepend(arg4); + // fall through case 3: argList.prepend(arg3); + // fall through case 2: argList.prepend(arg2); + // fall through case 1: argList.prepend(arg1); } -- cgit v1.2.3 From 0c8b5b9a0446fdd881bbceddbbe2afc9ec9f1a0b Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Thu, 6 Oct 2016 18:58:23 +0200 Subject: QtOpenGl: compile with GCC 7 GCC 7 warns about implicit fall-throughs now. Fix by adding the missing comments. Change-Id: I081d4db07c7f2b30ee6344a166aaec34ac639ee5 Reviewed-by: Edward Welbourne Reviewed-by: Sean Harmer --- src/opengl/qgl.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'src') diff --git a/src/opengl/qgl.cpp b/src/opengl/qgl.cpp index 652a498930..071c8d63cb 100644 --- a/src/opengl/qgl.cpp +++ b/src/opengl/qgl.cpp @@ -1287,14 +1287,19 @@ QGLFormat::OpenGLVersionFlags Q_AUTOTEST_EXPORT qOpenGLVersionFlagsFromString(co switch (versionString[2].toLatin1()) { case '5': versionFlags |= QGLFormat::OpenGL_Version_1_5; + // fall through case '4': versionFlags |= QGLFormat::OpenGL_Version_1_4; + // fall through case '3': versionFlags |= QGLFormat::OpenGL_Version_1_3; + // fall through case '2': versionFlags |= QGLFormat::OpenGL_Version_1_2; + // fall through case '1': versionFlags |= QGLFormat::OpenGL_Version_1_1; + // fall through default: break; } @@ -1319,10 +1324,13 @@ QGLFormat::OpenGLVersionFlags Q_AUTOTEST_EXPORT qOpenGLVersionFlagsFromString(co switch (versionString[2].toLatin1()) { case '3': versionFlags |= QGLFormat::OpenGL_Version_3_3; + // fall through case '2': versionFlags |= QGLFormat::OpenGL_Version_3_2; + // fall through case '1': versionFlags |= QGLFormat::OpenGL_Version_3_1; + // fall through case '0': break; default: @@ -1347,10 +1355,13 @@ QGLFormat::OpenGLVersionFlags Q_AUTOTEST_EXPORT qOpenGLVersionFlagsFromString(co switch (versionString[2].toLatin1()) { case '3': versionFlags |= QGLFormat::OpenGL_Version_4_3; + // fall through case '2': versionFlags |= QGLFormat::OpenGL_Version_4_2; + // fall through case '1': versionFlags |= QGLFormat::OpenGL_Version_4_1; + // fall through case '0': break; default: -- cgit v1.2.3 From 77372e0b66393c1f9673e41418683c96a361dfe4 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Thu, 6 Oct 2016 18:58:23 +0200 Subject: harfbuzz: compile with GCC 7 GCC 7 warns about implicit fall-throughs now. Fix by adding the missing comment. Didn't send a patch to upstream, because upstream harfbuzz-old hasn't seen a commit in four years, and this code is no longer in harfbuzz-ng. Change-Id: Ic97efbe01edd37738dcdf43528e82511197d7fb2 Reviewed-by: Konstantin Ritt --- src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src') diff --git a/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp b/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp index f7a4195308..c234f19918 100644 --- a/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp +++ b/src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp @@ -156,12 +156,14 @@ static inline void positionCluster(HB_ShaperItem *item, int gfrom, int glast) // ### wrong in rtl context! case HB_Combining_BelowLeft: p.y += offset; + // fall through case HB_Combining_BelowLeftAttached: p.x += attachmentRect.x - markMetrics.x; p.y += (attachmentRect.y + attachmentRect.height) - markMetrics.y; break; case HB_Combining_Below: p.y += offset; + // fall through case HB_Combining_BelowAttached: p.x += attachmentRect.x - markMetrics.x; p.y += (attachmentRect.y + attachmentRect.height) - markMetrics.y; @@ -170,28 +172,33 @@ static inline void positionCluster(HB_ShaperItem *item, int gfrom, int glast) break; case HB_Combining_BelowRight: p.y += offset; + // fall through case HB_Combining_BelowRightAttached: p.x += attachmentRect.x + attachmentRect.width - markMetrics.width - markMetrics.x; p.y += attachmentRect.y + attachmentRect.height - markMetrics.y; break; case HB_Combining_Left: p.x -= offset; + // fall through case HB_Combining_LeftAttached: break; case HB_Combining_Right: p.x += offset; + // fall through case HB_Combining_RightAttached: break; case HB_Combining_DoubleAbove: // ### wrong in RTL context! case HB_Combining_AboveLeft: p.y -= offset; + // fall through case HB_Combining_AboveLeftAttached: p.x += attachmentRect.x - markMetrics.x; p.y += attachmentRect.y - markMetrics.y - markMetrics.height; break; case HB_Combining_Above: p.y -= offset; + // fall through case HB_Combining_AboveAttached: p.x += attachmentRect.x - markMetrics.x; p.y += attachmentRect.y - markMetrics.y - markMetrics.height; @@ -200,6 +207,7 @@ static inline void positionCluster(HB_ShaperItem *item, int gfrom, int glast) break; case HB_Combining_AboveRight: p.y -= offset; + // fall through case HB_Combining_AboveRightAttached: p.x += attachmentRect.x + attachmentRect.width - markMetrics.x - markMetrics.width; p.y += attachmentRect.y - markMetrics.y - markMetrics.height; -- cgit v1.2.3 From de48fd192b7973c4849ec79bce4cd491b5e8550f Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Mon, 10 Oct 2016 21:02:16 +0200 Subject: QToolBarAreaLayoutInfo: add missing break statements in switch in distance() A fall-through here is logically non-sensical, because of symmetry (or lack thereof). Thus, a break must have been intended. Add it. While we're at it, also replace the default case label with the non-functional enum value QInternal::DockCount, so that -Wswitch can warn us if ever there should be a new DockPosition. Found independently by both GCC 7 and Coverity. Coverity-Id: 11145 Coverity-Id: 11146 Coverity-Id: 11147 Change-Id: I6bb31c1517e40f0cb06ceaee5aeb6fa78b84a523 Reviewed-by: Edward Welbourne --- src/widgets/widgets/qtoolbararealayout.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/widgets/widgets/qtoolbararealayout.cpp b/src/widgets/widgets/qtoolbararealayout.cpp index 16b1115dd6..f42c1f0ed9 100644 --- a/src/widgets/widgets/qtoolbararealayout.cpp +++ b/src/widgets/widgets/qtoolbararealayout.cpp @@ -598,16 +598,21 @@ int QToolBarAreaLayoutInfo::distance(const QPoint &pos) const case QInternal::LeftDock: if (pos.y() < rect.bottom()) return pos.x() - rect.right(); + break; case QInternal::RightDock: if (pos.y() < rect.bottom()) return rect.left() - pos.x(); + break; case QInternal::TopDock: if (pos.x() < rect.right()) return pos.y() - rect.bottom(); + break; case QInternal::BottomDock: if (pos.x() < rect.right()) return rect.top() - pos.y(); - default: + break; + + case QInternal::DockCount: break; } return -1; -- cgit v1.2.3 From f4fff02cbb1f9399f407c15a27741c6cd1a17133 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Mon, 10 Oct 2016 16:09:32 +0200 Subject: QXcbShmImage: don't use shmget()'s return unless it succeeds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When shmget() failed, we didn't set m_shm_info.shmid (not even to the -1 failure id) but did pass it (i.e. uninitialized noise) to shmat(), among other related functions. Guard against this; handle failure gracefully. Task-number: QTBUG-56419 Change-Id: Ie823c36c2ede03af6cb5d94ce7b4b5cd543c1008 Reviewed-by: Timur Pocheptsov Reviewed-by: Błażej Szczygieł Reviewed-by: Shawn Rutledge Reviewed-by: Joni Poikelin Reviewed-by: Laszlo Agocs --- src/plugins/platforms/xcb/qxcbbackingstore.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/xcb/qxcbbackingstore.cpp b/src/plugins/platforms/xcb/qxcbbackingstore.cpp index 3b04c59e28..0b76830d8e 100644 --- a/src/plugins/platforms/xcb/qxcbbackingstore.cpp +++ b/src/plugins/platforms/xcb/qxcbbackingstore.cpp @@ -150,12 +150,13 @@ QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size, uint depth, QI return; int id = shmget(IPC_PRIVATE, segmentSize, IPC_CREAT | 0600); - if (id == -1) + if (id == -1) { qWarning("QXcbShmImage: shmget() failed (%d: %s) for size %d (%dx%d)", errno, strerror(errno), segmentSize, size.width(), size.height()); - else - m_shm_info.shmid = id; - m_shm_info.shmaddr = m_xcb_image->data = (quint8 *)shmat (m_shm_info.shmid, 0, 0); + } else { + m_shm_info.shmaddr = m_xcb_image->data = (quint8 *)shmat(id, 0, 0); + } + m_shm_info.shmid = id; m_shm_info.shmseg = xcb_generate_id(xcb_connection()); const xcb_query_extension_reply_t *shm_reply = xcb_get_extension_data(xcb_connection(), &xcb_shm_id); @@ -166,9 +167,10 @@ QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size, uint depth, QI if (!shm_present || error || id == -1) { free(error); - shmdt(m_shm_info.shmaddr); - shmctl(m_shm_info.shmid, IPC_RMID, 0); - + if (id != -1) { + shmdt(m_shm_info.shmaddr); + shmctl(m_shm_info.shmid, IPC_RMID, 0); + } m_shm_info.shmaddr = 0; m_xcb_image->data = (uint8_t *)malloc(segmentSize); -- cgit v1.2.3 From f12006e64405de72ac09f364ef25ee9701c9b755 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Str=C3=B8mme?= Date: Thu, 6 Oct 2016 17:49:52 +0200 Subject: Don't resize windows that aren't attached to a platform window QWindows that aren't created, and therefore don't have a platform window attached, should not be treated as "normal" windows. The expectation, in our code, is that these windows won't get their geometry updated by the platform plugin, and that the geometry is only changed by the owner. In QQuickWidget's case this was causing the scene to be rendered incorrectly. Task-number: QTBUG-50973 Change-Id: Iea62dfb7fa90cbe450a662c5792c7c4f49c991fd Reviewed-by: Laszlo Agocs --- src/gui/kernel/qplatformscreen.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src') diff --git a/src/gui/kernel/qplatformscreen.cpp b/src/gui/kernel/qplatformscreen.cpp index 8e9767d69e..3ec7a4cf3f 100644 --- a/src/gui/kernel/qplatformscreen.cpp +++ b/src/gui/kernel/qplatformscreen.cpp @@ -335,6 +335,10 @@ void QPlatformScreen::resizeMaximizedWindows() for (int i = 0; i < windows.size(); ++i) { QWindow *w = windows.at(i); + // Skip non-platform windows, e.g., offscreen windows. + if (!w->handle()) + continue; + if (platformScreenForWindow(w) != this) continue; -- cgit v1.2.3 From dde86ebb9b020811a731a180c4f4d98f3b60728b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Str=C3=B8mme?= Date: Thu, 6 Oct 2016 18:34:10 +0200 Subject: Android: Don't update offscreen windows Offscreen windows should not be handle by the platform plugin. Task-number: QTBUG-50973 Change-Id: I719a24b9bbcaad460d78fdc4095e86d615357cd2 Reviewed-by: Laszlo Agocs --- src/plugins/platforms/android/androidjnimain.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp index fe2401f561..69c590940f 100644 --- a/src/plugins/platforms/android/androidjnimain.cpp +++ b/src/plugins/platforms/android/androidjnimain.cpp @@ -621,7 +621,12 @@ static void updateWindow(JNIEnv */*env*/, jobject /*thiz*/) if (QGuiApplication::instance() != nullptr) { foreach (QWindow *w, QGuiApplication::topLevelWindows()) { - QRect availableGeometry = w->screen()->availableGeometry(); + + // Skip non-platform windows, e.g., offscreen windows. + if (!w->handle()) + continue; + + QRect availableGeometry = w->screen()->availableGeometry(); if (w->geometry().width() > 0 && w->geometry().height() > 0 && availableGeometry.width() > 0 && availableGeometry.height() > 0) QWindowSystemInterface::handleExposeEvent(w, QRegion(QRect(QPoint(), w->geometry().size()))); } -- cgit v1.2.3 From cc62c3002231d74cbee8cb0105adf6372d37e7d9 Mon Sep 17 00:00:00 2001 From: BogDan Vatra Date: Wed, 12 Oct 2016 14:13:36 +0300 Subject: Android: Ministro updates - bump minimum required Qt version - use market://details instead which opens Ministro's page directly Change-Id: I3d879503625fe29e7b23149402217337fee6a863 Reviewed-by: Eskil Abrahamsen Blomfeldt --- .../java/src/org/qtproject/qt5/android/bindings/QtActivity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java index 9fc903af8e..faa5765709 100644 --- a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java +++ b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java @@ -101,7 +101,7 @@ public class QtActivity extends Activity private final static int MINISTRO_INSTALL_REQUEST_CODE = 0xf3ee; // request code used to know when Ministro instalation is finished private static final int MINISTRO_API_LEVEL = 5; // Ministro api level (check IMinistro.aidl file) private static final int NECESSITAS_API_LEVEL = 2; // Necessitas api level used by platform plugin - private static final int QT_VERSION = 0x050100; // This app requires at least Qt version 5.1.0 + private static final int QT_VERSION = 0x050600; // This app requires at least Qt version 5.6.0 private static final String ERROR_CODE_KEY = "error.code"; private static final String ERROR_MESSAGE_KEY = "error.message"; @@ -333,7 +333,7 @@ public class QtActivity extends Activity @Override public void onClick(DialogInterface dialogInterface, int i) { try { - Uri uri = Uri.parse("market://search?q=pname:org.kde.necessitas.ministro"); + Uri uri = Uri.parse("market://details?id=org.kde.necessitas.ministro"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivityForResult(intent, MINISTRO_INSTALL_REQUEST_CODE); } catch (Exception e) { -- cgit v1.2.3 From e732e432ab3b6741917cafa93117b8a9a04d6387 Mon Sep 17 00:00:00 2001 From: Alexander Volkov Date: Mon, 10 Oct 2016 01:13:23 +0300 Subject: Remove unused static member QIconLoaderEngineEntry::count It was introduced in Qt 4 by the commit 13a31fe82845f8b1f4d86919080d3b2a87c4d061 and was unused even there. Change-Id: I5f3861918ea1f443f7e13439fafa067f2b28a91a Reviewed-by: Marc Mutz --- src/gui/image/qiconloader_p.h | 1 - 1 file changed, 1 deletion(-) (limited to 'src') diff --git a/src/gui/image/qiconloader_p.h b/src/gui/image/qiconloader_p.h index ccf0a9d438..4d31a5d898 100644 --- a/src/gui/image/qiconloader_p.h +++ b/src/gui/image/qiconloader_p.h @@ -89,7 +89,6 @@ public: QIcon::State state) = 0; QString filename; QIconDirInfo dir; - static int count; }; struct ScalableEntry : public QIconLoaderEngineEntry -- cgit v1.2.3 From f3ce959de6c682bdb7e71f7b82742f28a5be1e9c Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Wed, 5 Oct 2016 15:45:55 +0200 Subject: Fix illegal memory access on simple image rotates Clip the transformed and rounded sourceClip to the source rectangle, so we don't try to rotate pixels outside the source. Task-number: QTBUG-56252 Change-Id: Ib9cb80f9856724118867aea37ead0b02a6c71495 Reviewed-by: Shawn Rutledge Reviewed-by: Gunnar Sletta --- src/gui/painting/qpaintengine_raster.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src') diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp index f87b052df2..83370be33f 100644 --- a/src/gui/painting/qpaintengine_raster.cpp +++ b/src/gui/painting/qpaintengine_raster.cpp @@ -2273,6 +2273,8 @@ void QRasterPaintEngine::drawImage(const QRectF &r, const QImage &img, const QRe = QRectF(sr.x() + clippedTargetRect.x() - r.x(), sr.y() + clippedTargetRect.y() - r.y(), clippedTargetRect.width(), clippedTargetRect.height()).toRect(); + clippedSourceRect = clippedSourceRect.intersected(img.rect()); + uint dbpl = d->rasterBuffer->bytesPerLine(); uint sbpl = img.bytesPerLine(); -- cgit v1.2.3 From ef416e0faaa83cd122038db397dd24d949c9cafe Mon Sep 17 00:00:00 2001 From: Alexander Volkov Date: Wed, 12 Oct 2016 17:18:18 +0300 Subject: QIconLoaderEngine: add missing Q_DECL_OVERRIDEs Change-Id: I7671b05f2e3c218870dca04f3ed52c231dbe4a9d Reviewed-by: Marc Mutz --- src/gui/image/qiconloader_p.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/gui/image/qiconloader_p.h b/src/gui/image/qiconloader_p.h index 4d31a5d898..57ab60b7a5 100644 --- a/src/gui/image/qiconloader_p.h +++ b/src/gui/image/qiconloader_p.h @@ -117,18 +117,18 @@ public: QIconLoaderEngine(const QString& iconName = QString()); ~QIconLoaderEngine(); - void paint(QPainter *painter, const QRect &rect, QIcon::Mode mode, QIcon::State state); - QPixmap pixmap(const QSize &size, QIcon::Mode mode, QIcon::State state); - QSize actualSize(const QSize &size, QIcon::Mode mode, QIcon::State state); - QIconEngine *clone() const; - bool read(QDataStream &in); - bool write(QDataStream &out) const; + void paint(QPainter *painter, const QRect &rect, QIcon::Mode mode, QIcon::State state) Q_DECL_OVERRIDE; + QPixmap pixmap(const QSize &size, QIcon::Mode mode, QIcon::State state) Q_DECL_OVERRIDE; + QSize actualSize(const QSize &size, QIcon::Mode mode, QIcon::State state) Q_DECL_OVERRIDE; + QIconEngine *clone() const Q_DECL_OVERRIDE; + bool read(QDataStream &in) Q_DECL_OVERRIDE; + bool write(QDataStream &out) const Q_DECL_OVERRIDE; private: - QString key() const; + QString key() const Q_DECL_OVERRIDE; bool hasIcon() const; void ensureLoaded(); - void virtual_hook(int id, void *data); + void virtual_hook(int id, void *data) Q_DECL_OVERRIDE; QIconLoaderEngineEntry *entryForSize(const QSize &size); QIconLoaderEngine(const QIconLoaderEngine &other); QThemeIconInfo m_info; -- cgit v1.2.3 From 8796c69480a6e5e331d19edf24d4dabb180bc4d2 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Mon, 10 Oct 2016 03:55:35 +0200 Subject: QNetworkSession: make sure that "interface" isn't #defined Depending on #include order isn't a good idea. Change-Id: Ief935e1fcc5d40ecb510fffd147c08dffe6cba2d Reviewed-by: Edward Welbourne --- src/network/bearer/qnetworksession.cpp | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src') diff --git a/src/network/bearer/qnetworksession.cpp b/src/network/bearer/qnetworksession.cpp index 6f83fd25ca..1b939bab01 100644 --- a/src/network/bearer/qnetworksession.cpp +++ b/src/network/bearer/qnetworksession.cpp @@ -42,6 +42,11 @@ #include "qnetworkconfigmanager_p.h" +// for QNetworkSession::interface +#ifdef interface +# undef interface +#endif + #ifndef QT_NO_BEARERMANAGEMENT QT_BEGIN_NAMESPACE -- cgit v1.2.3 From d023b300b26a9db3cf4dbbe31c1cc5726fe277d7 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Thu, 1 Sep 2016 13:29:46 +0200 Subject: Document that am/pm in QDateTime::toString are locale-specific Change-Id: I28382b25ac94cbfbad4acff1308ddd8baf5ca693 Task-number: QTBUG-55632 Reviewed-by: Edward Welbourne --- src/corelib/tools/qdatetime.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp index 6b09b4107c..3e29b55666 100644 --- a/src/corelib/tools/qdatetime.cpp +++ b/src/corelib/tools/qdatetime.cpp @@ -1623,9 +1623,11 @@ QString QTime::toString(Qt::DateFormat format) const \row \li z \li the milliseconds without leading zeroes (0 to 999) \row \li zzz \li the milliseconds with leading zeroes (000 to 999) \row \li AP or A - \li use AM/PM display. \e A/AP will be replaced by either "AM" or "PM". + \li use AM/PM display. \e A/AP will be replaced by either + QLocale::amText() or QLocale::pmText(). \row \li ap or a - \li use am/pm display. \e a/ap will be replaced by either "am" or "pm". + \li use am/pm display. \e a/ap will be replaced by a lower-case version of + QLocale::amText() or QLocale::pmText(). \row \li t \li the timezone (for example "CEST") \endtable @@ -1634,7 +1636,8 @@ QString QTime::toString(Qt::DateFormat format) const expression. Two consecutive single quotes ("''") are replaced by a singlequote in the output. Formats without separators (e.g. "HHmm") are currently not supported. - Example format strings (assuming that the QTime is 14:13:09.042) + Example format strings (assuming that the QTime is 14:13:09.042 and the system + locale is \c{en_US}) \table \header \li Format \li Result -- cgit v1.2.3 From 51767affb380eea5961637f07a2e881b93b6fea5 Mon Sep 17 00:00:00 2001 From: Alexandru Croitor Date: Thu, 11 Feb 2016 16:28:57 +0100 Subject: Show warning when setting new default QSurfaceFormat If a global shared context is created, and afterwards a new default QSurfaceFormat with a different version or profile is set, it can lead to issues with context sharing. The documentation for QSurfaceFormat::setDefaultFormat mentions this. It would be helpful to actually show a warning in case it happens. Change-Id: I71f7ce95496e1ecbfc6a0c7d7bed146ef8dc351e Reviewed-by: Laszlo Agocs --- src/gui/kernel/qsurfaceformat.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src') diff --git a/src/gui/kernel/qsurfaceformat.cpp b/src/gui/kernel/qsurfaceformat.cpp index d078336d73..18fde5716b 100644 --- a/src/gui/kernel/qsurfaceformat.cpp +++ b/src/gui/kernel/qsurfaceformat.cpp @@ -35,6 +35,7 @@ #include #include +#include #ifdef major #undef major @@ -758,6 +759,11 @@ Q_GLOBAL_STATIC(QSurfaceFormat, qt_default_surface_format) */ void QSurfaceFormat::setDefaultFormat(const QSurfaceFormat &format) { + QOpenGLContext *globalContext = QOpenGLContext::globalShareContext(); + if (globalContext && globalContext->isValid()) { + qWarning("Warning: Setting a new default format with a different version or profile after " + "the global shared context is created may cause issues with context sharing."); + } *qt_default_surface_format() = format; } -- cgit v1.2.3 From cd1d11414021288729cd85a32a7a1160756aeeab Mon Sep 17 00:00:00 2001 From: Alexandru Croitor Date: Fri, 30 Sep 2016 18:36:15 +0200 Subject: Unset qgl_current_fbo when the default FBO is bound Previously when a new QOpenGLFramebufferObject was bound, the QOpenGLContextPrivate::qgl_current_fbo member was also updated to point to this new object. But if a user called QOpenGLFramebufferObject::bindDefault(), qgl_current_fbo was not unset, meaning that if the FBO object would be deleted at some point, qgl_current_fbo would be a dangling pointer. This patch makes sure to clear the value of qgl_current_fbo when bindDefault() is called. It is cleared, and not set to point to another object because the default platform OpenGL FBO is not backed by a QOpenGLFramebufferObject. Task-number: QTBUG-56296 Change-Id: I68b53d8b446660accdf5841df3d168ee2f133a90 Reviewed-by: Simon Hausmann Reviewed-by: Laszlo Agocs --- src/gui/opengl/qopenglframebufferobject.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/gui/opengl/qopenglframebufferobject.cpp b/src/gui/opengl/qopenglframebufferobject.cpp index 56e04c09d8..b1b580f85b 100644 --- a/src/gui/opengl/qopenglframebufferobject.cpp +++ b/src/gui/opengl/qopenglframebufferobject.cpp @@ -1490,6 +1490,7 @@ bool QOpenGLFramebufferObject::bindDefault() if (ctx) { ctx->functions()->glBindFramebuffer(GL_FRAMEBUFFER, ctx->defaultFramebufferObject()); QOpenGLContextPrivate::get(ctx)->qgl_current_fbo_invalid = true; + QOpenGLContextPrivate::get(ctx)->qgl_current_fbo = Q_NULLPTR; } #ifdef QT_DEBUG else -- cgit v1.2.3 From 23c7816f44cfe02e1e056ab4bb40e618992a0e2b Mon Sep 17 00:00:00 2001 From: Frederik Gladhorn Date: Wed, 5 Oct 2016 14:27:16 +0200 Subject: Doc: add notes about validator and completer in QComboBox MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When setting the editable property to false, we delete the internal QLineEdit used by QComboBox. Add comments that this results in the loss of validator and completer. Task-number: QTBUG-56035 Change-Id: Ife04ac2b9bb3f32fae5328f1ec73b1d5d769d52c Reviewed-by: Topi Reiniö Reviewed-by: Nico Vertriest --- src/widgets/widgets/qcombobox.cpp | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src') diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp index 450c27d573..0ef76b95f0 100644 --- a/src/widgets/widgets/qcombobox.cpp +++ b/src/widgets/widgets/qcombobox.cpp @@ -1678,6 +1678,9 @@ void QComboBox::setIconSize(const QSize &size) By default, this property is \c false. The effect of editing depends on the insert policy. + \note When disabling the \a editable state, the validator and + completer are removed. + \sa InsertPolicy */ bool QComboBox::isEditable() const @@ -1829,6 +1832,8 @@ QLineEdit *QComboBox::lineEdit() const \fn void QComboBox::setValidator(const QValidator *validator) Sets the \a validator to use instead of the current validator. + + \note The validator is removed when the editable property becomes \c false. */ void QComboBox::setValidator(const QValidator *v) @@ -1862,6 +1867,8 @@ const QValidator *QComboBox::validator() const By default, for an editable combo box, a QCompleter that performs case insensitive inline completion is automatically created. + + \note The completer is removed when the \a editable property becomes \c false. */ void QComboBox::setCompleter(QCompleter *c) { -- cgit v1.2.3 From 7740f5e98b2f3ab5d9c1f512d1a89e9e1b64434d Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Thu, 13 Oct 2016 13:04:33 +0200 Subject: QMimeXMLProvider: add missing out-of-line destructor Fixes build with the latest GCC 7. Change-Id: I4900a256ed1c6cb177d7f94d54e5b07c06ddad08 Task-number: QTBUG-56514 Reviewed-by: Marc Mutz --- src/corelib/mimetypes/qmimeprovider.cpp | 4 ++++ src/corelib/mimetypes/qmimeprovider_p.h | 1 + 2 files changed, 5 insertions(+) (limited to 'src') diff --git a/src/corelib/mimetypes/qmimeprovider.cpp b/src/corelib/mimetypes/qmimeprovider.cpp index fbd14e2d5d..aa8d8c9b08 100644 --- a/src/corelib/mimetypes/qmimeprovider.cpp +++ b/src/corelib/mimetypes/qmimeprovider.cpp @@ -706,6 +706,10 @@ QMimeXMLProvider::QMimeXMLProvider(QMimeDatabasePrivate *db) initResources(); } +QMimeXMLProvider::~QMimeXMLProvider() +{ +} + bool QMimeXMLProvider::isValid() { return true; diff --git a/src/corelib/mimetypes/qmimeprovider_p.h b/src/corelib/mimetypes/qmimeprovider_p.h index c0517d69a4..8eba71eddd 100644 --- a/src/corelib/mimetypes/qmimeprovider_p.h +++ b/src/corelib/mimetypes/qmimeprovider_p.h @@ -132,6 +132,7 @@ class QMimeXMLProvider : public QMimeProviderBase { public: QMimeXMLProvider(QMimeDatabasePrivate *db); + ~QMimeXMLProvider(); virtual bool isValid() Q_DECL_OVERRIDE; virtual QMimeType mimeTypeForName(const QString &name) Q_DECL_OVERRIDE; -- cgit v1.2.3 From 815341dbec1fd4f04fe76fc438cc9b3308ffafe9 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Tue, 11 Oct 2016 16:42:11 +0200 Subject: eglfs: Fix deformed mouse cursor image In 5.8 cr got changed to QRect from QRectF. This is incorrect without adjusting the calculations based on it since QRect and QRectF's right() and bottom() differs by 1. Switch back to QRectF. Task-number: QTBUG-56478 Change-Id: I5bde4ee59ca9bbf62f65493c66f42707032bfc80 Reviewed-by: Andy Nichols --- src/plugins/platforms/eglfs/api/qeglfscursor.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/eglfs/api/qeglfscursor.cpp b/src/plugins/platforms/eglfs/api/qeglfscursor.cpp index 1b3446c4ac..2b54251a06 100644 --- a/src/plugins/platforms/eglfs/api/qeglfscursor.cpp +++ b/src/plugins/platforms/eglfs/api/qeglfscursor.cpp @@ -341,14 +341,16 @@ void QEglFSCursor::paintOnScreen() if (!m_visible) return; - QRect cr = cursorRect(); // hotspot included + // cr must be a QRectF, otherwise cr.right() and bottom() would be off by + // one in the calculations below. + QRectF cr = cursorRect(); // hotspot included // Support virtual desktop too. Backends with multi-screen support (e.g. all // variants of KMS/DRM) will enable this by default. In this case all // screens are siblings of each other. When not enabled, the sibling list // only contains m_screen itself. for (QPlatformScreen *screen : m_screen->virtualSiblings()) { - if (screen->geometry().contains(cr.topLeft() + m_cursor.hotSpot) + if (screen->geometry().contains(cr.topLeft().toPoint() + m_cursor.hotSpot) && QOpenGLContext::currentContext()->screen() == screen->screen()) { cr.translate(-screen->geometry().topLeft()); -- cgit v1.2.3 From d8c72f41548a01bf39f82e77da01a2be57a06d95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Tue, 11 Oct 2016 16:43:42 +0200 Subject: iOS: Take advantage of new synchronous API for QPA event delivery By using the SynchronousDelivery specialization instead of flushing all window system events, we remove the risk of flushing an event that was added without our knowledge. For example, QGuiApplicationPrivate::processMouseEvent() used to prepend a mouse move event to the QPA queue, which is why we had a check for QWidgetWindow when flushing geometry changes. processMouseEvent no longer sends the move event via the QPA queue, so that's no longer an issue, but if it were to be reintroduced, we wouldn't need to check for QWidgetWindow, as we're not flushing all events anymore. Change-Id: Ib346ea9501cd88ddda6c2137981d3eb0922192a0 Reviewed-by: Richard Moe Gustavsen Reviewed-by: Simon Hausmann Reviewed-by: Laszlo Agocs --- src/gui/kernel/qwindowsysteminterface.cpp | 47 +++++++++++++++---------------- src/gui/kernel/qwindowsysteminterface.h | 12 ++++++-- src/plugins/platforms/ios/quiview.mm | 35 ++++++++--------------- 3 files changed, 43 insertions(+), 51 deletions(-) (limited to 'src') diff --git a/src/gui/kernel/qwindowsysteminterface.cpp b/src/gui/kernel/qwindowsysteminterface.cpp index b799f75090..5dd525f315 100644 --- a/src/gui/kernel/qwindowsysteminterface.cpp +++ b/src/gui/kernel/qwindowsysteminterface.cpp @@ -165,11 +165,11 @@ void QWindowSystemInterface::handleEnterLeaveEvent(QWindow *enter, QWindow *leav handleEnterEvent(enter, local, global); } -void QWindowSystemInterface::handleWindowActivated(QWindow *tlw, Qt::FocusReason r) +QT_DEFINE_QPA_EVENT_HANDLER(void, handleWindowActivated, QWindow *tlw, Qt::FocusReason r) { QWindowSystemInterfacePrivate::ActivatedWindowEvent *e = new QWindowSystemInterfacePrivate::ActivatedWindowEvent(tlw, r); - QWindowSystemInterfacePrivate::handleWindowSystemEvent(e); + QWindowSystemInterfacePrivate::handleWindowSystemEvent(e); } void QWindowSystemInterface::handleWindowStateChanged(QWindow *tlw, Qt::WindowState newState) @@ -197,10 +197,25 @@ void QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationState /*! If \a oldRect is null, Qt will use the previously reported geometry instead. */ -void QWindowSystemInterface::handleGeometryChange(QWindow *tlw, const QRect &newRect, const QRect &oldRect) +QT_DEFINE_QPA_EVENT_HANDLER(void, handleGeometryChange, QWindow *tlw, const QRect &newRect, const QRect &oldRect) { QWindowSystemInterfacePrivate::GeometryChangeEvent *e = new QWindowSystemInterfacePrivate::GeometryChangeEvent(tlw, QHighDpi::fromNativePixels(newRect, tlw), QHighDpi::fromNativePixels(oldRect, tlw)); - QWindowSystemInterfacePrivate::handleWindowSystemEvent(e); + QWindowSystemInterfacePrivate::handleWindowSystemEvent(e); +} + +QWindowSystemInterfacePrivate::ExposeEvent::ExposeEvent(QWindow *window, const QRegion ®ion) + : WindowSystemEvent(Expose) + , window(window) + , isExposed(window && window->handle() ? window->handle()->isExposed() : false) + , region(region) +{ +} + +QT_DEFINE_QPA_EVENT_HANDLER(void, handleExposeEvent, QWindow *tlw, const QRegion ®ion) +{ + QWindowSystemInterfacePrivate::ExposeEvent *e = + new QWindowSystemInterfacePrivate::ExposeEvent(tlw, QHighDpi::fromNativeLocalExposedRegion(region, tlw)); + QWindowSystemInterfacePrivate::handleWindowSystemEvent(e); } void QWindowSystemInterface::handleCloseEvent(QWindow *tlw, bool *accepted) @@ -405,15 +420,6 @@ void QWindowSystemInterface::handleWheelEvent(QWindow *tlw, ulong timestamp, con QWindowSystemInterfacePrivate::handleWindowSystemEvent(e); } - -QWindowSystemInterfacePrivate::ExposeEvent::ExposeEvent(QWindow *window, const QRegion ®ion) - : WindowSystemEvent(Expose) - , window(window) - , isExposed(window && window->handle() ? window->handle()->isExposed() : false) - , region(region) -{ -} - int QWindowSystemInterfacePrivate::windowSystemEventsQueued() { return windowSystemEventQueue.count(); @@ -596,20 +602,20 @@ QT_DEFINE_QPA_EVENT_HANDLER(void, handleTouchEvent, QWindow *tlw, ulong timestam QWindowSystemInterfacePrivate::handleWindowSystemEvent(e); } -void QWindowSystemInterface::handleTouchCancelEvent(QWindow *w, QTouchDevice *device, +QT_DEFINE_QPA_EVENT_HANDLER(void, handleTouchCancelEvent, QWindow *w, QTouchDevice *device, Qt::KeyboardModifiers mods) { unsigned long time = QWindowSystemInterfacePrivate::eventTime.elapsed(); - handleTouchCancelEvent(w, time, device, mods); + handleTouchCancelEvent(w, time, device, mods); } -void QWindowSystemInterface::handleTouchCancelEvent(QWindow *w, ulong timestamp, QTouchDevice *device, +QT_DEFINE_QPA_EVENT_HANDLER(void, handleTouchCancelEvent, QWindow *w, ulong timestamp, QTouchDevice *device, Qt::KeyboardModifiers mods) { QWindowSystemInterfacePrivate::TouchEvent *e = new QWindowSystemInterfacePrivate::TouchEvent(w, timestamp, QEvent::TouchCancel, device, QList(), mods); - QWindowSystemInterfacePrivate::handleWindowSystemEvent(e); + QWindowSystemInterfacePrivate::handleWindowSystemEvent(e); } void QWindowSystemInterface::handleScreenOrientationChange(QScreen *screen, Qt::ScreenOrientation orientation) @@ -646,13 +652,6 @@ void QWindowSystemInterface::handleThemeChange(QWindow *tlw) QWindowSystemInterfacePrivate::handleWindowSystemEvent(e); } -void QWindowSystemInterface::handleExposeEvent(QWindow *tlw, const QRegion ®ion) -{ - QWindowSystemInterfacePrivate::ExposeEvent *e = - new QWindowSystemInterfacePrivate::ExposeEvent(tlw, QHighDpi::fromNativeLocalExposedRegion(region, tlw)); - QWindowSystemInterfacePrivate::handleWindowSystemEvent(e); -} - void QWindowSystemInterface::deferredFlushWindowSystemEvents(QEventLoop::ProcessEventsFlags flags) { Q_ASSERT(QThread::currentThread() == QGuiApplication::instance()->thread()); diff --git a/src/gui/kernel/qwindowsysteminterface.h b/src/gui/kernel/qwindowsysteminterface.h index 6fade3cc4c..3be3c3188c 100644 --- a/src/gui/kernel/qwindowsysteminterface.h +++ b/src/gui/kernel/qwindowsysteminterface.h @@ -150,11 +150,19 @@ public: template static void handleTouchEvent(QWindow *w, ulong timestamp, QTouchDevice *device, const QList &points, Qt::KeyboardModifiers mods = Qt::NoModifier); + template static void handleTouchCancelEvent(QWindow *w, QTouchDevice *device, Qt::KeyboardModifiers mods = Qt::NoModifier); + template static void handleTouchCancelEvent(QWindow *w, ulong timestamp, QTouchDevice *device, Qt::KeyboardModifiers mods = Qt::NoModifier); // rect is relative to parent + template static void handleGeometryChange(QWindow *w, const QRect &newRect, const QRect &oldRect = QRect()); + + // region is in local coordinates, do not confuse with geometry which is parent-relative + template + static void handleExposeEvent(QWindow *tlw, const QRegion ®ion); + static void handleCloseEvent(QWindow *w, bool *accepted = Q_NULLPTR); template @@ -162,6 +170,7 @@ public: template static void handleLeaveEvent(QWindow *w); static void handleEnterLeaveEvent(QWindow *enter, QWindow *leave, const QPointF &local = QPointF(), const QPointF& global = QPointF()); + template static void handleWindowActivated(QWindow *w, Qt::FocusReason r = Qt::OtherFocusReason); static void handleWindowStateChanged(QWindow *w, Qt::WindowState newState); @@ -169,9 +178,6 @@ public: static void handleApplicationStateChanged(Qt::ApplicationState newState, bool forcePropagate = false); - // region is in local coordinates, do not confuse with geometry which is parent-relative - static void handleExposeEvent(QWindow *tlw, const QRegion ®ion); - #ifndef QT_NO_DRAGANDDROP // Drag and drop. These events are sent immediately. static QPlatformDragQtResponse handleDrag(QWindow *w, const QMimeData *dropData, const QPoint &p, Qt::DropActions supportedActions); diff --git a/src/plugins/platforms/ios/quiview.mm b/src/plugins/platforms/ios/quiview.mm index 5c493617b1..2a1444e9e5 100644 --- a/src/plugins/platforms/ios/quiview.mm +++ b/src/plugins/platforms/ios/quiview.mm @@ -164,8 +164,7 @@ requestedGeometry : qt_window_private(m_qioswindow->window())->geometry; QWindow *window = m_qioswindow->window(); - QWindowSystemInterface::handleGeometryChange(window, actualGeometry, previousGeometry); - QWindowSystemInterface::flushWindowSystemEvents(window->inherits("QWidgetWindow") ? QEventLoop::ExcludeUserInputEvents : QEventLoop::AllEvents); + QWindowSystemInterface::handleGeometryChange(window, actualGeometry, previousGeometry); if (actualGeometry.size() != previousGeometry.size()) { // Trigger expose event on resize @@ -197,8 +196,7 @@ region = QRect(QPoint(), bounds); } - QWindowSystemInterface::handleExposeEvent(m_qioswindow->window(), region); - QWindowSystemInterface::flushWindowSystemEvents(); + QWindowSystemInterface::handleExposeEvent(m_qioswindow->window(), region); } // ------------------------------------------------------------------------- @@ -223,13 +221,10 @@ qImDebug() << m_qioswindow->window() << "became first responder"; - if (qGuiApp->focusWindow() != m_qioswindow->window()) { - QWindowSystemInterface::handleWindowActivated(m_qioswindow->window()); - QWindowSystemInterface::flushWindowSystemEvents(); - } else { - qImDebug() << m_qioswindow->window() - << "already active, not sending window activation"; - } + if (qGuiApp->focusWindow() != m_qioswindow->window()) + QWindowSystemInterface::handleWindowActivated(m_qioswindow->window()); + else + qImDebug() << m_qioswindow->window() << "already active, not sending window activation"; return YES; } @@ -264,10 +259,8 @@ qImDebug() << m_qioswindow->window() << "resigned first responder"; UIResponder *newResponder = FirstResponderCandidate::currentCandidate(); - if ([self responderShouldTriggerWindowDeactivation:newResponder]) { - QWindowSystemInterface::handleWindowActivated(0); - QWindowSystemInterface::flushWindowSystemEvents(); - } + if ([self responderShouldTriggerWindowDeactivation:newResponder]) + QWindowSystemInterface::handleWindowActivated(0); return YES; } @@ -357,10 +350,8 @@ - (void)sendTouchEventWithTimestamp:(ulong)timeStamp { - // Send touch event synchronously QIOSIntegration *iosIntegration = QIOSIntegration::instance(); - QWindowSystemInterface::handleTouchEvent(m_qioswindow->window(), timeStamp, iosIntegration->touchDevice(), m_activeTouches.values()); - QWindowSystemInterface::flushWindowSystemEvents(); + QWindowSystemInterface::handleTouchEvent(m_qioswindow->window(), timeStamp, iosIntegration->touchDevice(), m_activeTouches.values()); } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event @@ -438,10 +429,8 @@ NSTimeInterval timestamp = event ? event.timestamp : [[NSProcessInfo processInfo] systemUptime]; - // Send cancel touch event synchronously QIOSIntegration *iosIntegration = static_cast(QGuiApplicationPrivate::platformIntegration()); - QWindowSystemInterface::handleTouchCancelEvent(m_qioswindow->window(), ulong(timestamp * 1000), iosIntegration->touchDevice()); - QWindowSystemInterface::flushWindowSystemEvents(); + QWindowSystemInterface::handleTouchCancelEvent(m_qioswindow->window(), ulong(timestamp * 1000), iosIntegration->touchDevice()); } - (int)mapPressTypeToKey:(UIPress*)press @@ -464,14 +453,12 @@ // When handling the event (for example, as a back button), both press and // release events must be handled accordingly. - QScopedValueRollback syncRollback(QWindowSystemInterfacePrivate::synchronousWindowSystemEvents, true); - bool handled = false; for (UIPress* press in presses) { int key = [self mapPressTypeToKey:press]; if (key == Qt::Key_unknown) continue; - if (QWindowSystemInterface::handleKeyEvent(m_qioswindow->window(), type, key, Qt::NoModifier)) + if (QWindowSystemInterface::handleKeyEvent(m_qioswindow->window(), type, key, Qt::NoModifier)) handled = true; } -- cgit v1.2.3 From dcf7da7c93c0d974bfb72ffa677a1d26fb9be5e0 Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Mon, 10 Oct 2016 14:35:19 +0200 Subject: winrt: Do not lose initial data for TCP connections When a client connects and sends data immediately it was possible that initial data was lost as the state was set too late. If the callback was called before the state was set the socket engine just discarded the data. So the state has to be set before the callback is registered. The new implementation needs a list of pending read operations. It can happen that the "readyRead" callback is triggered directly while "put_Completed" is called. The callback reassigns readOp which causes a "function not implemented" exception when it jumps back to the "put_Completed" call in "initialize" Task-number: QTBUG-55889 Change-Id: I5f52e3377b6176f1f90f227ac0bf52b60ee2d95a Reviewed-by: Maurice Kalinowski --- src/network/socket/qnativesocketengine_winrt.cpp | 34 ++++++++++++++++++------ src/network/socket/qnativesocketengine_winrt_p.h | 2 +- 2 files changed, 27 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/network/socket/qnativesocketengine_winrt.cpp b/src/network/socket/qnativesocketengine_winrt.cpp index bd9b443602..2ff028d2c5 100644 --- a/src/network/socket/qnativesocketengine_winrt.cpp +++ b/src/network/socket/qnativesocketengine_winrt.cpp @@ -317,26 +317,31 @@ bool QNativeSocketEngine::initialize(qintptr socketDescriptor, QAbstractSocket:: // Start processing incoming data if (d->socketType == QAbstractSocket::TcpSocket) { HRESULT hr; - QEventDispatcherWinRT::runOnXamlThread([d, &hr, socket, this]() { + QEventDispatcherWinRT::runOnXamlThread([&hr, socket, socketState, this]() { + Q_D(QNativeSocketEngine); ComPtr buffer; HRESULT hr = g->bufferFactory->Create(READ_BUFFER_SIZE, &buffer); RETURN_OK_IF_FAILED("initialize(): Could not create buffer"); ComPtr stream; hr = socket->get_InputStream(&stream); RETURN_OK_IF_FAILED("initialize(): Could not obtain input stream"); - hr = stream->ReadAsync(buffer.Get(), READ_BUFFER_SIZE, InputStreamOptions_Partial, d->readOp.GetAddressOf()); + ComPtr readOp; + hr = stream->ReadAsync(buffer.Get(), READ_BUFFER_SIZE, InputStreamOptions_Partial, readOp.GetAddressOf()); RETURN_OK_IF_FAILED_WITH_ARGS("initialize(): Failed to read from the socket buffer (%s).", socketDescription(this).constData()); - hr = d->readOp->put_Completed(Callback(d, &QNativeSocketEnginePrivate::handleReadyRead).Get()); + d->pendingReadOps.append(readOp); + d->socketState = socketState; + hr = readOp->put_Completed(Callback(d, &QNativeSocketEnginePrivate::handleReadyRead).Get()); RETURN_OK_IF_FAILED_WITH_ARGS("initialize(): Failed to set socket read callback (%s).", socketDescription(this).constData()); return S_OK; }); if (FAILED(hr)) return false; + } else { + d->socketState = socketState; } - d->socketState = socketState; return true; } @@ -567,9 +572,9 @@ void QNativeSocketEngine::close() } #endif // _MSC_VER >= 1900 - if (d->readOp) { + for (ComPtr readOp : d->pendingReadOps) { ComPtr info; - hr = d->readOp.As(&info); + hr = readOp.As(&info); Q_ASSERT_SUCCEEDED(hr); if (info) { hr = info->Cancel(); @@ -933,9 +938,11 @@ void QNativeSocketEngine::establishRead() hr = g->bufferFactory->Create(READ_BUFFER_SIZE, &buffer); RETURN_HR_IF_FAILED("establishRead(): Failed to create buffer"); - hr = stream->ReadAsync(buffer.Get(), READ_BUFFER_SIZE, InputStreamOptions_Partial, &d->readOp); + ComPtr readOp; + hr = stream->ReadAsync(buffer.Get(), READ_BUFFER_SIZE, InputStreamOptions_Partial, readOp.GetAddressOf()); RETURN_HR_IF_FAILED("establishRead(): Failed to initiate socket read"); - hr = d->readOp->put_Completed(Callback(d, &QNativeSocketEnginePrivate::handleReadyRead).Get()); + d->pendingReadOps.append(readOp); + hr = readOp->put_Completed(Callback(d, &QNativeSocketEnginePrivate::handleReadyRead).Get()); RETURN_HR_IF_FAILED("establishRead(): Failed to register read callback"); return S_OK; }); @@ -1410,7 +1417,15 @@ HRESULT QNativeSocketEnginePrivate::handleReadyRead(IAsyncBufferOperation *async } Q_Q(QNativeSocketEngine); + for (int i = 0; i < pendingReadOps.count(); ++i) { + if (pendingReadOps.at(i).Get() == asyncInfo) { + pendingReadOps.takeAt(i); + break; + } + } + static QMutex mutex; + mutex.lock(); // A read in UnconnectedState will close the socket and return -1 and thus tell the caller, // that the connection was closed. The socket cannot be closed here, as the subsequent read // might fail then. @@ -1463,6 +1478,7 @@ HRESULT QNativeSocketEnginePrivate::handleReadyRead(IAsyncBufferOperation *async if (notifyOnRead) emit q->readReady(); + mutex.unlock(); hr = QEventDispatcherWinRT::runOnXamlThread([buffer, q, this]() { UINT32 readBufferLength; @@ -1476,12 +1492,14 @@ HRESULT QNativeSocketEnginePrivate::handleReadyRead(IAsyncBufferOperation *async hr = buffer->put_Length(0); RETURN_HR_IF_FAILED("handleReadyRead(): Could not set buffer length"); + ComPtr readOp; hr = stream->ReadAsync(buffer.Get(), readBufferLength, InputStreamOptions_Partial, &readOp); if (FAILED(hr)) { qErrnoWarning(hr, "handleReadyRead(): Could not read into socket stream buffer (%s).", socketDescription(q).constData()); return S_OK; } + pendingReadOps.append(readOp); hr = readOp->put_Completed(Callback(this, &QNativeSocketEnginePrivate::handleReadyRead).Get()); if (FAILED(hr)) { qErrnoWarning(hr, "handleReadyRead(): Failed to set socket read callback (%s).", diff --git a/src/network/socket/qnativesocketengine_winrt_p.h b/src/network/socket/qnativesocketengine_winrt_p.h index 605f3631b9..79530d57f1 100644 --- a/src/network/socket/qnativesocketengine_winrt_p.h +++ b/src/network/socket/qnativesocketengine_winrt_p.h @@ -214,7 +214,7 @@ private: { return reinterpret_cast(socketDescriptor); } Microsoft::WRL::ComPtr tcpListener; Microsoft::WRL::ComPtr connectOp; - Microsoft::WRL::ComPtr> readOp; + QVector>> pendingReadOps; QBuffer readBytes; QMutex readMutex; bool emitOnNewDatagram; -- cgit v1.2.3 From 6a35e77ef3f4eae80ca49937c680836eb4acdbe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Thu, 13 Oct 2016 15:54:23 +0200 Subject: Change confusing Q_DEAD_CODE_FROM_QT4_FOO define Commit c5db8fc74 changed all instances of Q_WS_FOO to have the prefix Q_DEAD_CODE_FROM_QT4 instead, to make it clearer when reading the code that the code in question was a left-over from Qt4, when we used Q_WS_ defines instead of Q_OS_ defines. This worked well for cases of #ifdef Q_DEAD_CODE_FROM_QT4, but less so for cases of #ifndef Q_DEAD_CODE_FROM_QT4, where the code was actually unconditionally included. To make this even clearer, the defines have been replaced by checks for 1 or 0, with a comment describing how the code used to look in Qt4. The use of constants in the check also makes it easier for editors to parse the condition and show visually that the code is defined out. Change-Id: I152070d87334df7259b417cd5e17d7b7950379b7 Reviewed-by: Lars Knoll --- src/printsupport/dialogs/qpagesetupdialog.cpp | 2 +- src/widgets/doc/snippets/code/doc_src_styles.cpp | 2 +- src/widgets/doc/snippets/macmainwindow.mm | 4 +- src/widgets/graphicsview/qgraphicsitem.cpp | 2 +- src/widgets/graphicsview/qgraphicsscene.cpp | 4 +- src/widgets/graphicsview/qgraphicsview.cpp | 4 +- src/widgets/graphicsview/qgraphicsview_p.h | 4 +- src/widgets/graphicsview/qgraphicswidget.cpp | 2 +- src/widgets/graphicsview/qgraphicswidget_p.cpp | 4 +- src/widgets/itemviews/qabstractitemview.cpp | 2 +- src/widgets/itemviews/qheaderview.cpp | 2 +- src/widgets/itemviews/qtreeview.cpp | 2 +- src/widgets/kernel/qapplication_p.h | 20 +-- src/widgets/kernel/qgesturemanager.cpp | 4 +- src/widgets/kernel/qt_widgets_pch.h | 2 +- src/widgets/kernel/qtooltip.cpp | 16 +-- src/widgets/kernel/qwhatsthis.cpp | 6 +- src/widgets/kernel/qwidget.cpp | 158 +++++++++++------------ src/widgets/kernel/qwidget.h | 4 +- src/widgets/kernel/qwidget_p.h | 18 +-- src/widgets/kernel/qwidgetbackingstore.cpp | 4 +- src/widgets/styles/qmacstyle_mac_p.h | 2 +- src/widgets/styles/qpixmapstyle.cpp | 4 +- src/widgets/styles/qstylefactory.cpp | 4 +- src/widgets/styles/qstyleoption.cpp | 2 +- src/widgets/styles/qstylesheetstyle.cpp | 2 +- src/widgets/util/qflickgesture.cpp | 2 +- src/widgets/util/qscroller.cpp | 6 +- src/widgets/util/qscroller_mac.mm | 2 +- src/widgets/util/qscrollerproperties.cpp | 4 +- src/widgets/util/qsystemtrayicon.cpp | 2 +- src/widgets/widgets/qabstractscrollarea.cpp | 28 ++-- src/widgets/widgets/qabstractscrollarea_p.h | 4 +- src/widgets/widgets/qabstractslider.cpp | 2 +- src/widgets/widgets/qcalendarwidget.cpp | 2 +- src/widgets/widgets/qcombobox.cpp | 4 +- src/widgets/widgets/qdatetimeedit.cpp | 2 +- src/widgets/widgets/qdialogbuttonbox.cpp | 2 +- src/widgets/widgets/qdockarealayout.cpp | 10 +- src/widgets/widgets/qdockwidget.cpp | 8 +- src/widgets/widgets/qlineedit.cpp | 8 +- src/widgets/widgets/qmainwindow.cpp | 16 +-- src/widgets/widgets/qmainwindowlayout.cpp | 24 ++-- src/widgets/widgets/qmainwindowlayout_p.h | 4 +- src/widgets/widgets/qmdiarea.cpp | 8 +- src/widgets/widgets/qmdisubwindow.cpp | 6 +- src/widgets/widgets/qplaintextedit.cpp | 2 +- src/widgets/widgets/qpushbutton.cpp | 8 +- src/widgets/widgets/qpushbutton.h | 4 +- src/widgets/widgets/qpushbutton_p.h | 2 +- src/widgets/widgets/qrubberband.cpp | 8 +- src/widgets/widgets/qsizegrip.cpp | 18 +-- src/widgets/widgets/qstatusbar.cpp | 4 +- src/widgets/widgets/qtabbar.cpp | 8 +- src/widgets/widgets/qtabbar_p.h | 4 +- src/widgets/widgets/qtextedit.cpp | 2 +- src/widgets/widgets/qtoolbar.cpp | 2 +- src/widgets/widgets/qwidgetlinecontrol.cpp | 2 +- src/widgets/widgets/qwidgetlinecontrol_p.h | 8 +- src/widgets/widgets/qwidgetresizehandler.cpp | 4 +- 60 files changed, 250 insertions(+), 250 deletions(-) (limited to 'src') diff --git a/src/printsupport/dialogs/qpagesetupdialog.cpp b/src/printsupport/dialogs/qpagesetupdialog.cpp index 81cbf87777..911c0ecdf7 100644 --- a/src/printsupport/dialogs/qpagesetupdialog.cpp +++ b/src/printsupport/dialogs/qpagesetupdialog.cpp @@ -116,7 +116,7 @@ void QPageSetupDialogPrivate::setPrinter(QPrinter *newPrinter) printer = new QPrinter; ownsPrinter = true; } -#ifndef Q_DEAD_CODE_FROM_QT4_X11 +#if 1 // Used to be excluded in Qt4 for Q_WS_X11 if (printer->outputFormat() != QPrinter::NativeFormat) qWarning("QPageSetupDialog: Cannot be used on non-native printers"); #endif diff --git a/src/widgets/doc/snippets/code/doc_src_styles.cpp b/src/widgets/doc/snippets/code/doc_src_styles.cpp index b10c875111..a70ed6b11d 100644 --- a/src/widgets/doc/snippets/code/doc_src_styles.cpp +++ b/src/widgets/doc/snippets/code/doc_src_styles.cpp @@ -81,7 +81,7 @@ state |= QStyle::State_MouseOver; if (widget->window()->isActiveWindow()) state |= QStyle::State_Active; -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC extern bool qt_mac_can_clickThrough(const QWidget *w); //qwidget_mac.cpp if (!(state & QStyle::State_Active) && !qt_mac_can_clickThrough(widget)) state &= ~QStyle::State_Enabled; diff --git a/src/widgets/doc/snippets/macmainwindow.mm b/src/widgets/doc/snippets/macmainwindow.mm index f74f8453c7..d848e6442d 100644 --- a/src/widgets/doc/snippets/macmainwindow.mm +++ b/src/widgets/doc/snippets/macmainwindow.mm @@ -41,7 +41,7 @@ #include -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC #include @@ -289,4 +289,4 @@ QAbstractItemModel *MacMainWindow::createDocumentModel() return model; } -#endif // Q_DEAD_CODE_FROM_QT4_MAC +#endif diff --git a/src/widgets/graphicsview/qgraphicsitem.cpp b/src/widgets/graphicsview/qgraphicsitem.cpp index 5492862287..6124796073 100644 --- a/src/widgets/graphicsview/qgraphicsitem.cpp +++ b/src/widgets/graphicsview/qgraphicsitem.cpp @@ -7492,7 +7492,7 @@ void QGraphicsItem::setInputMethodHints(Qt::InputMethodHints hints) */ void QGraphicsItem::updateMicroFocus() { -#if !defined(QT_NO_IM) && defined(Q_DEAD_CODE_FROM_QT4_X11) +#if !defined(QT_NO_IM) && 0 /* Used to be included in Qt4 for Q_WS_X11 */ if (QWidget *fw = QApplication::focusWidget()) { if (scene()) { for (int i = 0 ; i < scene()->views().count() ; ++i) { diff --git a/src/widgets/graphicsview/qgraphicsscene.cpp b/src/widgets/graphicsview/qgraphicsscene.cpp index 5b46eb35be..e6726285d9 100644 --- a/src/widgets/graphicsview/qgraphicsscene.cpp +++ b/src/widgets/graphicsview/qgraphicsscene.cpp @@ -4160,7 +4160,7 @@ void QGraphicsScene::wheelEvent(QGraphicsSceneWheelEvent *wheelEvent) wheelEvent->scenePos(), wheelEvent->widget()); -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC // On Mac, ignore the event if the first item under the mouse is not the last opened // popup (or one of its descendant) if (!d->popupWidgets.isEmpty() && !wheelCandidates.isEmpty() && wheelCandidates.first() != d->popupWidgets.back() && !d->popupWidgets.back()->isAncestorOf(wheelCandidates.first())) { @@ -4399,7 +4399,7 @@ void QGraphicsScenePrivate::drawItemHelper(QGraphicsItem *item, QPainter *painte // Render directly, using no cache. if (cacheMode == QGraphicsItem::NoCache -#ifdef Q_DEAD_CODE_FROM_QT4_X11 +#if 0 // Used to be included in Qt4 for Q_WS_X11 || !X11->use_xrender #endif ) { diff --git a/src/widgets/graphicsview/qgraphicsview.cpp b/src/widgets/graphicsview/qgraphicsview.cpp index 3f7d2d1cd1..41f5eddd99 100644 --- a/src/widgets/graphicsview/qgraphicsview.cpp +++ b/src/widgets/graphicsview/qgraphicsview.cpp @@ -3490,7 +3490,7 @@ void QGraphicsView::paintEvent(QPaintEvent *event) // Draw background if ((d->cacheMode & CacheBackground) -#ifdef Q_DEAD_CODE_FROM_QT4_X11 +#if 0 // Used to be included in Qt4 for Q_WS_X11 && X11->use_xrender #endif ) { @@ -3689,7 +3689,7 @@ void QGraphicsView::scrollContentsBy(int dx, int dy) d->updateLastCenterPoint(); if ((d->cacheMode & CacheBackground) -#ifdef Q_DEAD_CODE_FROM_QT4_X11 +#if 0 // Used to be included in Qt4 for Q_WS_X11 && X11->use_xrender #endif ) { diff --git a/src/widgets/graphicsview/qgraphicsview_p.h b/src/widgets/graphicsview/qgraphicsview_p.h index 9065650216..10103a1809 100644 --- a/src/widgets/graphicsview/qgraphicsview_p.h +++ b/src/widgets/graphicsview/qgraphicsview_p.h @@ -184,7 +184,7 @@ public: inline void dispatchPendingUpdateRequests() { -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC // QWidget::update() works slightly different on the Mac without the raster engine; // it's not part of our backing store so it needs special threatment. if (QApplicationPrivate::graphics_system_name != QLatin1String("raster")) { @@ -195,7 +195,7 @@ public: extern void qt_mac_dispatchPendingUpdateRequests(QWidget *); qt_mac_dispatchPendingUpdateRequests(viewport->window()); } else -#endif // !Q_DEAD_CODE_FROM_QT4_MAC +#endif { if (qt_widget_private(viewport)->paintOnScreen()) QCoreApplication::sendPostedEvents(viewport, QEvent::UpdateRequest); diff --git a/src/widgets/graphicsview/qgraphicswidget.cpp b/src/widgets/graphicsview/qgraphicswidget.cpp index e1ba3759e0..d153915ae6 100644 --- a/src/widgets/graphicsview/qgraphicswidget.cpp +++ b/src/widgets/graphicsview/qgraphicswidget.cpp @@ -708,7 +708,7 @@ void QGraphicsWidget::initStyleOption(QStyleOption *option) const option->state |= QStyle::State_Window; /* ### -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC extern bool qt_mac_can_clickThrough(const QGraphicsWidget *w); //qwidget_mac.cpp if (!(option->state & QStyle::State_Active) && !qt_mac_can_clickThrough(widget)) option->state &= ~QStyle::State_Enabled; diff --git a/src/widgets/graphicsview/qgraphicswidget_p.cpp b/src/widgets/graphicsview/qgraphicswidget_p.cpp index faf1a4c49a..4beb64a254 100644 --- a/src/widgets/graphicsview/qgraphicswidget_p.cpp +++ b/src/widgets/graphicsview/qgraphicswidget_p.cpp @@ -52,7 +52,7 @@ #include #include #include -#if defined(Q_DEAD_CODE_FROM_QT4_MAC) && !defined(QT_NO_STYLE_MAC) +#if 0 /* Used to be included in Qt4 for Q_WS_MAC */ && !defined(QT_NO_STYLE_MAC) # include #endif @@ -704,7 +704,7 @@ void QGraphicsWidgetPrivate::windowFrameHoverMoveEvent(QGraphicsSceneHoverEvent case Qt::TitleBarArea: windowData->buttonRect = q->style()->subControlRect( QStyle::CC_TitleBar, &bar, QStyle::SC_TitleBarCloseButton, 0); -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC // On mac we should hover if we are in the 'area' of the buttons windowData->buttonRect |= q->style()->subControlRect( QStyle::CC_TitleBar, &bar, QStyle::SC_TitleBarMinButton, 0); diff --git a/src/widgets/itemviews/qabstractitemview.cpp b/src/widgets/itemviews/qabstractitemview.cpp index fff09b46d0..6ecf5a664f 100644 --- a/src/widgets/itemviews/qabstractitemview.cpp +++ b/src/widgets/itemviews/qabstractitemview.cpp @@ -3698,7 +3698,7 @@ QStyleOptionViewItem QAbstractItemView::viewOptions() const option.state &= ~QStyle::State_MouseOver; option.font = font(); -#ifndef Q_DEAD_CODE_FROM_QT4_MAC +#if 1 // Used to be excluded in Qt4 for Q_WS_MAC // On mac the focus appearance follows window activation // not widget activation if (!hasFocus()) diff --git a/src/widgets/itemviews/qheaderview.cpp b/src/widgets/itemviews/qheaderview.cpp index 85bd3003e1..837383f016 100644 --- a/src/widgets/itemviews/qheaderview.cpp +++ b/src/widgets/itemviews/qheaderview.cpp @@ -2450,7 +2450,7 @@ void QHeaderView::mouseMoveEvent(QMouseEvent *e) if (pos < 0 && d->state != QHeaderViewPrivate::SelectSections) return; if (e->buttons() == Qt::NoButton) { -#if !defined(Q_DEAD_CODE_FROM_QT4_MAC) +#if 1 // Used to be excluded in Qt4 for Q_WS_MAC // Under Cocoa, when the mouse button is released, may include an extra // simulated mouse moved event. The state of the buttons when this event // is generated is already "no button" and the code below gets executed diff --git a/src/widgets/itemviews/qtreeview.cpp b/src/widgets/itemviews/qtreeview.cpp index cfe68d6b6a..2d1d1f43d0 100644 --- a/src/widgets/itemviews/qtreeview.cpp +++ b/src/widgets/itemviews/qtreeview.cpp @@ -2194,7 +2194,7 @@ QModelIndex QTreeView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifie return QModelIndex(); } int vi = -1; -#if defined(Q_DEAD_CODE_FROM_QT4_MAC) && !defined(QT_NO_STYLE_MAC) +#if 0 /* Used to be included in Qt4 for Q_WS_MAC */ && !defined(QT_NO_STYLE_MAC) // Selection behavior is slightly different on the Mac. if (d->selectionMode == QAbstractItemView::ExtendedSelection && d->selectionModel diff --git a/src/widgets/kernel/qapplication_p.h b/src/widgets/kernel/qapplication_p.h index dd0edc7c80..3bef773187 100644 --- a/src/widgets/kernel/qapplication_p.h +++ b/src/widgets/kernel/qapplication_p.h @@ -118,7 +118,7 @@ public: virtual bool shouldQuit() Q_DECL_OVERRIDE; bool tryCloseAllWindows() Q_DECL_OVERRIDE; -#if defined(Q_DEAD_CODE_FROM_QT4_X11) +#if 0 // Used to be included in Qt4 for Q_WS_X11 #ifndef QT_NO_SETTINGS static bool x11_apply_settings(); #endif @@ -138,7 +138,7 @@ public: static bool isBlockedByModal(QWidget *widget); static bool modalState(); static bool tryModalHelper(QWidget *widget, QWidget **rettop = 0); -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC static QWidget *tryModalHelper_sys(QWidget *top); bool canQuit(); #endif @@ -152,14 +152,14 @@ public: bool notify_helper(QObject *receiver, QEvent * e); void init( -#ifdef Q_DEAD_CODE_FROM_QT4_X11 +#if 0 // Used to be included in Qt4 for Q_WS_X11 Display *dpy = 0, Qt::HANDLE visual = 0, Qt::HANDLE cmap = 0 #endif ); void initialize(); void process_cmdline(); -#if defined(Q_DEAD_CODE_FROM_QT4_X11) +#if 0 // Used to be included in Qt4 for Q_WS_X11 static void x11_initialize_style(); #endif @@ -214,7 +214,7 @@ public: static void initializeWidgetFontHash(); static void setSystemFont(const QFont &font); -#if defined(Q_DEAD_CODE_FROM_QT4_X11) +#if 0 // Used to be included in Qt4 for Q_WS_X11 static void applyX11SpecificCommandLineArguments(QWidget *main_widget); #endif @@ -225,7 +225,7 @@ public: static Qt::NavigationMode navigationMode; #endif -#if defined(Q_DEAD_CODE_FROM_QT4_MAC) || defined(Q_DEAD_CODE_FROM_QT4_X11) +#if 0 /* Used to be included in Qt4 for Q_WS_MAC */ || 0 /* Used to be included in Qt4 for Q_WS_X11 */ void _q_alertTimeOut(); QHash alertTimerHash; #endif @@ -265,12 +265,12 @@ public: QGestureManager *gestureManager; QWidget *gestureWidget; #endif -#if defined(Q_DEAD_CODE_FROM_QT4_X11) || defined(Q_DEAD_CODE_FROM_QT4_WIN) +#if 0 /* Used to be included in Qt4 for Q_WS_X11 */ || 0 /* Used to be included in Qt4 for Q_WS_WIN */ QPixmap *move_cursor; QPixmap *copy_cursor; QPixmap *link_cursor; #endif -#if defined(Q_DEAD_CODE_FROM_QT4_WIN) +#if 0 // Used to be included in Qt4 for Q_WS_WIN QPixmap *ignore_cursor; #endif @@ -301,9 +301,9 @@ private: static bool isAlien(QWidget *); }; -#if defined(Q_DEAD_CODE_FROM_QT4_WIN) +#if 0 // Used to be included in Qt4 for Q_WS_WIN extern void qt_win_set_cursor(QWidget *, bool); -#elif defined(Q_DEAD_CODE_FROM_QT4_X11) +#elif 0 // Used to be included in Qt4 for Q_WS_X11 extern void qt_x11_enforce_cursor(QWidget *, bool); extern void qt_x11_enforce_cursor(QWidget *); #else diff --git a/src/widgets/kernel/qgesturemanager.cpp b/src/widgets/kernel/qgesturemanager.cpp index c901285d1a..2e5c2c53bd 100644 --- a/src/widgets/kernel/qgesturemanager.cpp +++ b/src/widgets/kernel/qgesturemanager.cpp @@ -52,7 +52,7 @@ #ifdef Q_OS_OSX #include "qmacgesturerecognizer_p.h" #endif -#if defined(Q_DEAD_CODE_FROM_QT4_WIN) && !defined(QT_NO_NATIVE_GESTURES) +#if 0 /* Used to be included in Qt4 for Q_WS_WIN */ && !defined(QT_NO_NATIVE_GESTURES) #include "qwinnativepangesturerecognizer_win_p.h" #endif @@ -100,7 +100,7 @@ QGestureManager::QGestureManager(QObject *parent) registerGestureRecognizer(new QSwipeGestureRecognizer); registerGestureRecognizer(new QTapGestureRecognizer); #endif -#if defined(Q_DEAD_CODE_FROM_QT4_WIN) +#if 0 // Used to be included in Qt4 for Q_WS_WIN #if !defined(QT_NO_NATIVE_GESTURES) if (QApplicationPrivate::HasTouchSupport) registerGestureRecognizer(new QWinNativePanGestureRecognizer); diff --git a/src/widgets/kernel/qt_widgets_pch.h b/src/widgets/kernel/qt_widgets_pch.h index f30202d89e..924a68d62e 100644 --- a/src/widgets/kernel/qt_widgets_pch.h +++ b/src/widgets/kernel/qt_widgets_pch.h @@ -50,7 +50,7 @@ #include -#ifdef Q_DEAD_CODE_FROM_QT4_WIN +#if 0 // Used to be included in Qt4 for Q_WS_WIN # define _POSIX_ # include # undef _POSIX_ diff --git a/src/widgets/kernel/qtooltip.cpp b/src/widgets/kernel/qtooltip.cpp index 78929d8cd5..a92dc2cbf7 100644 --- a/src/widgets/kernel/qtooltip.cpp +++ b/src/widgets/kernel/qtooltip.cpp @@ -36,7 +36,7 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC # include #endif @@ -56,7 +56,7 @@ #include #ifndef QT_NO_TOOLTIP -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC # include #include #endif @@ -284,7 +284,7 @@ void QTipLabel::timerEvent(QTimerEvent *e) || e->timerId() == expireTimer.timerId()){ hideTimer.stop(); expireTimer.stop(); -#if defined(Q_DEAD_CODE_FROM_QT4_MAC) && !defined(QT_NO_EFFECTS) +#if 0 /* Used to be included in Qt4 for Q_WS_MAC */ && !defined(QT_NO_EFFECTS) if (QApplication::isEffectEnabled(Qt::UI_FadeTooltip)){ // Fade out tip on mac (makes it invisible). // The tip will not be deleted until a new tip is shown. @@ -304,7 +304,7 @@ void QTipLabel::timerEvent(QTimerEvent *e) bool QTipLabel::eventFilter(QObject *o, QEvent *e) { switch (e->type()) { -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC case QEvent::KeyPress: case QEvent::KeyRelease: { int key = static_cast(e)->key(); @@ -386,7 +386,7 @@ void QTipLabel::placeTip(const QPoint &pos, QWidget *w) #endif //QT_NO_STYLE_STYLESHEET -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC // When in full screen mode, there is no Dock nor Menu so we can use // the whole screen for displaying the tooltip. However when not in // full screen mode we need to save space for the dock, so we use @@ -403,7 +403,7 @@ void QTipLabel::placeTip(const QPoint &pos, QWidget *w) QPoint p = pos; p += QPoint(2, -#ifdef Q_DEAD_CODE_FROM_QT4_WIN +#if 0 // Used to be included in Qt4 for Q_WS_WIN 21 #else 16 @@ -492,7 +492,7 @@ void QToolTip::showText(const QPoint &pos, const QString &text, QWidget *w, cons } if (!text.isEmpty()){ // no tip can be reused, create new tip: -#ifndef Q_DEAD_CODE_FROM_QT4_WIN +#if 1 // Used to be excluded in Qt4 for Q_WS_WIN new QTipLabel(text, w, msecDisplayTime); // sets QTipLabel::instance to itself #else // On windows, we can't use the widget as parent otherwise the window will be @@ -504,7 +504,7 @@ void QToolTip::showText(const QPoint &pos, const QString &text, QWidget *w, cons QTipLabel::instance->setObjectName(QLatin1String("qtooltip_label")); -#if !defined(QT_NO_EFFECTS) && !defined(Q_DEAD_CODE_FROM_QT4_MAC) +#if !defined(QT_NO_EFFECTS) && !0 /* Used to be included in Qt4 for Q_WS_MAC */ if (QApplication::isEffectEnabled(Qt::UI_FadeTooltip)) qFadeEffect(QTipLabel::instance); else if (QApplication::isEffectEnabled(Qt::UI_AnimateTooltip)) diff --git a/src/widgets/kernel/qwhatsthis.cpp b/src/widgets/kernel/qwhatsthis.cpp index 32fe5f5e64..6061af5f38 100644 --- a/src/widgets/kernel/qwhatsthis.cpp +++ b/src/widgets/kernel/qwhatsthis.cpp @@ -570,7 +570,7 @@ void QWhatsThisPrivate::say(QWidget * widget, const QString &text, int x, int y) // make a fresh widget, and set it up QWhatsThat *whatsThat = new QWhatsThat( text, -#if defined(Q_DEAD_CODE_FROM_QT4_X11) && !defined(QT_NO_CURSOR) +#if 0 /* Used to be included in Qt4 for Q_WS_X11 */ && !defined(QT_NO_CURSOR) QApplication::desktop()->screen(widget ? widget->x11Info().screen() : QCursor::x11Screen()), #else 0, @@ -583,11 +583,11 @@ void QWhatsThisPrivate::say(QWidget * widget, const QString &text, int x, int y) int scr = (widget ? QApplication::desktop()->screenNumber(widget) : -#if defined(Q_DEAD_CODE_FROM_QT4_X11) && !defined(QT_NO_CURSOR) +#if 0 /* Used to be included in Qt4 for Q_WS_X11 */ && !defined(QT_NO_CURSOR) QCursor::x11Screen() #else QApplication::desktop()->screenNumber(QPoint(x,y)) -#endif // Q_DEAD_CODE_FROM_QT4_X11 +#endif ); QRect screen = QApplication::desktop()->screenGeometry(scr); diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 51e1ef9aaf..cf52a21716 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -59,7 +59,7 @@ #ifndef QT_NO_ACCESSIBILITY # include "qaccessible.h" #endif -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC # include "qt_mac_p.h" # include "qt_cocoa_helpers_mac_p.h" # include "qmainwindow.h" @@ -85,7 +85,7 @@ #include #include #include -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC # include #endif #include @@ -118,7 +118,7 @@ QT_BEGIN_NAMESPACE static bool qt_enable_backingstore = true; -#ifdef Q_DEAD_CODE_FROM_QT4_X11 +#if 0 // Used to be included in Qt4 for Q_WS_X11 // for compatibility with Qt 4.0 Q_WIDGETS_EXPORT void qt_x11_set_global_double_buffer(bool enable) { @@ -126,7 +126,7 @@ Q_WIDGETS_EXPORT void qt_x11_set_global_double_buffer(bool enable) } #endif -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC bool qt_mac_clearDirtyOnWidgetInsideDrawWidget = false; #endif @@ -141,7 +141,7 @@ static inline bool hasBackingStoreSupport() return true; } -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC # define QT_NO_PAINT_DEBUG #endif @@ -288,13 +288,13 @@ QWidgetPrivate::QWidgetPrivate(int version) #if defined(Q_OS_WIN) , noPaintOnScreen(0) #endif -#if defined(Q_DEAD_CODE_FROM_QT4_X11) +#if 0 // Used to be included in Qt4 for Q_WS_X11 , picture(0) -#elif defined(Q_DEAD_CODE_FROM_QT4_WIN) +#elif 0 // Used to be included in Qt4 for Q_WS_WIN #ifndef QT_NO_GESTURES , nativeGesturePanEnabled(0) #endif -#elif defined(Q_DEAD_CODE_FROM_QT4_MAC) +#elif 0 // Used to be included in Qt4 for Q_WS_MAC , needWindowChange(0) , window_event(0) , qd_hd(0) @@ -317,7 +317,7 @@ QWidgetPrivate::QWidgetPrivate(int version) isWidget = true; memset(high_attributes, 0, sizeof(high_attributes)); -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC drawRectOriginalAdded = false; originalDrawMethod = true; changeMethods = false; @@ -326,7 +326,7 @@ QWidgetPrivate::QWidgetPrivate(int version) toolbar_ancestor = 0; flushRequested = false; touchEventsEnabled = false; -#endif // Q_DEAD_CODE_FROM_QT4_MAC +#endif #ifdef QWIDGET_EXTRA_DEBUG static int count = 0; qDebug() << "widgets" << ++count; @@ -1087,7 +1087,7 @@ void QWidgetPrivate::adjustFlags(Qt::WindowFlags &flags, QWidget *w) // Only enable this on non-Mac platforms. Since the old way of doing this would // interpret WindowSystemMenuHint as a close button and we can't change that behavior // we can't just add this in. -#ifndef Q_DEAD_CODE_FROM_QT4_MAC +#if 1 // Used to be excluded in Qt4 for Q_WS_MAC if ((flags & (Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint | Qt::WindowContextHelpButtonHint)) # ifdef Q_OS_WIN && type != Qt::Dialog // QTBUG-2027, allow for menu-less dialogs. @@ -1147,7 +1147,7 @@ void QWidgetPrivate::init(QWidget *parentWidget, Qt::WindowFlags f) } #endif -#if defined(Q_DEAD_CODE_FROM_QT4_X11) +#if 0 // Used to be included in Qt4 for Q_WS_X11 if (desktopWidget) { // make sure the widget is created on the same screen as the // programmer specified desktop widget @@ -1181,7 +1181,7 @@ void QWidgetPrivate::init(QWidget *parentWidget, Qt::WindowFlags f) mustHaveWindowHandle = 1; q->setAttribute(Qt::WA_NativeWindow); } -//#ifdef Q_DEAD_CODE_FROM_QT4_MAC +//#if 0 // Used to be included in Qt4 for Q_WS_MAC // q->setAttribute(Qt::WA_NativeWindow); //#endif @@ -1206,9 +1206,9 @@ void QWidgetPrivate::init(QWidget *parentWidget, Qt::WindowFlags f) setOpaque(q->isWindow() && background.style() != Qt::NoBrush && background.isOpaque()); } data.fnt = QFont(data.fnt, q); -#if defined(Q_DEAD_CODE_FROM_QT4_X11) +#if 0 // Used to be included in Qt4 for Q_WS_X11 data.fnt.x11SetScreen(xinfo.screen()); -#endif // Q_DEAD_CODE_FROM_QT4_X11 +#endif q->setAttribute(Qt::WA_PendingMoveEvent); q->setAttribute(Qt::WA_PendingResizeEvent); @@ -1225,7 +1225,7 @@ void QWidgetPrivate::init(QWidget *parentWidget, Qt::WindowFlags f) extraPaintEngine = 0; -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC // If we add a child to the unified toolbar, we have to redirect the painting. if (parentWidget && parentWidget->d_func() && parentWidget->d_func()->isInUnifiedToolbar) { if (parentWidget->d_func()->unifiedSurface) { @@ -1233,7 +1233,7 @@ void QWidgetPrivate::init(QWidget *parentWidget, Qt::WindowFlags f) parentWidget->d_func()->unifiedSurface->recursiveRedirect(toolbar, toolbar, toolbar->d_func()->toolbar_offset); } } -#endif // Q_DEAD_CODE_FROM_QT4_MAC +#endif } @@ -1323,14 +1323,14 @@ void QWidget::create(WId window, bool initializeWindow, bool destroyOldWindow) << "Alien?" << !testAttribute(Qt::WA_NativeWindow); #endif -#if defined (Q_DEAD_CODE_FROM_QT4_WIN) && !defined(QT_NO_DRAGANDDROP) +#if 0 /* Used to be included in Qt4 for Q_WS_WIN */ && !defined(QT_NO_DRAGANDDROP) // Unregister the dropsite (if already registered) before we // re-create the widget with a native window. if (testAttribute(Qt::WA_WState_Created) && !internalWinId() && testAttribute(Qt::WA_NativeWindow) && d->extra && d->extra->dropTarget) { d->registerDropSite(false); } -#endif // defined (Q_DEAD_CODE_FROM_QT4_WIN) && !defined(QT_NO_DRAGANDDROP) +#endif d->updateIsOpaque(); @@ -1630,7 +1630,7 @@ QWidget::~QWidget() } } -#if defined(Q_DEAD_CODE_FROM_QT4_WIN) || defined(Q_DEAD_CODE_FROM_QT4_X11)|| defined(Q_DEAD_CODE_FROM_QT4_MAC) +#if 0 /* Used to be included in Qt4 for Q_WS_WIN */ || 0 /* Used to be included in Qt4 for Q_WS_X11 */|| 0 /* Used to be included in Qt4 for Q_WS_MAC */ else if (!internalWinId() && isVisible()) { qApp->d_func()->sendSyntheticEnterLeave(this); } @@ -1677,7 +1677,7 @@ QWidget::~QWidget() d->blockSig = blocked; -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC // QCocoaView holds a pointer back to this widget. Clear it now // to make sure it's not followed later on. The lifetime of the // QCocoaView might exceed the lifetime of this widget in cases @@ -1728,7 +1728,7 @@ void QWidgetPrivate::setWinId(WId id) // set widget identifier const WId oldWinId = data.winid; data.winid = id; -#if defined(Q_DEAD_CODE_FROM_QT4_X11) +#if 0 // Used to be included in Qt4 for Q_WS_X11 hd = id; // X11: hd == ident #endif if (mapper && id && !userDesktopWidget) { @@ -1764,9 +1764,9 @@ void QWidgetPrivate::createTLExtra() x->window = 0; x->shareContext = 0; x->initialScreenIndex = -1; -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC x->wasMaximized = false; -#endif // Q_DEAD_CODE_FROM_QT4_MAC +#endif #ifdef QWIDGET_EXTRA_DEBUG static int count = 0; qDebug() << "tlextra" << ++count; @@ -2191,10 +2191,10 @@ void QWidgetPrivate::subtractOpaqueSiblings(QRegion &sourceRegion, bool *hasDirt if (disableSubtractOpaqueSiblings || q->isWindow()) return; -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC if (q->d_func()->isInUnifiedToolbar) return; -#endif // Q_DEAD_CODE_FROM_QT4_MAC +#endif QRect clipBoundingRect; bool dirtyClipBoundingRect = true; @@ -2328,7 +2328,7 @@ void QWidgetPrivate::updateIsOpaque() #endif //QT_NO_GRAPHICSEFFECT Q_Q(QWidget); -#ifdef Q_DEAD_CODE_FROM_QT4_X11 +#if 0 // Used to be included in Qt4 for Q_WS_X11 if (q->testAttribute(Qt::WA_X11OpenGLOverlay)) { setOpaque(false); return; @@ -2387,7 +2387,7 @@ static inline void fillRegion(QPainter *painter, const QRegion &rgn, const QBrus Q_ASSERT(painter); if (brush.style() == Qt::TexturePattern) { -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC // Optimize pattern filling on mac by using HITheme directly // when filling with the standard widget background. // Defined in qmacstyle_mac.cpp @@ -2399,7 +2399,7 @@ static inline void fillRegion(QPainter *painter, const QRegion &rgn, const QBrus painter->setClipRegion(rgn); painter->drawTiledPixmap(rect, brush.texture(), rect.topLeft()); } -#endif // Q_DEAD_CODE_FROM_QT4_MAC +#endif } else if (brush.gradient() && brush.gradient()->coordinateMode() == QGradient::ObjectBoundingMode) { @@ -2470,7 +2470,7 @@ void QWidgetPrivate::paintBackground(QPainter *painter, const QRegion &rgn, int visible widgets. */ -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC extern QPointer qt_button_down; #else extern QWidget *qt_button_down; @@ -2750,7 +2750,7 @@ void QWidget::setStyle(QStyle *style) } void QWidgetPrivate::setStyle_helper(QStyle *newStyle, bool propagate, bool -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC metalHack #endif ) @@ -2761,7 +2761,7 @@ void QWidgetPrivate::setStyle_helper(QStyle *newStyle, bool propagate, bool QPointer origStyle; #endif -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC // the metalhack boolean allows Qt/Mac to do a proper re-polish depending // on how the Qt::WA_MacBrushedMetal attribute is set. It is only ever // set when changing that attribute and passes the widget's CURRENT style. @@ -2781,12 +2781,12 @@ void QWidgetPrivate::setStyle_helper(QStyle *newStyle, bool propagate, bool if (q->windowType() != Qt::Desktop) { if (polished) { oldStyle->unpolish(q); -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC if (metalHack) macUpdateMetalAttribute(); #endif q->style()->polish(q); -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC } else if (metalHack) { macUpdateMetalAttribute(); #endif @@ -3151,7 +3151,7 @@ bool QWidget::isFullScreen() const */ void QWidget::showFullScreen() { -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC // If the unified toolbar is enabled, we have to disable it before going fullscreen. QMainWindow *mainWindow = qobject_cast(this); if (mainWindow && mainWindow->unifiedTitleAndToolBarOnMac()) { @@ -3159,7 +3159,7 @@ void QWidget::showFullScreen() QMainWindowLayout *mainLayout = qobject_cast(mainWindow->layout()); mainLayout->activateUnifiedToolbarAfterFullScreen = true; } -#endif // Q_DEAD_CODE_FROM_QT4_MAC +#endif ensurePolished(); setWindowState((windowState() & ~(Qt::WindowMinimized | Qt::WindowMaximized)) @@ -3187,7 +3187,7 @@ void QWidget::showMaximized() setWindowState((windowState() & ~(Qt::WindowMinimized | Qt::WindowFullScreen)) | Qt::WindowMaximized); -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC // If the unified toolbar was enabled before going fullscreen, we have to enable it back. QMainWindow *mainWindow = qobject_cast(this); if (mainWindow) @@ -3198,7 +3198,7 @@ void QWidget::showMaximized() mainLayout->activateUnifiedToolbarAfterFullScreen = false; } } -#endif // Q_DEAD_CODE_FROM_QT4_MAC +#endif setVisible(true); } @@ -3216,7 +3216,7 @@ void QWidget::showNormal() setWindowState(windowState() & ~(Qt::WindowMinimized | Qt::WindowMaximized | Qt::WindowFullScreen)); -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC // If the unified toolbar was enabled before going fullscreen, we have to enable it back. QMainWindow *mainWindow = qobject_cast(this); if (mainWindow) @@ -3227,7 +3227,7 @@ void QWidget::showNormal() mainLayout->activateUnifiedToolbarAfterFullScreen = false; } } -#endif // Q_DEAD_CODE_FROM_QT4_MAC +#endif setVisible(true); } @@ -3443,7 +3443,7 @@ void QWidgetPrivate::setEnabled_helper(bool enable) if (w && !w->testAttribute(attribute)) w->d_func()->setEnabled_helper(enable); } -#if defined(Q_DEAD_CODE_FROM_QT4_X11) +#if 0 // Used to be included in Qt4 for Q_WS_X11 if (q->testAttribute(Qt::WA_SetCursor) || q->isWindow()) { // enforce the windows behavior of clearing the cursor on // disabled widgets @@ -3457,7 +3457,7 @@ void QWidgetPrivate::setEnabled_helper(bool enable) qt_qpa_set_cursor(q, false); } #endif -#if defined(Q_DEAD_CODE_FROM_QT4_MAC) +#if 0 // Used to be included in Qt4 for Q_WS_MAC setEnabled_helper_sys(enable); #endif #ifndef QT_NO_IM @@ -4561,7 +4561,7 @@ const QPalette &QWidget::palette() const ) { data->pal.setCurrentColorGroup(QPalette::Active); } else { -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC extern bool qt_mac_can_clickThrough(const QWidget *); //qwidget_mac.cpp if (qt_mac_can_clickThrough(this)) data->pal.setCurrentColorGroup(QPalette::Active); @@ -4819,7 +4819,7 @@ void QWidgetPrivate::updateFont(const QFont &font) #endif data.fnt = QFont(font, q); -#if defined(Q_DEAD_CODE_FROM_QT4_X11) +#if 0 // Used to be included in Qt4 for Q_WS_X11 // make sure the font set on this widget is associated with the correct screen data.fnt.x11SetScreen(xinfo.screen()); #endif @@ -4992,7 +4992,7 @@ void QWidget::setCursor(const QCursor &cursor) { Q_D(QWidget); // On Mac we must set the cursor even if it is the ArrowCursor. -#if !defined(Q_DEAD_CODE_FROM_QT4_MAC) +#if 1 // Used to be excluded in Qt4 for Q_WS_MAC if (cursor.shape() != Qt::ArrowCursor || (d->extra && d->extra->curs)) #endif @@ -5424,7 +5424,7 @@ void QWidgetPrivate::render_helper(QPainter *painter, const QPoint &targetOffset Q_ASSERT(!toBePainted.isEmpty()); Q_Q(QWidget); -#ifndef Q_DEAD_CODE_FROM_QT4_MAC +#if 1 // Used to be excluded in Qt4 for Q_WS_MAC const QTransform originalTransform = painter->worldTransform(); const bool useDeviceCoordinates = originalTransform.isScaling(); if (!useDeviceCoordinates) { @@ -5451,7 +5451,7 @@ void QWidgetPrivate::render_helper(QPainter *painter, const QPoint &targetOffset if (restore) painter->setRenderHints(QPainter::SmoothPixmapTransform, false); -#ifndef Q_DEAD_CODE_FROM_QT4_MAC +#if 1 // Used to be excluded in Qt4 for Q_WS_MAC } else { // Render via a pixmap in device coordinates (to avoid pixmap scaling). QTransform transform = originalTransform; @@ -5560,7 +5560,7 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP if (paintEngine) { setRedirected(pdev, -offset); -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC // (Alien support) Special case for Mac when redirecting: If the paint device // is of the Widget type we need to set WA_WState_InPaintEvent since painting // outside the paint event is not supported on QWidgets. The attributeis @@ -5646,7 +5646,7 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP //restore if (paintEngine) { -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC if (pdev->devType() == QInternal::Widget) static_cast(pdev)->setAttribute(Qt::WA_WState_InPaintEvent, false); #endif @@ -5720,7 +5720,7 @@ void QWidgetPrivate::render(QPaintDevice *target, const QPoint &targetOffset, if (paintRegion.isEmpty()) return; -#ifndef Q_DEAD_CODE_FROM_QT4_MAC +#if 1 // Used to be excluded in Qt4 for Q_WS_MAC QPainter *oldSharedPainter = inRenderWithPainter ? sharedPainter() : 0; // Use the target's shared painter if set (typically set when doing @@ -6501,7 +6501,7 @@ void QWidget::setFocus(Qt::FocusReason reason) f = f->d_func()->extra->focus_proxy; if (QApplication::focusWidget() == f -#if defined(Q_DEAD_CODE_FROM_QT4_WIN) +#if 0 // Used to be included in Qt4 for Q_WS_WIN && GetFocus() == f->internalWinId() #endif ) @@ -6686,7 +6686,7 @@ void QWidget::clearFocus() if (hasFocus()) { // Update proxy state QApplicationPrivate::setFocusWidget(0, Qt::OtherFocusReason); -#if defined(Q_DEAD_CODE_FROM_QT4_WIN) +#if 0 // Used to be included in Qt4 for Q_WS_WIN if (!(windowType() == Qt::Popup) && GetFocus() == internalWinId()) SetFocus(0); else @@ -7318,7 +7318,7 @@ void QWidgetPrivate::setGeometry_sys(int x, int y, int w, int h, bool isMove) */ QByteArray QWidget::saveGeometry() const { -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC // We check if the window was maximized during this invocation. If so, we need to record the // starting position as 0,0. Q_D(const QWidget); @@ -7329,7 +7329,7 @@ QByteArray QWidget::saveGeometry() const newFramePosition.moveTo(0, 0); newNormalPosition.moveTo(0, 0); } -#endif // Q_DEAD_CODE_FROM_QT4_MAC +#endif QByteArray array; QDataStream stream(&array, QIODevice::WriteOnly); stream.setVersion(QDataStream::Qt_4_0); @@ -7343,13 +7343,13 @@ QByteArray QWidget::saveGeometry() const stream << magicNumber << majorVersion << minorVersion -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC << newFramePosition << newNormalPosition #else << frameGeometry() << normalGeometry() -#endif // Q_DEAD_CODE_FROM_QT4_MAC +#endif << qint32(screenNumber) << quint8(windowState() & Qt::WindowMaximized) << quint8(windowState() & Qt::WindowFullScreen) @@ -7457,7 +7457,7 @@ bool QWidget::restoreGeometry(const QByteArray &geometry) // - The title bar is outside the available geometry. // - (Mac only) The window is higher than the available geometry. It must // be possible to bring the size grip on screen by moving the window. -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC restoredFrameGeometry.setHeight(qMin(restoredFrameGeometry.height(), availableGeometry.height())); restoredNormalGeometry.setHeight(qMin(restoredNormalGeometry.height(), availableGeometry.height() - frameHeight)); #endif @@ -7506,7 +7506,7 @@ bool QWidget::restoreGeometry(const QByteArray &geometry) d_func()->topData()->normalGeometry = restoredNormalGeometry; } else { QPoint offset; -#ifdef Q_DEAD_CODE_FROM_QT4_X11 +#if 0 // Used to be included in Qt4 for Q_WS_X11 if (isFullScreen()) offset = d_func()->topData()->fullScreenOffset; #endif @@ -7904,7 +7904,7 @@ void QWidgetPrivate::show_helper() // On Windows, show the popup now so that our own focus handling // stores the correct old focus widget even if it's stolen in the // showevent -#if defined(Q_DEAD_CODE_FROM_QT4_WIN) || defined(Q_DEAD_CODE_FROM_QT4_MAC) +#if 0 /* Used to be included in Qt4 for Q_WS_WIN */ || 0 /* Used to be included in Qt4 for Q_WS_MAC */ if (!isEmbedded && q->windowType() == Qt::Popup) qApp->d_func()->openPopup(q); #endif @@ -8033,7 +8033,7 @@ void QWidgetPrivate::hide_helper() if (!isEmbedded && (q->windowType() == Qt::Popup)) qApp->d_func()->closePopup(q); -#if defined(Q_DEAD_CODE_FROM_QT4_WIN) +#if 0 // Used to be included in Qt4 for Q_WS_WIN if (q->isWindow() && !(q->windowType() == Qt::Popup) && q->parentWidget() && !q->parentWidget()->isHidden() && q->isActiveWindow()) q->parentWidget()->activateWindow(); // Activate parent @@ -8217,7 +8217,7 @@ void QWidget::setVisible(bool visible) } else { // hide if (testAttribute(Qt::WA_WState_ExplicitShowHide) && testAttribute(Qt::WA_WState_Hidden)) return; -#if defined(Q_DEAD_CODE_FROM_QT4_WIN) +#if 0 // Used to be included in Qt4 for Q_WS_WIN // reset WS_DISABLED style in a Blocked window if(isWindow() && testAttribute(Qt::WA_WState_Created) && QApplicationPrivate::isBlockedByModal(this)) @@ -8302,7 +8302,7 @@ void QWidgetPrivate::hideChildren(bool spontaneous) QWidget *widget = qobject_cast(childList.at(i)); if (!widget || widget->isWindow() || widget->testAttribute(Qt::WA_WState_Hidden)) continue; -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC // Before doing anything we need to make sure that we don't leave anything in a non-consistent state. // When hiding a widget we need to make sure that no mouse_down events are active, because // the mouse_up event will never be received by a hidden widget or one of its descendants. @@ -8318,7 +8318,7 @@ void QWidgetPrivate::hideChildren(bool spontaneous) // supposed to trigger because it is not visible. if(widget == qt_button_down) qt_button_down = 0; -#endif // Q_DEAD_CODE_FROM_QT4_MAC +#endif if (spontaneous) widget->setAttribute(Qt::WA_Mapped, false); else @@ -8553,7 +8553,7 @@ QSize QWidgetPrivate::adjustedSize() const s.setWidth(qMax(s.width(), 200)); if (exp & Qt::Vertical) s.setHeight(qMax(s.height(), 100)); -#if defined(Q_DEAD_CODE_FROM_QT4_X11) +#if 0 // Used to be included in Qt4 for Q_WS_X11 QRect screen = QApplication::desktop()->screenGeometry(q->x11Info().screen()); #else // all others QRect screen = QApplication::desktop()->screenGeometry(q->pos()); @@ -8682,7 +8682,7 @@ bool QWidget::isAncestorOf(const QWidget *child) const return false; } -#if defined(Q_DEAD_CODE_FROM_QT4_WIN) +#if 0 // Used to be included in Qt4 for Q_WS_WIN inline void setDisabledStyle(QWidget *w, bool setStyle) { // set/reset WS_DISABLED style. @@ -9114,7 +9114,7 @@ bool QWidget::event(QEvent *event) } } } -#if defined(Q_DEAD_CODE_FROM_QT4_WIN) +#if 0 // Used to be included in Qt4 for Q_WS_WIN setDisabledStyle(this, (event->type() == QEvent::WindowBlocked)); #endif break; @@ -9141,7 +9141,7 @@ bool QWidget::event(QEvent *event) case QEvent::EmbeddingControl: d->topData()->frameStrut.setCoords(0 ,0, 0, 0); data->fstrut_dirty = false; -#if defined(Q_DEAD_CODE_FROM_QT4_WIN) || defined(Q_DEAD_CODE_FROM_QT4_X11) +#if 0 /* Used to be included in Qt4 for Q_WS_WIN */ || 0 /* Used to be included in Qt4 for Q_WS_X11 */ d->topData()->embedded = 1; #endif break; @@ -9166,7 +9166,7 @@ bool QWidget::event(QEvent *event) } break; } -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC case QEvent::MacGLWindowChange: d->needWindowChange = false; break; @@ -9280,7 +9280,7 @@ void QWidget::changeEvent(QEvent * event) case QEvent::MacSizeChange: updateGeometry(); break; -#elif defined Q_DEAD_CODE_FROM_QT4_MAC +#elif 0 // Used to be included in Qt4 for Q_WS_MAC case QEvent::ToolTipChange: case QEvent::MouseTrackingChange: qt_mac_update_mouseTracking(this); @@ -10561,7 +10561,7 @@ void QWidget::setParent(QWidget *parent, Qt::WindowFlags f) // (f & Qt::MSWindowsOwnDC) clause (which is set on QGLWidgets on all // platforms). if (newParent -#if defined(Q_DEAD_CODE_FROM_QT4_WIN) || defined(QT_OPENGL_ES) +#if 0 /* Used to be included in Qt4 for Q_WS_WIN */ || defined(QT_OPENGL_ES) || (f & Qt::MSWindowsOwnDC) #endif ) { @@ -10581,7 +10581,7 @@ void QWidget::setParent(QWidget *parent, Qt::WindowFlags f) } //### already hidden above ---> must probably do something smart on the mac -// #ifdef Q_DEAD_CODE_FROM_QT4_MAC +// #if 0 // Used to be included in Qt4 for Q_WS_MAC // extern bool qt_mac_is_macdrawer(const QWidget *); //qwidget_mac.cpp // if(!qt_mac_is_macdrawer(q)) //special case // q->setAttribute(Qt::WA_WState_Hidden); @@ -11109,7 +11109,7 @@ void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on) d->receiveChildEvents = !on; break; case Qt::WA_MacBrushedMetal: -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC d->setStyle_helper(style(), false, true); // Make sure things get unpolished/polished correctly. // fall through since changing the metal attribute affects the opaque size grip. case Qt::WA_MacOpaqueSizeGrip: @@ -11126,7 +11126,7 @@ void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on) break; #endif case Qt::WA_MacAlwaysShowToolWindow: -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC d->macUpdateHideOnSuspend(); #endif break; @@ -11203,7 +11203,7 @@ void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on) } case Qt::WA_PaintOnScreen: d->updateIsOpaque(); -#if defined(Q_DEAD_CODE_FROM_QT4_WIN) || defined(Q_DEAD_CODE_FROM_QT4_X11) || defined(Q_DEAD_CODE_FROM_QT4_MAC) +#if 0 /* Used to be included in Qt4 for Q_WS_WIN */ || 0 /* Used to be included in Qt4 for Q_WS_X11 */ || 0 /* Used to be included in Qt4 for Q_WS_MAC */ // Recreate the widget if it's already created as an alien widget and // WA_PaintOnScreen is enabled. Paint on screen widgets must have win id. // So must their children. @@ -11223,7 +11223,7 @@ void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on) d->updateSystemBackground(); break; case Qt::WA_TransparentForMouseEvents: -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC d->macUpdateIgnoreMouseEvents(); #endif break; @@ -11242,7 +11242,7 @@ void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on) d->resolveFont(); d->resolveLocale(); break; -#ifdef Q_DEAD_CODE_FROM_QT4_X11 +#if 0 // Used to be included in Qt4 for Q_WS_X11 case Qt::WA_NoX11EventCompression: if (!d->extra) d->createExtra(); @@ -11299,7 +11299,7 @@ void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on) break; case Qt::WA_AcceptTouchEvents: -#if defined(Q_DEAD_CODE_FROM_QT4_WIN) || defined(Q_DEAD_CODE_FROM_QT4_MAC) +#if 0 /* Used to be included in Qt4 for Q_WS_WIN */ || 0 /* Used to be included in Qt4 for Q_WS_MAC */ if (on) d->registerTouchWindow(); #endif @@ -11918,7 +11918,7 @@ QRect QWidgetPrivate::frameStrut() const } if (data.fstrut_dirty -#ifndef Q_DEAD_CODE_FROM_QT4_WIN +#if 1 // Used to be excluded in Qt4 for Q_WS_WIN // ### Fix properly for 4.3 && q->isVisible() #endif @@ -12854,7 +12854,7 @@ void QWidget::setMask(const QRegion &newMask) d->extra->mask = newMask; d->extra->hasMask = !newMask.isEmpty(); -#ifndef Q_DEAD_CODE_FROM_QT4_MAC +#if 1 // Used to be excluded in Qt4 for Q_WS_MAC if (!testAttribute(Qt::WA_WState_Created)) return; #endif diff --git a/src/widgets/kernel/qwidget.h b/src/widgets/kernel/qwidget.h index bca89fe2c5..5edf2c62da 100644 --- a/src/widgets/kernel/qwidget.h +++ b/src/widgets/kernel/qwidget.h @@ -570,12 +570,12 @@ public: inline QWidget *childAt(int x, int y) const; QWidget *childAt(const QPoint &p) const; -#if defined(Q_DEAD_CODE_FROM_QT4_X11) +#if 0 // Used to be included in Qt4 for Q_WS_X11 const QX11Info &x11Info() const; Qt::HANDLE x11PictureHandle() const; #endif -#if defined(Q_DEAD_CODE_FROM_QT4_MAC) +#if 0 // Used to be included in Qt4 for Q_WS_MAC Qt::HANDLE macQDHandle() const; Qt::HANDLE macCGHandle() const; #endif diff --git a/src/widgets/kernel/qwidget_p.h b/src/widgets/kernel/qwidget_p.h index 3e57f9de41..2720c0dc31 100644 --- a/src/widgets/kernel/qwidget_p.h +++ b/src/widgets/kernel/qwidget_p.h @@ -189,7 +189,7 @@ struct QTLWExtra { uint embedded : 1; // *************************** Platform specific values (bit fields first) ********** -#if defined(Q_DEAD_CODE_FROM_QT4_X11) // <----------------------------------------------------------- X11 +#if 0 /* Used to be included in Qt4 for Q_WS_X11 */ // <----------------------------------------------------------- X11 uint spont_unmapped: 1; // window was spontaneously unmapped uint dnd : 1; // DND properties installed uint validWMState : 1; // is WM_STATE valid? @@ -203,11 +203,11 @@ struct QTLWExtra { qint32 newCounterValueHi; quint32 newCounterValueLo; #endif -#elif defined(Q_DEAD_CODE_FROM_QT4_WIN) // <--------------------------------------------------------- WIN +#elif 0 /* Used to be included in Qt4 for Q_WS_WIN */ // <--------------------------------------------------------- WIN uint hotkeyRegistered: 1; // Hot key from the STARTUPINFO has been registered. HICON winIconBig; // internal big Windows icon HICON winIconSmall; // internal small Windows icon -#elif defined(Q_DEAD_CODE_FROM_QT4_MAC) // <--------------------------------------------------------- MAC +#elif 0 /* Used to be included in Qt4 for Q_WS_MAC */ // <--------------------------------------------------------- MAC uint resizer : 4; uint isSetGeometry : 1; uint isMove : 1; @@ -262,15 +262,15 @@ struct QWExtra { uint hasWindowContainer : 1; // *************************** Platform specific values (bit fields first) ********** -#if defined(Q_DEAD_CODE_FROM_QT4_WIN) // <----------------------------------------------------------- WIN +#if 0 /* Used to be included in Qt4 for Q_WS_WIN */ // <----------------------------------------------------------- WIN #ifndef QT_NO_DRAGANDDROP QOleDropTarget *dropTarget; // drop target QList > oleDropWidgets; #endif -#elif defined(Q_DEAD_CODE_FROM_QT4_X11) // <--------------------------------------------------------- X11 +#elif 0 /* Used to be included in Qt4 for Q_WS_X11 */ // <--------------------------------------------------------- X11 uint compress_events : 1; WId xDndProxy; // XDND forwarding to embedded windows -#elif defined(Q_DEAD_CODE_FROM_QT4_MAC) // <------------------------------------------------------ MAC +#elif 0 /* Used to be included in Qt4 for Q_WS_MAC */ // <------------------------------------------------------ MAC // Cocoa Mask stuff QImage maskBits; CGImageRef imageMask; @@ -761,7 +761,7 @@ public: #if defined(Q_OS_WIN) uint noPaintOnScreen : 1; // see qwidget.cpp ::paintEngine() #endif -#if defined(Q_DEAD_CODE_FROM_QT4_X11) // <----------------------------------------------------------- X11 +#if 0 /* Used to be included in Qt4 for Q_WS_X11 */ // <----------------------------------------------------------- X11 Qt::HANDLE picture; static QWidget *mouseGrabber; static QWidget *keyboardGrabber; @@ -773,7 +773,7 @@ public: void updateX11AcceptFocus(); QPoint mapToGlobal(const QPoint &pos) const; QPoint mapFromGlobal(const QPoint &pos) const; -#elif defined(Q_DEAD_CODE_FROM_QT4_WIN) // <--------------------------------------------------------- WIN +#elif 0 /* Used to be included in Qt4 for Q_WS_WIN */ // <--------------------------------------------------------- WIN #ifndef QT_NO_GESTURES uint nativeGesturePanEnabled : 1; #endif @@ -789,7 +789,7 @@ public: void winSetupGestures(); #elif defined(Q_OS_MAC) // <--------------------------------------------------------- MAC void macUpdateSizeAttribute(); -#elif defined(Q_DEAD_CODE_FROM_QT4_MAC) // <--------------------------------------------------------- MAC (old stuff) +#elif 0 /* Used to be included in Qt4 for Q_WS_MAC */ // <--------------------------------------------------------- MAC (old stuff) // This is new stuff uint needWindowChange : 1; diff --git a/src/widgets/kernel/qwidgetbackingstore.cpp b/src/widgets/kernel/qwidgetbackingstore.cpp index 81fbe49a43..a10c88308c 100644 --- a/src/widgets/kernel/qwidgetbackingstore.cpp +++ b/src/widgets/kernel/qwidgetbackingstore.cpp @@ -699,7 +699,7 @@ void QWidgetBackingStore::markDirtyOnScreen(const QRegion ®ion, QWidget *widg if (!widget || widget->d_func()->paintOnScreen() || region.isEmpty()) return; -#if defined(Q_DEAD_CODE_FROM_QT4_MAC) +#if 0 // Used to be included in Qt4 for Q_WS_MAC if (!widget->testAttribute(Qt::WA_WState_InPaintEvent)) dirtyOnScreen += region.translated(topLevelOffset); return; @@ -1624,7 +1624,7 @@ void QWidgetPrivate::repaint_sys(const QRegion &rgn) && (usesDoubleBufferedGLContext || q->autoFillBackground()); QRegion toBePainted(noPartialUpdateSupport ? q->rect() : rgn); -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC // No difference between update() and repaint() on the Mac. update_sys(toBePainted); return; diff --git a/src/widgets/styles/qmacstyle_mac_p.h b/src/widgets/styles/qmacstyle_mac_p.h index fdc22794b4..459784c538 100644 --- a/src/widgets/styles/qmacstyle_mac_p.h +++ b/src/widgets/styles/qmacstyle_mac_p.h @@ -134,7 +134,7 @@ private: friend bool qt_mac_buttonIsRenderedFlat(const QPushButton *pushButton, const QStyleOptionButton *option); }; -#endif // Q_DEAD_CODE_FROM_QT4_MAC +#endif QT_END_NAMESPACE diff --git a/src/widgets/styles/qpixmapstyle.cpp b/src/widgets/styles/qpixmapstyle.cpp index ee5fd704dc..b51860045d 100644 --- a/src/widgets/styles/qpixmapstyle.cpp +++ b/src/widgets/styles/qpixmapstyle.cpp @@ -108,7 +108,7 @@ QPixmapStyle::~QPixmapStyle() void QPixmapStyle::polish(QApplication *application) { QCommonStyle::polish(application); -#if defined(Q_DEAD_CODE_FROM_QT4_WIN) +#if 0 // Used to be included in Qt4 for Q_WS_WIN QApplication::setEffectEnabled(Qt::UI_AnimateCombo, false); #endif } @@ -170,7 +170,7 @@ void QPixmapStyle::polish(QWidget *widget) frame->setContentsMargins(pix.margins.left(), desc.margins.top(), pix.margins.right(), desc.margins.bottom()); frame->setAttribute(Qt::WA_TranslucentBackground); -#ifdef Q_DEAD_CODE_FROM_QT4_WIN +#if 0 // Used to be included in Qt4 for Q_WS_WIN // FramelessWindowHint is needed on windows to make // WA_TranslucentBackground work properly frame->setWindowFlags(widget->windowFlags() | Qt::FramelessWindowHint); diff --git a/src/widgets/styles/qstylefactory.cpp b/src/widgets/styles/qstylefactory.cpp index bb849c148f..09cccff4e8 100644 --- a/src/widgets/styles/qstylefactory.cpp +++ b/src/widgets/styles/qstylefactory.cpp @@ -131,7 +131,7 @@ QStyle *QStyleFactory::create(const QString& key) #ifndef QT_NO_STYLE_MAC if (style.startsWith(QLatin1String("macintosh"))) { ret = new QMacStyle; -# ifdef Q_DEAD_CODE_FROM_QT4_MAC +# if 0 // Used to be included in Qt4 for Q_WS_MAC if (style == QLatin1String("macintosh")) style += QLatin1String(" (aqua)"); # endif @@ -184,7 +184,7 @@ QStringList QStyleFactory::keys() #endif #ifndef QT_NO_STYLE_MAC QString mstyle = QLatin1String("Macintosh"); -# ifdef Q_DEAD_CODE_FROM_QT4_MAC +# if 0 // Used to be included in Qt4 for Q_WS_MAC mstyle += QLatin1String(" (aqua)"); # endif if (!list.contains(mstyle)) diff --git a/src/widgets/styles/qstyleoption.cpp b/src/widgets/styles/qstyleoption.cpp index 71cf2fb267..83739655af 100644 --- a/src/widgets/styles/qstyleoption.cpp +++ b/src/widgets/styles/qstyleoption.cpp @@ -199,7 +199,7 @@ void QStyleOption::init(const QWidget *widget) state |= QStyle::State_Active; if (widget->isWindow()) state |= QStyle::State_Window; -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC extern bool qt_mac_can_clickThrough(const QWidget *w); //qwidget_mac.cpp if (!(state & QStyle::State_Active) && !qt_mac_can_clickThrough(widget)) state &= ~QStyle::State_Enabled; diff --git a/src/widgets/styles/qstylesheetstyle.cpp b/src/widgets/styles/qstylesheetstyle.cpp index b214dae154..8e77ae0e44 100644 --- a/src/widgets/styles/qstylesheetstyle.cpp +++ b/src/widgets/styles/qstylesheetstyle.cpp @@ -5045,7 +5045,7 @@ QSize QStyleSheetStyle::sizeFromContents(ContentsType ct, const QStyleOption *op sz = csz + QSize(vertical ? 0 : spaceForIcon, vertical ? spaceForIcon : 0); return subRule.boxSize(subRule.adjustSize(sz)); } -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC if (baseStyle()->inherits("QMacStyle")) { //adjust the size after the call to the style because the mac style ignore the size arguments anyway. //this might cause the (max-){width,height} property to include the native style border while they should not. diff --git a/src/widgets/util/qflickgesture.cpp b/src/widgets/util/qflickgesture.cpp index 57db9ff7fc..10e92e04e1 100644 --- a/src/widgets/util/qflickgesture.cpp +++ b/src/widgets/util/qflickgesture.cpp @@ -460,7 +460,7 @@ QGestureRecognizer::Result QFlickGestureRecognizer::recognize(QGesture *state, } break; -#if defined(Q_DEAD_CODE_FROM_QT4_MAC) +#if 0 // Used to be included in Qt4 for Q_WS_MAC // the only way to distinguish between real mouse wheels and wheel // events generated by the native 2 finger swipe gesture is to listen // for these events (according to Apple's Cocoa Event-Handling Guide) diff --git a/src/widgets/util/qscroller.cpp b/src/widgets/util/qscroller.cpp index 9973940c16..a348327c92 100644 --- a/src/widgets/util/qscroller.cpp +++ b/src/widgets/util/qscroller.cpp @@ -1011,12 +1011,12 @@ bool QScroller::handleInput(Input input, const QPointF &position, qint64 timesta return false; } -#if !defined(Q_DEAD_CODE_FROM_QT4_MAC) +#if 1 // Used to be excluded in Qt4 for Q_WS_MAC // the Mac version is implemented in qscroller_mac.mm QPointF QScrollerPrivate::realDpi(int screen) const { -# if defined(Q_DEAD_CODE_FROM_QT4_X11) && !defined(QT_NO_XRANDR) +# if 0 /* Used to be included in Qt4 for Q_WS_X11 */ && !defined(QT_NO_XRANDR) if (X11 && X11->use_xrandr && X11->ptrXRRSizes && X11->ptrXRRRootToScreen) { int nsizes = 0; // QDesktopWidget is based on Xinerama screens, which do not always @@ -1042,7 +1042,7 @@ QPointF QScrollerPrivate::realDpi(int screen) const return QPointF(w->physicalDpiX(), w->physicalDpiY()); } -#endif // !Q_DEAD_CODE_FROM_QT4_MAC +#endif /*! \internal diff --git a/src/widgets/util/qscroller_mac.mm b/src/widgets/util/qscroller_mac.mm index 31316f5518..6dbb483089 100644 --- a/src/widgets/util/qscroller_mac.mm +++ b/src/widgets/util/qscroller_mac.mm @@ -39,7 +39,7 @@ #include -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC #import diff --git a/src/widgets/util/qscrollerproperties.cpp b/src/widgets/util/qscrollerproperties.cpp index 35e1be15db..c26fba2cd3 100644 --- a/src/widgets/util/qscrollerproperties.cpp +++ b/src/widgets/util/qscrollerproperties.cpp @@ -40,7 +40,7 @@ #include #include #include -#ifdef Q_DEAD_CODE_FROM_QT4_WIN +#if 0 // Used to be included in Qt4 for Q_WS_WIN # include #endif @@ -73,7 +73,7 @@ QScrollerPropertiesPrivate *QScrollerPropertiesPrivate::defaults() spp.overshootDragDistanceFactor = qreal(1); spp.overshootScrollDistanceFactor = qreal(0.5); spp.overshootScrollTime = qreal(0.7); -# ifdef Q_DEAD_CODE_FROM_QT4_WIN +# if 0 // Used to be included in Qt4 for Q_WS_WIN if (QLibrary::resolve(QLatin1String("UxTheme"), "BeginPanningFeedback")) spp.overshootScrollTime = qreal(0.35); # endif diff --git a/src/widgets/util/qsystemtrayicon.cpp b/src/widgets/util/qsystemtrayicon.cpp index 2a418167f1..224ffeb6e2 100644 --- a/src/widgets/util/qsystemtrayicon.cpp +++ b/src/widgets/util/qsystemtrayicon.cpp @@ -565,7 +565,7 @@ void QBalloonTip::balloon(const QPoint& pos, int msecs, bool showArrow) } QPainterPath path; -#if defined(QT_NO_XSHAPE) && defined(Q_DEAD_CODE_FROM_QT4_X11) +#if defined(QT_NO_XSHAPE) && 0 /* Used to be included in Qt4 for Q_WS_X11 */ // XShape is required for setting the mask, so we just // draw an ugly square when its not available path.moveTo(0, 0); diff --git a/src/widgets/widgets/qabstractscrollarea.cpp b/src/widgets/widgets/qabstractscrollarea.cpp index 2587a7a03b..5b31e4467f 100644 --- a/src/widgets/widgets/qabstractscrollarea.cpp +++ b/src/widgets/widgets/qabstractscrollarea.cpp @@ -60,7 +60,7 @@ #include -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC #include #include #endif @@ -168,7 +168,7 @@ QAbstractScrollAreaPrivate::QAbstractScrollAreaPrivate() shownOnce(false), inResize(false), sizeAdjustPolicy(QAbstractScrollArea::AdjustIgnored), viewport(0), cornerWidget(0), left(0), top(0), right(0), bottom(0), xoffset(0), yoffset(0), viewportFilter(0) -#ifdef Q_DEAD_CODE_FROM_QT4_WIN +#if 0 // Used to be included in Qt4 for Q_WS_WIN , singleFingerPanEnabled(false) #endif { @@ -321,7 +321,7 @@ void QAbstractScrollAreaPrivate::init() #endif } -#ifdef Q_DEAD_CODE_FROM_QT4_WIN +#if 0 // Used to be included in Qt4 for Q_WS_WIN void QAbstractScrollAreaPrivate::setSingleFingerPanEnabled(bool on) { singleFingerPanEnabled = on; @@ -329,7 +329,7 @@ void QAbstractScrollAreaPrivate::setSingleFingerPanEnabled(bool on) if (dd) dd->winSetupGestures(); } -#endif // Q_DEAD_CODE_FROM_QT4_WIN +#endif void QAbstractScrollAreaPrivate::layoutChildren() { @@ -350,7 +350,7 @@ void QAbstractScrollAreaPrivate::layoutChildren() const int hscrollOverlap = hbar->style()->pixelMetric(QStyle::PM_ScrollView_ScrollBarOverlap, &opt, hbar); const int vscrollOverlap = vbar->style()->pixelMetric(QStyle::PM_ScrollView_ScrollBarOverlap, &opt, vbar); -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC QWidget * const window = q->window(); // Use small scroll bars for tool windows, to match the native size grip. @@ -393,7 +393,7 @@ void QAbstractScrollAreaPrivate::layoutChildren() // If the scroll bars are at the very right and bottom of the window we // move their positions to be aligned with the size grip. -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC // Check if a native sizegrip is present. bool hasMacReverseSizeGrip = false; bool hasMacSizeGrip = false; @@ -446,7 +446,7 @@ void QAbstractScrollAreaPrivate::layoutChildren() if (hasCornerWidget && ((needv && vscrollOverlap == 0) || (needh && hscrollOverlap == 0))) cornerOffset = extPoint; -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC // Also move the scroll bars if they are covered by the native Mac size grip. if (hasMacSizeGrip) cornerOffset = extPoint; @@ -463,7 +463,7 @@ void QAbstractScrollAreaPrivate::layoutChildren() else cornerPaintingRect = QRect(); -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC if (hasMacReverseSizeGrip) reverseCornerPaintingRect = QRect(controlsRect.bottomRight() + QPoint(1, 1) - extPoint, extSize); else @@ -488,7 +488,7 @@ void QAbstractScrollAreaPrivate::layoutChildren() if (needh) { QRect horizontalScrollBarRect(QPoint(controlsRect.left() + vHeaderRight, cornerPoint.y()), QPoint(cornerPoint.x() - 1, controlsRect.bottom())); -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC if (hasMacReverseSizeGrip) horizontalScrollBarRect.adjust(vsbExt, 0, 0, 0); #endif @@ -602,7 +602,7 @@ void QAbstractScrollArea::setViewport(QWidget *widget) d->viewport->setParent(this); d->viewport->setFocusProxy(this); d->viewport->installEventFilter(d->viewportFilter.data()); -#ifndef Q_DEAD_CODE_FROM_QT4_MAC +#if 1 // Used to be excluded in Qt4 for Q_WS_MAC #ifndef QT_NO_GESTURES d->viewport->grabGesture(Qt::PanGesture); #endif @@ -1029,7 +1029,7 @@ bool QAbstractScrollArea::event(QEvent *e) QPainter p(this); style()->drawPrimitive(QStyle::PE_PanelScrollAreaCorner, &option, &p, this); } -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC if (d->reverseCornerPaintingRect.isValid()) { option.rect = d->reverseCornerPaintingRect; QPainter p(this); @@ -1108,7 +1108,7 @@ bool QAbstractScrollArea::event(QEvent *e) hBar->setValue(se->contentPos().x()); vBar->setValue(se->contentPos().y()); -#ifdef Q_DEAD_CODE_FROM_QT4_WIN +#if 0 // Used to be included in Qt4 for Q_WS_WIN typedef BOOL (*PtrBeginPanningFeedback)(HWND); typedef BOOL (*PtrUpdatePanningFeedback)(HWND, LONG, LONG, BOOL); typedef BOOL (*PtrEndPanningFeedback)(HWND, BOOL); @@ -1532,13 +1532,13 @@ void QAbstractScrollAreaPrivate::_q_vslide(int y) void QAbstractScrollAreaPrivate::_q_showOrHideScrollBars() { layoutChildren(); -#ifdef Q_DEAD_CODE_FROM_QT4_WIN +#if 0 // Used to be included in Qt4 for Q_WS_WIN // Need to re-subscribe to gestures as the content changes to make sure we // enable/disable panning when needed. QWidgetPrivate *dd = static_cast(QObjectPrivate::get(viewport)); if (dd) dd->winSetupGestures(); -#endif // Q_DEAD_CODE_FROM_QT4_WIN +#endif } QPoint QAbstractScrollAreaPrivate::contentsOffset() const diff --git a/src/widgets/widgets/qabstractscrollarea_p.h b/src/widgets/widgets/qabstractscrollarea_p.h index 600c834c29..a3af77b11b 100644 --- a/src/widgets/widgets/qabstractscrollarea_p.h +++ b/src/widgets/widgets/qabstractscrollarea_p.h @@ -85,7 +85,7 @@ public: QWidget *viewport; QWidget *cornerWidget; QRect cornerPaintingRect; -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC QRect reverseCornerPaintingRect; #endif int left, top, right, bottom; // viewport margin @@ -112,7 +112,7 @@ public: { return q_func()->viewportEvent(event); } QScopedPointer viewportFilter; -#ifdef Q_DEAD_CODE_FROM_QT4_WIN +#if 0 // Used to be included in Qt4 for Q_WS_WIN bool singleFingerPanEnabled; void setSingleFingerPanEnabled(bool on = true); #endif diff --git a/src/widgets/widgets/qabstractslider.cpp b/src/widgets/widgets/qabstractslider.cpp index e85d82edb8..cc6a407bf8 100644 --- a/src/widgets/widgets/qabstractslider.cpp +++ b/src/widgets/widgets/qabstractslider.cpp @@ -721,7 +721,7 @@ bool QAbstractSliderPrivate::scrollByDelta(Qt::Orientation orientation, Qt::Keyb offset_accumulated = 0; offset_accumulated += stepsToScrollF; -#ifndef Q_DEAD_CODE_FROM_QT4_MAC +#if 1 // Used to be excluded in Qt4 for Q_WS_MAC // Don't scroll more than one page in any case: stepsToScroll = qBound(-pageStep, int(offset_accumulated), pageStep); #else diff --git a/src/widgets/widgets/qcalendarwidget.cpp b/src/widgets/widgets/qcalendarwidget.cpp index caeabb660b..12071e2cf0 100644 --- a/src/widgets/widgets/qcalendarwidget.cpp +++ b/src/widgets/widgets/qcalendarwidget.cpp @@ -1579,7 +1579,7 @@ protected: { Q_UNUSED(e) -#ifndef Q_DEAD_CODE_FROM_QT4_MAC +#if 1 // Used to be excluded in Qt4 for Q_WS_MAC QStyleOptionToolButton opt; initStyleOption(&opt); diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp index 693d5f9e93..a30e5db405 100644 --- a/src/widgets/widgets/qcombobox.cpp +++ b/src/widgets/widgets/qcombobox.cpp @@ -66,7 +66,7 @@ #include #include #include -#if defined(Q_DEAD_CODE_FROM_QT4_MAC) && !defined(QT_NO_EFFECTS) && !defined(QT_NO_STYLE_MAC) +#if 0 /* Used to be included in Qt4 for Q_WS_MAC */ && !defined(QT_NO_EFFECTS) && !defined(QT_NO_STYLE_MAC) #include #include #include @@ -415,7 +415,7 @@ void QComboBoxPrivateContainer::leaveEvent(QEvent *) { // On Mac using the Mac style we want to clear the selection // when the mouse moves outside the popup. -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC QStyleOptionComboBox opt = comboStyleOption(); if (combo->style()->styleHint(QStyle::SH_ComboBox_Popup, &opt, combo)) view->clearSelection(); diff --git a/src/widgets/widgets/qdatetimeedit.cpp b/src/widgets/widgets/qdatetimeedit.cpp index 54094de765..da370b4a19 100644 --- a/src/widgets/widgets/qdatetimeedit.cpp +++ b/src/widgets/widgets/qdatetimeedit.cpp @@ -1125,7 +1125,7 @@ void QDateTimeEdit::keyPressEvent(QKeyEvent *event) select = false; break; } -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC else #ifdef QT_KEYPAD_NAVIGATION if (!QApplication::keypadNavigationEnabled()) diff --git a/src/widgets/widgets/qdialogbuttonbox.cpp b/src/widgets/widgets/qdialogbuttonbox.cpp index 657eda3c68..23158cf82f 100644 --- a/src/widgets/widgets/qdialogbuttonbox.cpp +++ b/src/widgets/widgets/qdialogbuttonbox.cpp @@ -411,7 +411,7 @@ QPushButton *QDialogButtonBoxPrivate::createButton(QDialogButtonBox::StandardBut else addButton(button, static_cast(role), doLayout); -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC // Since mnemonics is off by default on Mac, we add a Cmd-D // shortcut here to e.g. make the "Don't Save" button work nativly: if (sbutton == QDialogButtonBox::Discard) diff --git a/src/widgets/widgets/qdockarealayout.cpp b/src/widgets/widgets/qdockarealayout.cpp index a7e865ff05..63f8172bf6 100644 --- a/src/widgets/widgets/qdockarealayout.cpp +++ b/src/widgets/widgets/qdockarealayout.cpp @@ -1935,7 +1935,7 @@ bool QDockAreaLayoutInfo::restoreState(QDataStream &stream, QList QDockAreaLayoutItem item(new QDockWidgetItem(widget)); if (flags & StateFlagFloating) { bool drawer = false; -#ifdef Q_DEAD_CODE_FROM_QT4_MAC // drawer support +#if 0 // Used to be included in Qt4 for Q_WS_MAC // drawer support extern bool qt_mac_is_macdrawer(const QWidget *); //qwidget_mac.cpp extern bool qt_mac_set_drawer_preferred_edge(QWidget *, Qt::DockWidgetArea); //qwidget_mac.cpp drawer = qt_mac_is_macdrawer(widget); @@ -1950,7 +1950,7 @@ bool QDockAreaLayoutInfo::restoreState(QDataStream &stream, QList int x, y, w, h; stream >> x >> y >> w >> h; -#ifdef Q_DEAD_CODE_FROM_QT4_MAC // drawer support +#if 0 // Used to be included in Qt4 for Q_WS_MAC // drawer support if (drawer) { mainWindow->window()->createWinId(); widget->window()->createWinId(); @@ -2050,7 +2050,7 @@ void QDockAreaLayoutInfo::updateSeparatorWidgets() const } j++; -#ifndef Q_DEAD_CODE_FROM_QT4_MAC +#if 1 // Used to be excluded in Qt4 for Q_WS_MAC sepWidget->raise(); #endif QRect sepRect = separatorRect(i).adjusted(-2, -2, 2, 2); @@ -3085,7 +3085,7 @@ bool QDockAreaLayout::restoreDockWidget(QDockWidget *dockWidget) dockWidget->d_func()->setWindowState(true, true, r); } dockWidget->setVisible(!placeHolder->hidden); -#ifdef Q_DEAD_CODE_FROM_QT4_X11 +#if 0 // Used to be included in Qt4 for Q_WS_X11 if (placeHolder->window) // gets rid of the X11BypassWindowManager window flag dockWidget->d_func()->setWindowState(true); #endif @@ -3316,7 +3316,7 @@ void QDockAreaLayout::updateSeparatorWidgets() const } j++; -#ifndef Q_DEAD_CODE_FROM_QT4_MAC +#if 1 // Used to be excluded in Qt4 for Q_WS_MAC sepWidget->raise(); #endif QRect sepRect = separatorRect(i).adjusted(-2, -2, 2, 2); diff --git a/src/widgets/widgets/qdockwidget.cpp b/src/widgets/widgets/qdockwidget.cpp index 5059616870..1df7259aba 100644 --- a/src/widgets/widgets/qdockwidget.cpp +++ b/src/widgets/widgets/qdockwidget.cpp @@ -58,7 +58,7 @@ #include "qdockwidget_p.h" #include "qmainwindowlayout_p.h" -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC #include #include #include @@ -916,7 +916,7 @@ bool QDockWidgetPrivate::mouseMoveEvent(QMouseEvent *event) && (event->pos() - state->pressPos).manhattanLength() > QApplication::startDragDistance()) { startDrag(); -#ifdef Q_DEAD_CODE_FROM_QT4_WIN +#if 0 // Used to be included in Qt4 for Q_WS_WIN grabMouseWhileInWindow(); #else q->grabMouse(); @@ -966,7 +966,7 @@ void QDockWidgetPrivate::nonClientAreaMouseEvent(QMouseEvent *event) QWidget *tl = q->topLevelWidget(); QRect geo = tl->geometry(); QRect titleRect = tl->frameGeometry(); -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC if ((features & QDockWidget::DockWidgetVerticalTitleBar)) { titleRect.setTop(geo.top()); titleRect.setBottom(geo.bottom()); @@ -1508,7 +1508,7 @@ bool QDockWidget::event(QEvent *event) if (d->mouseMoveEvent(static_cast(event))) return true; break; -#ifdef Q_DEAD_CODE_FROM_QT4_WIN +#if 0 // Used to be included in Qt4 for Q_WS_WIN case QEvent::Leave: if (d->state != 0 && d->state->dragging && !d->state->nca) { // This is a workaround for loosing the mouse on Vista. diff --git a/src/widgets/widgets/qlineedit.cpp b/src/widgets/widgets/qlineedit.cpp index 2bc715724d..dd5f5325b1 100644 --- a/src/widgets/widgets/qlineedit.cpp +++ b/src/widgets/widgets/qlineedit.cpp @@ -87,7 +87,7 @@ QT_BEGIN_NAMESPACE -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC extern void qt_mac_secure_keyboard(bool); //qapplication_mac.cpp #endif @@ -573,7 +573,7 @@ void QLineEdit::setEchoMode(EchoMode mode) setInputMethodHints(imHints); d->control->setEchoMode(mode); update(); -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC if (hasFocus()) qt_mac_secure_keyboard(mode == Password || mode == NoEcho); #endif @@ -1810,7 +1810,7 @@ void QLineEdit::focusInEvent(QFocusEvent *e) if((!hasSelectedText() && d->control->preeditAreaText().isEmpty()) || style()->styleHint(QStyle::SH_BlinkCursorWhenTextSelected, &opt, this)) d->setCursorVisible(true); -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC if (d->control->echoMode() == Password || d->control->echoMode() == NoEcho) qt_mac_secure_keyboard(true); #endif @@ -1858,7 +1858,7 @@ void QLineEdit::focusOutEvent(QFocusEvent *e) if (hasAcceptableInput() || d->control->fixup()) emit editingFinished(); } -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC if (d->control->echoMode() == Password || d->control->echoMode() == NoEcho) qt_mac_secure_keyboard(false); #endif diff --git a/src/widgets/widgets/qmainwindow.cpp b/src/widgets/widgets/qmainwindow.cpp index 2477510520..5c79c64793 100644 --- a/src/widgets/widgets/qmainwindow.cpp +++ b/src/widgets/widgets/qmainwindow.cpp @@ -61,7 +61,7 @@ #ifdef Q_OS_OSX #include #endif -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC #include #include QT_BEGIN_NAMESPACE @@ -80,7 +80,7 @@ public: #ifdef Q_OS_OSX , useUnifiedToolBar(false) #endif -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC , useHIToolBar(false) , activateUnifiedToolbarAfterFullScreen(false) #endif @@ -95,7 +95,7 @@ public: #ifdef Q_OS_OSX bool useUnifiedToolBar; #endif -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC bool useHIToolBar; bool activateUnifiedToolbarAfterFullScreen; #endif @@ -1110,7 +1110,7 @@ void QMainWindow::addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget d_func()->layout->removeWidget(dockwidget); // in case it was already in here addDockWidget(area, dockwidget, orientation); -#ifdef Q_DEAD_CODE_FROM_QT4_MAC //drawer support +#if 0 // Used to be included in Qt4 for Q_WS_MAC //drawer support QMacAutoReleasePool pool; extern bool qt_mac_is_macdrawer(const QWidget *); //qwidget_mac.cpp if (qt_mac_is_macdrawer(dockwidget)) { @@ -1514,7 +1514,7 @@ bool QMainWindow::event(QEvent *event) if (!d->explicitIconSize) setIconSize(QSize()); break; -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC case QEvent::Show: if (unifiedTitleAndToolBarOnMac()) d->layout->syncUnifiedToolbarVisibility(); @@ -1533,7 +1533,7 @@ bool QMainWindow::event(QEvent *event) } } break; -#endif // Q_DEAD_CODE_FROM_QT4_MAC +#endif #if !defined(QT_NO_DOCKWIDGET) && !defined(QT_NO_CURSOR) case QEvent::CursorChange: // CursorChange events are triggered as mouse moves to new widgets even @@ -1589,7 +1589,7 @@ void QMainWindow::setUnifiedTitleAndToolBarOnMac(bool set) } #endif -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC Q_D(QMainWindow); if (!isWindow() || d->useHIToolBar == set || QSysInfo::MacintoshVersion < QSysInfo::MV_10_3) return; @@ -1624,7 +1624,7 @@ bool QMainWindow::unifiedTitleAndToolBarOnMac() const #ifdef Q_OS_OSX return d_func()->useUnifiedToolBar; #endif -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC return d_func()->useHIToolBar && !testAttribute(Qt::WA_MacBrushedMetal) && !(windowFlags() & Qt::FramelessWindowHint); #endif return false; diff --git a/src/widgets/widgets/qmainwindowlayout.cpp b/src/widgets/widgets/qmainwindowlayout.cpp index 939453473a..8df197e05c 100644 --- a/src/widgets/widgets/qmainwindowlayout.cpp +++ b/src/widgets/widgets/qmainwindowlayout.cpp @@ -70,7 +70,7 @@ #include #include #include -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC # include # include #endif @@ -1129,11 +1129,11 @@ void QMainWindowLayout::removeToolBar(QToolBar *toolbar) QObject::disconnect(parentWidget(), SIGNAL(toolButtonStyleChanged(Qt::ToolButtonStyle)), toolbar, SLOT(_q_updateToolButtonStyle(Qt::ToolButtonStyle))); -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC if (usesHIToolBar(toolbar)) { removeFromMacToolbar(toolbar); } else -#endif // Q_DEAD_CODE_FROM_QT4_MAC +#endif { removeWidget(toolbar); } @@ -1148,7 +1148,7 @@ void QMainWindowLayout::addToolBar(Qt::ToolBarArea area, bool) { validateToolBarArea(area); -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC if ((area == Qt::TopToolBarArea) && layoutState.mainWindow->unifiedTitleAndToolBarOnMac()) { insertIntoMacToolbar(0, toolbar); @@ -1174,11 +1174,11 @@ void QMainWindowLayout::addToolBar(Qt::ToolBarArea area, */ void QMainWindowLayout::insertToolBar(QToolBar *before, QToolBar *toolbar) { -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC if (usesHIToolBar(before)) { insertIntoMacToolbar(before, toolbar); } else -#endif // Q_DEAD_CODE_FROM_QT4_MAC +#endif { addChildWidget(toolbar); QLayoutItem * item = layoutState.toolBarAreaLayout.insertToolBar(before, toolbar); @@ -1207,7 +1207,7 @@ Qt::ToolBarArea QMainWindowLayout::toolBarArea(QToolBar *toolbar) const case QInternal::BottomDock: return Qt::BottomToolBarArea; default: break; } -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC if (pos == QInternal::DockCount) { if (qtoolbarsInUnifiedToolbarList.contains(toolbar)) return Qt::TopToolBarArea; @@ -1230,7 +1230,7 @@ void QMainWindowLayout::getStyleOptionInfo(QStyleOptionToolBar *option, QToolBar void QMainWindowLayout::toggleToolBarsVisible() { bool updateNonUnifiedParts = true; -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC if (layoutState.mainWindow->unifiedTitleAndToolBarOnMac()) { // If we hit this case, someone has pressed the "toolbar button" which will // toggle the unified toolbar visibility, because that's what the user wants. @@ -1876,7 +1876,7 @@ QSize QMainWindowLayout::minimumSize() const const QSize sbMin = statusbar ? statusbar->minimumSize() : QSize(0, 0); minSize = QSize(qMax(sbMin.width(), minSize.width()), sbMin.height() + minSize.height()); -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC const QSize storedSize = minSize; int minWidth = 0; foreach (QToolBar *toolbar, qtoolbarsInUnifiedToolbarList) { @@ -2186,7 +2186,7 @@ QMainWindowLayout::QMainWindowLayout(QMainWindow *mainwindow, QLayout *parentLay #endif // QT_NO_DOCKWIDGET , widgetAnimator(this) , pluggingWidget(0) -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC , blockVisiblityCheck(false) #endif { @@ -2213,7 +2213,7 @@ QMainWindowLayout::~QMainWindowLayout() layoutState.deleteAllLayoutItems(); layoutState.deleteCentralWidgetItem(); -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC cleanUpMacToolbarItems(); #endif @@ -2581,7 +2581,7 @@ bool QMainWindowLayout::restoreState(QDataStream &stream) // HIToolbar. bool QMainWindowLayout::usesHIToolBar(QToolBar *toolbar) const { -#ifndef Q_DEAD_CODE_FROM_QT4_MAC +#if 1 // Used to be excluded in Qt4 for Q_WS_MAC Q_UNUSED(toolbar); return false; #else diff --git a/src/widgets/widgets/qmainwindowlayout_p.h b/src/widgets/widgets/qmainwindowlayout_p.h index c06122b9c7..6e8b965431 100644 --- a/src/widgets/widgets/qmainwindowlayout_p.h +++ b/src/widgets/widgets/qmainwindowlayout_p.h @@ -325,7 +325,7 @@ private: #ifndef QT_NO_TABBAR void updateTabBarShapes(); #endif -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC static OSStatus qtmacToolbarDelegate(EventHandlerCallRef, EventRef , void *); static OSStatus qtoolbarInHIToolbarHandler(EventHandlerCallRef inCallRef, EventRef event, void *data); @@ -358,7 +358,7 @@ public: QUnifiedToolbarSurface *unifiedSurface; void updateUnifiedToolbarOffset(); -#endif // Q_DEAD_CODE_FROM_QT4_MAC +#endif }; #if !defined(QT_NO_DOCKWIDGET) && !defined(QT_NO_DEBUG_STREAM) diff --git a/src/widgets/widgets/qmdiarea.cpp b/src/widgets/widgets/qmdiarea.cpp index 5f3aff5e10..183f1c2848 100644 --- a/src/widgets/widgets/qmdiarea.cpp +++ b/src/widgets/widgets/qmdiarea.cpp @@ -160,7 +160,7 @@ #include #include -#if defined(Q_DEAD_CODE_FROM_QT4_MAC) && !defined(QT_NO_STYLE_MAC) +#if 0 /* Used to be included in Qt4 for Q_WS_MAC */ && !defined(QT_NO_STYLE_MAC) #include #endif #include @@ -2493,7 +2493,7 @@ bool QMdiArea::event(QEvent *event) { Q_D(QMdiArea); switch (event->type()) { -#ifdef Q_DEAD_CODE_FROM_QT4_WIN +#if 0 // Used to be included in Qt4 for Q_WS_WIN // QWidgetPrivate::hide_helper activates another sub-window when closing a // modal dialog on Windows (see activateWindow() inside the ifdef). case QEvent::WindowUnblocked: @@ -2557,7 +2557,7 @@ bool QMdiArea::eventFilter(QObject *object, QEvent *event) QKeyEvent *keyEvent = static_cast(event); // Ingore key events without a Ctrl modifier (except for press/release on the modifier itself). -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC if (!(keyEvent->modifiers() & Qt::MetaModifier) && keyEvent->key() != Qt::Key_Meta) #else if (!(keyEvent->modifiers() & Qt::ControlModifier) && keyEvent->key() != Qt::Key_Control) @@ -2576,7 +2576,7 @@ bool QMdiArea::eventFilter(QObject *object, QEvent *event) // 3) Ctrl-Shift-Tab (Tab, Tab, ...) -> iterate through all windows in the opposite // direction (activatePreviousSubWindow()) switch (keyEvent->key()) { -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC case Qt::Key_Meta: #else case Qt::Key_Control: diff --git a/src/widgets/widgets/qmdisubwindow.cpp b/src/widgets/widgets/qmdisubwindow.cpp index afe87c6af9..2fff2fc729 100644 --- a/src/widgets/widgets/qmdisubwindow.cpp +++ b/src/widgets/widgets/qmdisubwindow.cpp @@ -280,7 +280,7 @@ static inline bool isHoverControl(QStyle::SubControl control) return control != QStyle::SC_None && control != QStyle::SC_TitleBarLabel; } -#if defined(Q_DEAD_CODE_FROM_QT4_WIN) +#if 0 // Used to be included in Qt4 for Q_WS_WIN static inline QRgb colorref2qrgb(COLORREF col) { return qRgb(GetRValue(col),GetGValue(col),GetBValue(col)); @@ -1932,7 +1932,7 @@ QPalette QMdiSubWindowPrivate::desktopPalette() const QPalette newPalette = q->palette(); bool colorsInitialized = false; -#ifdef Q_DEAD_CODE_FROM_QT4_WIN // ask system properties on windows +#if 0 // Used to be included in Qt4 for Q_WS_WIN // ask system properties on windows #ifndef SPI_GETGRADIENTCAPTIONS #define SPI_GETGRADIENTCAPTIONS 0x1008 #endif @@ -1968,7 +1968,7 @@ QPalette QMdiSubWindowPrivate::desktopPalette() const newPalette.color(QPalette::Inactive, QPalette::Highlight)); } } -#endif // Q_DEAD_CODE_FROM_QT4_WIN +#endif if (!colorsInitialized) { newPalette.setColor(QPalette::Active, QPalette::Highlight, newPalette.color(QPalette::Active, QPalette::Highlight)); diff --git a/src/widgets/widgets/qplaintextedit.cpp b/src/widgets/widgets/qplaintextedit.cpp index 27f1b16f60..7e01f6f3d5 100644 --- a/src/widgets/widgets/qplaintextedit.cpp +++ b/src/widgets/widgets/qplaintextedit.cpp @@ -811,7 +811,7 @@ void QPlainTextEditPrivate::init(const QString &txt) viewport->setCursor(Qt::IBeamCursor); #endif originalOffsetY = 0; -#ifdef Q_DEAD_CODE_FROM_QT4_WIN +#if 0 // Used to be included in Qt4 for Q_WS_WIN setSingleFingerPanEnabled(true); #endif } diff --git a/src/widgets/widgets/qpushbutton.cpp b/src/widgets/widgets/qpushbutton.cpp index bf10b9fb75..3b1440edb6 100644 --- a/src/widgets/widgets/qpushbutton.cpp +++ b/src/widgets/widgets/qpushbutton.cpp @@ -56,10 +56,10 @@ #include "qdebug.h" #include "qlayoutitem.h" #include "qdialogbuttonbox.h" -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC #include "private/qmacstyle_mac_p.h" #include "private/qmacstyle_mac_p_p.h" -#endif // Q_DEAD_CODE_FROM_QT4_MAC +#endif #ifndef QT_NO_ACCESSIBILITY #include "qaccessible.h" @@ -675,7 +675,7 @@ bool QPushButton::event(QEvent *e) return QAbstractButton::event(e); } -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC /*! \reimp */ bool QPushButton::hitButton(const QPoint &pos) const { @@ -704,7 +704,7 @@ bool QPushButtonPrivate::hitButton(const QPoint &pos) q->rect().height() - QMacStylePrivate::PushButtonBottomOffset); return roundedRect.contains(pos); } -#endif // Q_DEAD_CODE_FROM_QT4_MAC +#endif QT_END_NAMESPACE diff --git a/src/widgets/widgets/qpushbutton.h b/src/widgets/widgets/qpushbutton.h index 56d4d1de20..859ac247fb 100644 --- a/src/widgets/widgets/qpushbutton.h +++ b/src/widgets/widgets/qpushbutton.h @@ -87,9 +87,9 @@ public Q_SLOTS: protected: bool event(QEvent *e) Q_DECL_OVERRIDE; -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC bool hitButton(const QPoint &pos) const; -#endif // Q_DEAD_CODE_FROM_QT4_MAC +#endif void paintEvent(QPaintEvent *) Q_DECL_OVERRIDE; void keyPressEvent(QKeyEvent *) Q_DECL_OVERRIDE; void focusInEvent(QFocusEvent *) Q_DECL_OVERRIDE; diff --git a/src/widgets/widgets/qpushbutton_p.h b/src/widgets/widgets/qpushbutton_p.h index cd453a1339..ee41c345c8 100644 --- a/src/widgets/widgets/qpushbutton_p.h +++ b/src/widgets/widgets/qpushbutton_p.h @@ -71,7 +71,7 @@ public: inline void init() { resetLayoutItemMargins(); } static QPushButtonPrivate* get(QPushButton *b) { return b->d_func(); } -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC bool hitButton(const QPoint &pos); #endif #ifndef QT_NO_MENU diff --git a/src/widgets/widgets/qrubberband.cpp b/src/widgets/widgets/qrubberband.cpp index 123c955684..c91f837093 100644 --- a/src/widgets/widgets/qrubberband.cpp +++ b/src/widgets/widgets/qrubberband.cpp @@ -47,7 +47,7 @@ #include "qstyle.h" #include "qstyleoption.h" -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC # include # include #endif @@ -142,12 +142,12 @@ QRubberBand::QRubberBand(Shape s, QWidget *p) Q_D(QRubberBand); d->shape = s; setAttribute(Qt::WA_TransparentForMouseEvents); -#ifndef Q_DEAD_CODE_FROM_QT4_WIN +#if 1 // Used to be excluded in Qt4 for Q_WS_WIN setAttribute(Qt::WA_NoSystemBackground); -#endif //Q_DEAD_CODE_FROM_QT4_WIN +#endif setAttribute(Qt::WA_WState_ExplicitShowHide); setVisible(false); -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC if (isWindow()) { createWinId(); extern OSWindowRef qt_mac_window_for(const QWidget *); //qwidget_mac.cpp diff --git a/src/widgets/widgets/qsizegrip.cpp b/src/widgets/widgets/qsizegrip.cpp index dd0b383d2b..5150601366 100644 --- a/src/widgets/widgets/qsizegrip.cpp +++ b/src/widgets/widgets/qsizegrip.cpp @@ -52,7 +52,7 @@ #include "qdebug.h" #include -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC #include #endif @@ -82,7 +82,7 @@ public: Qt::Corner m_corner; bool gotMousePress; QPointer tlw; -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC void updateMacSizer(bool hide) const; #endif Qt::Corner corner() const; @@ -120,7 +120,7 @@ public: updateTopLevelWidget(); if (tlw && showSizeGrip) { Qt::WindowStates sizeGripNotVisibleState = Qt::WindowFullScreen; -#ifndef Q_DEAD_CODE_FROM_QT4_MAC +#if 1 // Used to be excluded in Qt4 for Q_WS_MAC sizeGripNotVisibleState |= Qt::WindowMaximized; #endif // Don't show the size grip if the tlw is maximized or in full screen mode. @@ -142,7 +142,7 @@ QSizeGripPrivate::QSizeGripPrivate() { } -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC void QSizeGripPrivate::updateMacSizer(bool hide) const { Q_Q(const QSizeGrip); @@ -225,7 +225,7 @@ void QSizeGripPrivate::init() Q_Q(QSizeGrip); m_corner = q->isLeftToRight() ? Qt::BottomRightCorner : Qt::BottomLeftCorner; -#if !defined(QT_NO_CURSOR) && !defined(Q_DEAD_CODE_FROM_QT4_MAC) +#if !defined(QT_NO_CURSOR) && !0 /* Used to be included in Qt4 for Q_WS_MAC */ q->setCursor(m_corner == Qt::TopLeftCorner || m_corner == Qt::BottomRightCorner ? Qt::SizeFDiagCursor : Qt::SizeBDiagCursor); #endif @@ -438,7 +438,7 @@ void QSizeGrip::moveEvent(QMoveEvent * /*moveEvent*/) return; d->m_corner = d->corner(); -#if !defined(QT_NO_CURSOR) && !defined(Q_DEAD_CODE_FROM_QT4_MAC) +#if !defined(QT_NO_CURSOR) && !0 /* Used to be included in Qt4 for Q_WS_MAC */ setCursor(d->m_corner == Qt::TopLeftCorner || d->m_corner == Qt::BottomRightCorner ? Qt::SizeFDiagCursor : Qt::SizeBDiagCursor); #endif @@ -449,7 +449,7 @@ void QSizeGrip::moveEvent(QMoveEvent * /*moveEvent*/) */ void QSizeGrip::showEvent(QShowEvent *showEvent) { -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC d_func()->updateMacSizer(false); #endif QWidget::showEvent(showEvent); @@ -460,7 +460,7 @@ void QSizeGrip::showEvent(QShowEvent *showEvent) */ void QSizeGrip::hideEvent(QHideEvent *hideEvent) { -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC d_func()->updateMacSizer(true); #endif QWidget::hideEvent(hideEvent); @@ -484,7 +484,7 @@ bool QSizeGrip::eventFilter(QObject *o, QEvent *e) return QWidget::eventFilter(o, e); } Qt::WindowStates sizeGripNotVisibleState = Qt::WindowFullScreen; -#ifndef Q_DEAD_CODE_FROM_QT4_MAC +#if 1 // Used to be excluded in Qt4 for Q_WS_MAC sizeGripNotVisibleState |= Qt::WindowMaximized; #endif // Don't show the size grip if the tlw is maximized or in full screen mode. diff --git a/src/widgets/widgets/qstatusbar.cpp b/src/widgets/widgets/qstatusbar.cpp index 5f1c373bb1..bdf728ead2 100644 --- a/src/widgets/widgets/qstatusbar.cpp +++ b/src/widgets/widgets/qstatusbar.cpp @@ -87,7 +87,7 @@ public: int savedStrut; -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC QPoint dragStart; #endif @@ -746,7 +746,7 @@ bool QStatusBar::event(QEvent *e) // On Mac OS X Leopard it is possible to drag the window by clicking // on the tool bar on most applications. -#ifndef Q_DEAD_CODE_FROM_QT4_MAC +#if 1 // Used to be excluded in Qt4 for Q_WS_MAC return QWidget::event(e); #else // Enable drag-click only if the status bar is the status bar for a diff --git a/src/widgets/widgets/qtabbar.cpp b/src/widgets/widgets/qtabbar.cpp index b6a3ef7eb8..8aa06e9a4d 100644 --- a/src/widgets/widgets/qtabbar.cpp +++ b/src/widgets/widgets/qtabbar.cpp @@ -63,7 +63,7 @@ #ifndef QT_NO_TABBAR -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC #include #include #endif @@ -1922,7 +1922,7 @@ void QTabBar::mousePressEvent(QMouseEvent *event) d->moveTabFinished(d->pressedIndex); d->pressedIndex = d->indexAtPos(event->pos()); -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC d->previousPressedIndex = d->pressedIndex; #endif if (d->validIndex(d->pressedIndex)) { @@ -2004,7 +2004,7 @@ void QTabBar::mouseMoveEvent(QMouseEvent *event) update(); } -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC } else if (!d->documentMode && event->buttons() == Qt::LeftButton && d->previousPressedIndex != -1) { int newPressedIndex = d->indexAtPos(event->pos()); if (d->pressedIndex == -1 && d->previousPressedIndex == newPressedIndex) { @@ -2102,7 +2102,7 @@ void QTabBar::mouseReleaseEvent(QMouseEvent *event) event->ignore(); return; } -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC d->previousPressedIndex = -1; #endif if (d->movable && d->dragInProgress && d->validIndex(d->pressedIndex)) { diff --git a/src/widgets/widgets/qtabbar_p.h b/src/widgets/widgets/qtabbar_p.h index 0e9dce84b3..e8d5503fdf 100644 --- a/src/widgets/widgets/qtabbar_p.h +++ b/src/widgets/widgets/qtabbar_p.h @@ -91,7 +91,7 @@ public: selectionBehaviorOnRemove(QTabBar::SelectRightTab), paintWithOffsets(true), movable(false), dragInProgress(false), documentMode(false), autoHide(false), changeCurrentOnDrag(false), switchTabCurrentIndex(-1), switchTabTimerId(0), movingTab(0) -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC , previousPressedIndex(-1) #endif {} @@ -228,7 +228,7 @@ public: int switchTabTimerId; QMovableTabWidget *movingTab; -#ifdef Q_DEAD_CODE_FROM_QT4_MAC +#if 0 // Used to be included in Qt4 for Q_WS_MAC int previousPressedIndex; #endif // shared by tabwidget and qtabbar diff --git a/src/widgets/widgets/qtextedit.cpp b/src/widgets/widgets/qtextedit.cpp index f354495e70..66bf2919eb 100644 --- a/src/widgets/widgets/qtextedit.cpp +++ b/src/widgets/widgets/qtextedit.cpp @@ -184,7 +184,7 @@ void QTextEditPrivate::init(const QString &html) #ifndef QT_NO_CURSOR viewport->setCursor(Qt::IBeamCursor); #endif -#ifdef Q_DEAD_CODE_FROM_QT4_WIN +#if 0 // Used to be included in Qt4 for Q_WS_WIN setSingleFingerPanEnabled(true); #endif } diff --git a/src/widgets/widgets/qtoolbar.cpp b/src/widgets/widgets/qtoolbar.cpp index 61bc6d19cf..2a0912df0a 100644 --- a/src/widgets/widgets/qtoolbar.cpp +++ b/src/widgets/widgets/qtoolbar.cpp @@ -322,7 +322,7 @@ bool QToolBarPrivate::mouseMoveEvent(QMouseEvent *event) startDrag(moving); if (!moving && !wasDragging) { -#ifdef Q_DEAD_CODE_FROM_QT4_WIN +#if 0 // Used to be included in Qt4 for Q_WS_WIN grabMouseWhileInWindow(); #else q->grabMouse(); diff --git a/src/widgets/widgets/qwidgetlinecontrol.cpp b/src/widgets/widgets/qwidgetlinecontrol.cpp index 66f17dbe33..9b65dc43d1 100644 --- a/src/widgets/widgets/qwidgetlinecontrol.cpp +++ b/src/widgets/widgets/qwidgetlinecontrol.cpp @@ -72,7 +72,7 @@ int QWidgetLineControl::redoTextLayout() const QTextLine l = m_textLayout.createLine(); m_textLayout.endLayout(); -#if defined(Q_DEAD_CODE_FROM_QT4_MAC) +#if 0 // Used to be included in Qt4 for Q_WS_MAC if (m_threadChecks) m_textLayoutThread = QThread::currentThread(); #endif diff --git a/src/widgets/widgets/qwidgetlinecontrol_p.h b/src/widgets/widgets/qwidgetlinecontrol_p.h index db9039e302..d4a4534fb5 100644 --- a/src/widgets/widgets/qwidgetlinecontrol_p.h +++ b/src/widgets/widgets/qwidgetlinecontrol_p.h @@ -91,7 +91,7 @@ public: m_selstart(0), m_selend(0), m_passwordEchoEditing(false) , m_passwordEchoTimer(0) , m_passwordMaskDelay(-1) -#if defined(Q_DEAD_CODE_FROM_QT4_MAC) +#if 0 // Used to be included in Qt4 for Q_WS_MAC , m_threadChecks(false) , m_textLayoutThread(0) #endif @@ -382,14 +382,14 @@ public: QTextLayout *textLayout() const { -#if defined(Q_DEAD_CODE_FROM_QT4_MAC) +#if 0 // Used to be included in Qt4 for Q_WS_MAC if (m_threadChecks && QThread::currentThread() != m_textLayoutThread) redoTextLayout(); #endif return &m_textLayout; } -#if defined(Q_DEAD_CODE_FROM_QT4_MAC) +#if 0 // Used to be included in Qt4 for Q_WS_MAC void setThreadChecks(bool threadChecks) { m_threadChecks = threadChecks; @@ -512,7 +512,7 @@ private: } int redoTextLayout() const; -#if defined(Q_DEAD_CODE_FROM_QT4_MAC) +#if 0 // Used to be included in Qt4 for Q_WS_MAC bool m_threadChecks; mutable QThread *m_textLayoutThread; #endif diff --git a/src/widgets/widgets/qwidgetresizehandler.cpp b/src/widgets/widgets/qwidgetresizehandler.cpp index 2a7b1eeecc..016598849b 100644 --- a/src/widgets/widgets/qwidgetresizehandler.cpp +++ b/src/widgets/widgets/qwidgetresizehandler.cpp @@ -120,7 +120,7 @@ bool QWidgetResizeHandler::eventFilter(QObject *o, QEvent *ee) if (!widget->rect().contains(widget->mapFromGlobal(e->globalPos()))) return false; if (e->button() == Qt::LeftButton) { -#if defined(Q_DEAD_CODE_FROM_QT4_X11) +#if 0 // Used to be included in Qt4 for Q_WS_X11 /* Implicit grabs do not stop the X server from changing the cursor in children, which looks *really* bad when @@ -134,7 +134,7 @@ bool QWidgetResizeHandler::eventFilter(QObject *o, QEvent *ee) # else widget->grabMouse(); # endif // QT_NO_CURSOR -#endif // Q_DEAD_CODE_FROM_QT4_X11 +#endif buttonDown = false; emit activate(); bool me = movingEnabled; -- cgit v1.2.3 From fca0aa676e5288d2b867f24263059233253510b5 Mon Sep 17 00:00:00 2001 From: Anton Kudryavtsev Date: Wed, 12 Oct 2016 16:56:20 +0300 Subject: QPathClipper: remove homebrew 'qRemoveDuplicates' algorithm Use std::unique Change-Id: Iae2e80d16b5a443ee5023224f48c325197c23029 Reviewed-by: Marc Mutz Reviewed-by: Edward Welbourne --- src/gui/painting/qpathclipper.cpp | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) (limited to 'src') diff --git a/src/gui/painting/qpathclipper.cpp b/src/gui/painting/qpathclipper.cpp index f92a681eca..addd9c0c2c 100644 --- a/src/gui/painting/qpathclipper.cpp +++ b/src/gui/painting/qpathclipper.cpp @@ -1458,25 +1458,6 @@ QPathClipper::QPathClipper(const QPainterPath &subject, bMask = clipPath.fillRule() == Qt::WindingFill ? ~0x0 : 0x1; } -template -Iterator qRemoveDuplicates(Iterator begin, Iterator end, Equality eq) -{ - if (begin == end) - return end; - - Iterator last = begin; - ++begin; - Iterator insert = begin; - for (Iterator it = begin; it != end; ++it) { - if (!eq(*it, *last)) { - *insert++ = *it; - last = it; - } - } - - return insert; -} - static void clear(QWingedEdge& list, int edge, QPathEdge::Traversal traversal) { QWingedEdge::TraversalStatus status; @@ -1643,7 +1624,7 @@ bool QPathClipper::doClip(QWingedEdge &list, ClipperMode mode) y_coords << list.vertex(i)->y; std::sort(y_coords.begin(), y_coords.end()); - y_coords.resize(qRemoveDuplicates(y_coords.begin(), y_coords.end(), fuzzyCompare) - y_coords.begin()); + y_coords.erase(std::unique(y_coords.begin(), y_coords.end(), fuzzyCompare), y_coords.end()); #ifdef QDEBUG_CLIPPER printf("sorted y coords:\n"); -- cgit v1.2.3 From 9ebfacb6883a5ed0095b1c816f3441eab8b675aa Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Tue, 4 Oct 2016 16:58:47 +0200 Subject: Android: Re-enable asset extraction for styling When the new configure system was introduced, it accidentally disabled automatic extraction of style assets on Android. This patch puts it back in. Note that the style extraction is not specific to Qt Widgets, but rather Qt Gui, like other QPA options. Task-number: QTBUG-56328 Change-Id: Ica33c3562c6dd6483050075f5c8ed5d28cd621a4 Reviewed-by: Lars Knoll Reviewed-by: Oswald Buddenhagen --- src/gui/configure.json | 6 ++++++ src/plugins/platforms/android/android.pro | 2 +- src/widgets/configure.json | 6 ------ 3 files changed, 7 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/gui/configure.json b/src/gui/configure.json index 318efe5401..b361679101 100644 --- a/src/gui/configure.json +++ b/src/gui/configure.json @@ -7,6 +7,7 @@ "commandline": { "options": { + "android-style-assets": "boolean", "angle": "boolean", "directfb": "boolean", "directwrite": "boolean", @@ -414,6 +415,11 @@ "condition": "features.accessibility && features.xcb && features.dbus", "output": [ "privateFeature", "feature" ] }, + "android-style-assets": { + "label": "Android Style Assets", + "condition": "config.android", + "output": [ "privateFeature" ] + }, "angle": { "label": "ANGLE", "autoDetect": "features.opengles2 || features.opengl-dynamic", diff --git a/src/plugins/platforms/android/android.pro b/src/plugins/platforms/android/android.pro index 045e55ec65..544b2ca63a 100644 --- a/src/plugins/platforms/android/android.pro +++ b/src/plugins/platforms/android/android.pro @@ -72,7 +72,7 @@ HEADERS += $$PWD/qandroidplatformintegration.h \ $$PWD/qandroidplatformforeignwindow.h \ $$PWD/qandroideventdispatcher.h -android-style-assets: SOURCES += $$PWD/extract.cpp +qtConfig(android-style-assets): SOURCES += $$PWD/extract.cpp else: SOURCES += $$PWD/extract-dummy.cpp PLUGIN_TYPE = platforms diff --git a/src/widgets/configure.json b/src/widgets/configure.json index c1931d9d80..b241fcdf11 100644 --- a/src/widgets/configure.json +++ b/src/widgets/configure.json @@ -8,7 +8,6 @@ "commandline": { "options": { - "android-style-assets": "boolean", "gtk": { "type": "boolean", "name": "gtk3" }, "style-windows": "boolean", "style-windowsxp": "boolean", @@ -78,11 +77,6 @@ "condition": "features.style-windows && features.properties && features.cssparser", "output": [ "publicFeature", "feature" ] }, - "android-style-assets": { - "label": "Android Style Assets", - "condition": "features.style-android", - "output": [ "privateConfig" ] - }, "effects": { "label": "Effects", "purpose": "Provides special widget effects (e.g. fading and scrolling).", -- cgit v1.2.3 From 2b9fe7d42d3e143edf8879c7af7725713611b0d3 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Tue, 4 Oct 2016 10:32:20 +0200 Subject: eglfs: clean up includes in the shared kms code Avoid unnecessary EGL and eglfs-specific includes in order to have a clearer view of the dependencies. Change-Id: Ifbd7dc4bd64024cc1ee48cd9f2607d1b5cdda1a2 Reviewed-by: Andy Nichols --- .../deviceintegration/eglfs_kms_support/qeglfskmsintegration.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsintegration.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsintegration.cpp index 6c30e8f930..5368a6d031 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsintegration.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsintegration.cpp @@ -42,15 +42,12 @@ #include "qeglfskmsintegration.h" #include "qeglfskmsdevice.h" #include "qeglfskmsscreen.h" -#include "private/qeglfswindow_p.h" -#include "private/qeglfscursor_p.h" -#include #include #include #include +#include #include -#include #include #include -- cgit v1.2.3 From f71aa48138e939ccb687ffab6afca734b1b13973 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Wed, 12 Oct 2016 09:19:11 +0200 Subject: Fix resolution of OPENSSL_LIBS in ssl.pri Task-number: QTBUG-55530 Change-Id: Icc5ae9849e41479732eb44d01d9ea37aa3da16f8 Reviewed-by: Oswald Buddenhagen --- src/network/ssl/ssl.pri | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src') diff --git a/src/network/ssl/ssl.pri b/src/network/ssl/ssl.pri index 8139af50af..79351017a6 100644 --- a/src/network/ssl/ssl.pri +++ b/src/network/ssl/ssl.pri @@ -79,6 +79,8 @@ qtConfig(ssl) { # - libs in \lib\VC\static # - configure: -openssl -openssl-linked -I \include -L \lib\VC\static OPENSSL_LIBS="-lUser32 -lAdvapi32 -lGdi32" OPENSSL_LIBS_DEBUG="-lssleay32MDd -llibeay32MDd" OPENSSL_LIBS_RELEASE="-lssleay32MD -llibeay32MD" + include($$OUT_PWD/qtnetwork-config.pri) + CONFIG(debug, debug|release) { LIBS_PRIVATE += $$OPENSSL_LIBS_DEBUG } else { -- cgit v1.2.3 From aec9cebf8c1ef4b9d497f76337d7af0b8b5f8d46 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 12 Oct 2016 16:36:50 +0200 Subject: make setting OPENSSL_LIBS_{DEBUG,RELEASE} work with dynamic builds while it's probably not really necessary (which is why it wasn't implemented before), just ignoring the options is somewhat inconsistent and a deviation from historical behavior. Task-number: QTBUG-55530 Change-Id: I9441bf7be50ab5c997bb745e2525048ca23e4cd5 Reviewed-by: Jake Petroules Reviewed-by: Kai Koehne --- src/network/configure.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/network/configure.json b/src/network/configure.json index 97bf92167d..124fa1718f 100644 --- a/src/network/configure.json +++ b/src/network/configure.json @@ -60,7 +60,14 @@ }, "condition": "config.win32 && !features.shared" }, - { "libs": "-lssleay32 -llibeay32", "condition": "config.win32 && features.shared" }, + { + "libs": "-lssleay32 -llibeay32", + "builds": { + "debug": "", + "release": "" + }, + "condition": "config.win32 && features.shared" + }, { "libs": "-lssl -lcrypto", "condition": "!config.win32" } ] } -- cgit v1.2.3 From 936e13212248e32f92f24765b4dd919610253d6f Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Fri, 7 Oct 2016 10:59:11 +0200 Subject: Add optimize-for-size case to ucstrncmp The SSE code had a case where tail-loop unrolling was disabled when optimizing for size. What would be even shorter, is to just do a straight-forward loop over the arrays and compare them. For anything else, we can just go for speed. Change-Id: Ifb31650e10e41409972a38014067dbd2927674c9 Reviewed-by: Thiago Macieira --- src/corelib/tools/qstring.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index bf1bc3e650..26bb0de278 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -446,6 +446,16 @@ extern "C" int qt_ucstrncmp_mips_dsp_asm(const ushort *a, // Unicode case-sensitive compare two same-sized strings static int ucstrncmp(const QChar *a, const QChar *b, int l) { +#ifdef __OPTIMIZE_SIZE__ + const QChar *end = a + l; + while (a < end) { + if (int diff = (int)a->unicode() - (int)b->unicode()) + return diff; + ++a; + ++b; + } + return 0; +#else #if defined(__mips_dsp) if (l >= 8) { return qt_ucstrncmp_mips_dsp_asm(reinterpret_cast(a), @@ -473,7 +483,7 @@ static int ucstrncmp(const QChar *a, const QChar *b, int l) - reinterpret_cast(ptr + distance + idx)->unicode(); } } -# if defined(Q_COMPILER_LAMBDA) && !defined(__OPTIMIZE_SIZE__) +# if defined(Q_COMPILER_LAMBDA) const auto &lambda = [=](int i) -> int { return reinterpret_cast(ptr)[i].unicode() - reinterpret_cast(ptr + distance)[i].unicode(); @@ -529,6 +539,7 @@ static int ucstrncmp(const QChar *a, const QChar *b, int l) } } return 0; +#endif } static int ucstrncmp(const QChar *a, const uchar *c, int l) -- cgit v1.2.3 From adbafab4ef921b2336511a21cb4300eafa1f4cad Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Thu, 8 Sep 2016 12:33:41 +0200 Subject: Specify timeout is in milliseconds Change-Id: I465b343b6fe64c8d1ce17e34be5f864e8556d374 Reviewed-by: Edward Welbourne --- src/testlib/qtestcase.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp index 876c573196..80aeff7bd1 100644 --- a/src/testlib/qtestcase.cpp +++ b/src/testlib/qtestcase.cpp @@ -244,7 +244,7 @@ static void stackTrace() \relates QTest The QTRY_VERIFY_WITH_TIMEOUT() macro is similar to QVERIFY(), but checks the \a condition - repeatedly, until either the condition becomes true or the \a timeout is + repeatedly, until either the condition becomes true or the \a timeout (in milliseconds) is reached. Between each evaluation, events will be processed. If the timeout is reached, a failure is recorded in the test log and the test won't be executed further. @@ -276,7 +276,7 @@ static void stackTrace() The QTRY_VERIFY2_WITH_TIMEOUT macro is similar to QTRY_VERIFY_WITH_TIMEOUT() except that it outputs a verbose \a message when \a condition is still false - after the specified \a timeout. The \a message is a plain C string. + after the specified \a timeout (in milliseconds). The \a message is a plain C string. Example: \code @@ -316,7 +316,7 @@ static void stackTrace() The QTRY_COMPARE_WITH_TIMEOUT() macro is similar to QCOMPARE(), but performs the comparison of the \a actual and \a expected values repeatedly, until either the two values - are equal or the \a timeout is reached. Between each comparison, events + are equal or the \a timeout (in milliseconds) is reached. Between each comparison, events will be processed. If the timeout is reached, a failure is recorded in the test log and the test won't be executed further. -- cgit v1.2.3 From 3189313f226f550892a8bd4993ed52b44abea13a Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Tue, 11 Oct 2016 09:59:03 +0200 Subject: Doc: Fix typo in QtStyledItemDelegate::paint() docs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTBUG-56399 Change-Id: Iaace0ed05098ab6d880b06a40d8e13aa9288c5ec Reviewed-by: Topi Reiniö Reviewed-by: Frederik Gladhorn --- src/widgets/itemviews/qstyleditemdelegate.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/widgets/itemviews/qstyleditemdelegate.cpp b/src/widgets/itemviews/qstyleditemdelegate.cpp index 483cfbdc36..7de3ca4b0c 100644 --- a/src/widgets/itemviews/qstyleditemdelegate.cpp +++ b/src/widgets/itemviews/qstyleditemdelegate.cpp @@ -360,7 +360,7 @@ void QStyledItemDelegate::initStyleOption(QStyleOptionViewItem *option, if it is enabled or selected. After painting, you should ensure that the painter is returned to - its the state it was supplied in when this function was called. + the state it was supplied in when this function was called. For example, it may be useful to call QPainter::save() before painting and QPainter::restore() afterwards. -- cgit v1.2.3 From e9110b162cad1c07341fa3ed424484a58f9c642a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Fri, 14 Oct 2016 16:44:47 +0200 Subject: iOS: Report correct physical DPI for iPhone 7 Plus Task-number: QTBUG-56509 Change-Id: Ibae94262c2a4c917aeca00cb1a1c28e5ae60f0c4 Reviewed-by: Jake Petroules --- src/plugins/platforms/ios/qiosscreen.mm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/ios/qiosscreen.mm b/src/plugins/platforms/ios/qiosscreen.mm index 4018a02f8d..7d1c01f36b 100644 --- a/src/plugins/platforms/ios/qiosscreen.mm +++ b/src/plugins/platforms/ios/qiosscreen.mm @@ -201,8 +201,8 @@ QIOSScreen::QIOSScreen(UIScreen *screen) else m_depth = 24; - if (deviceIdentifier.contains(QRegularExpression("^iPhone(7,1|8,2)$"))) { - // iPhone 6 Plus or iPhone 6S Plus + if (deviceIdentifier.contains(QRegularExpression("^iPhone(7,1|8,2|9,2|9,4)$"))) { + // iPhone Plus models m_physicalDpi = 401; } else if (deviceIdentifier.contains(QRegularExpression("^iPad(1,1|2,[1-4]|3,[1-6]|4,[1-3]|5,[3-4]|6,[7-8])$"))) { // All iPads except the iPad Mini series -- cgit v1.2.3 From 81755e96230753fc70cecf3c6be28237015cdf9b Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 12 Oct 2016 10:35:55 +0200 Subject: get rid of Q_FONTCONFIGDATABASE define use fontconfig feature directly instead. easier to understand data flow, and less noisy compiler command lines. Change-Id: If80af4b08933049d553df685b41422d15e1e4f5c Reviewed-by: Jake Petroules --- .../fontdatabases/genericunix/qgenericunixfontdatabase_p.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/platformsupport/fontdatabases/genericunix/qgenericunixfontdatabase_p.h b/src/platformsupport/fontdatabases/genericunix/qgenericunixfontdatabase_p.h index 043f831530..267ef5e3f2 100644 --- a/src/platformsupport/fontdatabases/genericunix/qgenericunixfontdatabase_p.h +++ b/src/platformsupport/fontdatabases/genericunix/qgenericunixfontdatabase_p.h @@ -51,9 +51,9 @@ // We mean it. // -#include +#include -#ifdef Q_FONTCONFIGDATABASE +#if QT_CONFIG(fontconfig) #include typedef QFontconfigDatabase QGenericUnixFontDatabase; #else -- cgit v1.2.3 From 9a088e78690a3052f9c2d7e388e37957c2470ab1 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 30 Sep 2016 20:53:53 +0200 Subject: use helper libs via QMAKE_USE for that, qt_help_lib.prf gains the ability to write "external module pri" files that contain suitable information for QMAKE_USE. these files have a bunch of limitations: - they are not installed, because a) they are not relocatable and b) the helper libs' headers are not installed, either - it won't work with qmake -r, which is ok, as qt5 does not build with qmake -r anyway - deps are not transitive, neither at build nor at use time the freetype, harfbuzz-ng, pcre, and png helper libs have been adjusted accordingly, and their uses replaced with QMAKE_USE instances. this also allowed inlining the now trivial {harfbuzz,pcrc,png}_dependency.pri files. freetype_dependency.pri remains due to its funkiness. Change-Id: I16890eecb122e34ec49f3d3e68380d1ea71a198a Reviewed-by: Jake Petroules --- src/3rdparty/freetype/freetype.pro | 8 +++----- src/3rdparty/freetype_dependency.pri | 3 +-- src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro | 6 +++--- src/3rdparty/harfbuzz_dependency.pri | 6 ------ src/3rdparty/libpng/libpng.pro | 4 +++- src/3rdparty/pcre/pcre.pro | 4 +++- src/3rdparty/pcre_dependency.pri | 7 ------- src/3rdparty/png_dependency.pri | 6 ------ src/angle/src/libEGL/libEGL.pro | 3 ++- src/corelib/tools/tools.pri | 2 +- src/gui/image/image.pri | 2 +- src/gui/text/text.pri | 2 +- .../platforms/xcb/gl_integrations/gl_integrations_plugin_base.pri | 5 +---- src/plugins/platforms/xcb/xcb-static/xcb-static.pro | 6 ++++-- src/plugins/platforms/xcb/xcb_qpa_lib.pro | 5 +---- 15 files changed, 24 insertions(+), 45 deletions(-) delete mode 100644 src/3rdparty/harfbuzz_dependency.pri delete mode 100644 src/3rdparty/pcre_dependency.pri delete mode 100644 src/3rdparty/png_dependency.pri (limited to 'src') diff --git a/src/3rdparty/freetype/freetype.pro b/src/3rdparty/freetype/freetype.pro index 6d630d4190..5b1eb92e32 100644 --- a/src/3rdparty/freetype/freetype.pro +++ b/src/3rdparty/freetype/freetype.pro @@ -6,6 +6,8 @@ CONFIG += \ exceptions_off rtti_off warn_off \ installed +MODULE_INCLUDEPATH += $$PWD/include + load(qt_helper_lib) SOURCES += \ @@ -61,16 +63,12 @@ win32 { INCLUDEPATH += $$PWD/builds/unix } -INCLUDEPATH += $$PWD/include - DEFINES += FT2_BUILD_LIBRARY DEFINES += FT_CONFIG_OPTION_SYSTEM_ZLIB include(../zlib_dependency.pri) -QT_FOR_CONFIG += gui-private -include($$OUT_PWD/../../gui/qtgui-config.pri) DEFINES += FT_CONFIG_OPTION_USE_PNG -include($$PWD/../png_dependency.pri) +QMAKE_USE_PRIVATE += libpng DEFINES += TT_CONFIG_OPTION_SUBPIXEL_HINTING diff --git a/src/3rdparty/freetype_dependency.pri b/src/3rdparty/freetype_dependency.pri index cf86b66efd..ca871a92d7 100644 --- a/src/3rdparty/freetype_dependency.pri +++ b/src/3rdparty/freetype_dependency.pri @@ -1,6 +1,5 @@ qtConfig(system-freetype) { QMAKE_USE_PRIVATE += freetype/nolink } else: qtConfig(freetype) { - INCLUDEPATH += $$PWD/freetype/include - LIBS_PRIVATE += -L$$QT_BUILD_TREE/lib -lqtfreetype$$qtPlatformTargetSuffix() + QMAKE_USE_PRIVATE += freetype } diff --git a/src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro b/src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro index 1bfeabb8c4..4ba2ee3ec4 100644 --- a/src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro +++ b/src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro @@ -1,10 +1,12 @@ -TARGET = qtharfbuzzng +TARGET = qtharfbuzz CONFIG += \ static \ hide_symbols \ exceptions_off rtti_off warn_off +MODULE_INCLUDEPATH += $$PWD/include + load(qt_helper_lib) # built-in shapers list configuration: @@ -24,8 +26,6 @@ win32: DEFINES += HB_NO_WIN1256 #Workaround https://code.google.com/p/android/issues/detail?id=194631 android: DEFINES += _POSIX_C_SOURCE=200112L -INCLUDEPATH += $$PWD/include - # Harfbuzz-NG inside Qt uses the Qt atomics (inline code only) INCLUDEPATH += $$QT.core.includes DEFINES += QT_NO_VERSION_TAGGING diff --git a/src/3rdparty/harfbuzz_dependency.pri b/src/3rdparty/harfbuzz_dependency.pri deleted file mode 100644 index 5946f403c5..0000000000 --- a/src/3rdparty/harfbuzz_dependency.pri +++ /dev/null @@ -1,6 +0,0 @@ -qtConfig(system-harfbuzz) { - QMAKE_USE_PRIVATE += harfbuzz -} else: qtConfig(harfbuzz) { - INCLUDEPATH += $$PWD/harfbuzz-ng/include - LIBS_PRIVATE += -L$$QT_BUILD_TREE/lib -lqtharfbuzzng$$qtPlatformTargetSuffix() -} diff --git a/src/3rdparty/libpng/libpng.pro b/src/3rdparty/libpng/libpng.pro index ab6dd51e2b..577b61d833 100644 --- a/src/3rdparty/libpng/libpng.pro +++ b/src/3rdparty/libpng/libpng.pro @@ -1,4 +1,4 @@ -TARGET = qtpng +TARGET = qtlibpng CONFIG += \ static \ @@ -6,6 +6,8 @@ CONFIG += \ exceptions_off rtti_off warn_off \ installed +MODULE_INCLUDEPATH = $$PWD + load(qt_helper_lib) DEFINES += PNG_ARM_NEON_OPT=0 diff --git a/src/3rdparty/pcre/pcre.pro b/src/3rdparty/pcre/pcre.pro index fad82b80b1..add4a932b3 100644 --- a/src/3rdparty/pcre/pcre.pro +++ b/src/3rdparty/pcre/pcre.pro @@ -5,12 +5,14 @@ CONFIG += \ hide_symbols \ exceptions_off rtti_off warn_off +win32: MODULE_DEFINES += PCRE_STATIC +MODULE_INCLUDEPATH += $$PWD + load(qt_helper_lib) DEFINES += HAVE_CONFIG_H # platform/compiler specific definitions -win32: DEFINES += PCRE_STATIC uikit|qnx|winrt: DEFINES += PCRE_DISABLE_JIT SOURCES += \ diff --git a/src/3rdparty/pcre_dependency.pri b/src/3rdparty/pcre_dependency.pri deleted file mode 100644 index f1355eabe6..0000000000 --- a/src/3rdparty/pcre_dependency.pri +++ /dev/null @@ -1,7 +0,0 @@ -qtConfig(system-pcre) { - QMAKE_USE_PRIVATE += pcre -} else { - win32: DEFINES += PCRE_STATIC - INCLUDEPATH += $$PWD/pcre - LIBS_PRIVATE += -L$$QT_BUILD_TREE/lib -lqtpcre$$qtPlatformTargetSuffix() -} diff --git a/src/3rdparty/png_dependency.pri b/src/3rdparty/png_dependency.pri deleted file mode 100644 index 50711358a0..0000000000 --- a/src/3rdparty/png_dependency.pri +++ /dev/null @@ -1,6 +0,0 @@ -qtConfig(system-png) { - QMAKE_USE_PRIVATE += libpng -} else: qtConfig(png) { - INCLUDEPATH += $$PWD/libpng - LIBS_PRIVATE += -L$$QT_BUILD_TREE/lib -lqtpng$$qtPlatformTargetSuffix() -} diff --git a/src/angle/src/libEGL/libEGL.pro b/src/angle/src/libEGL/libEGL.pro index 860b60735e..3b2d516ecb 100644 --- a/src/angle/src/libEGL/libEGL.pro +++ b/src/angle/src/libEGL/libEGL.pro @@ -3,7 +3,8 @@ DEF_FILE_TARGET=$${TARGET} TARGET=$$qtLibraryTarget($${LIBEGL_NAME}) winrt: LIBS_PRIVATE += -ld3d11 -LIBS_PRIVATE += -ldxguid -L$$QT_BUILD_TREE/lib -l$$qtLibraryTarget($${LIBGLESV2_NAME}) +LIBS_PRIVATE += -ldxguid +QMAKE_USE_PRIVATE += $${LIBGLESV2_NAME} DEFINES += GL_APICALL= GL_GLEXT_PROTOTYPES= EGLAPI= LIBEGL_IMPLEMENTATION diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri index 47b0b2d4be..fb80bbd6b8 100644 --- a/src/corelib/tools/tools.pri +++ b/src/corelib/tools/tools.pri @@ -174,7 +174,7 @@ qtConfig(timezone) { } qtConfig(regularexpression) { - include($$PWD/../../3rdparty/pcre_dependency.pri) + QMAKE_USE_PRIVATE += pcre HEADERS += tools/qregularexpression.h SOURCES += tools/qregularexpression.cpp diff --git a/src/gui/image/image.pri b/src/gui/image/image.pri index 3c4d2c0bbf..bac00f7e95 100644 --- a/src/gui/image/image.pri +++ b/src/gui/image/image.pri @@ -74,7 +74,7 @@ SOURCES += \ qtConfig(png) { HEADERS += image/qpnghandler_p.h SOURCES += image/qpnghandler.cpp - include($$PWD/../../3rdparty/png_dependency.pri) + QMAKE_USE_PRIVATE += libpng } # SIMD diff --git a/src/gui/text/text.pri b/src/gui/text/text.pri index 3fe47a6645..c1c52f2d1a 100644 --- a/src/gui/text/text.pri +++ b/src/gui/text/text.pri @@ -88,7 +88,7 @@ HEADERS += \ qtConfig(harfbuzz)|qtConfig(system-harfbuzz) { DEFINES += QT_ENABLE_HARFBUZZ_NG - include($$PWD/../../3rdparty/harfbuzz_dependency.pri) + QMAKE_USE_PRIVATE += harfbuzz SOURCES += text/qharfbuzzng.cpp HEADERS += text/qharfbuzzng_p.h diff --git a/src/plugins/platforms/xcb/gl_integrations/gl_integrations_plugin_base.pri b/src/plugins/platforms/xcb/gl_integrations/gl_integrations_plugin_base.pri index a3813ef993..a94815dfbd 100644 --- a/src/plugins/platforms/xcb/gl_integrations/gl_integrations_plugin_base.pri +++ b/src/plugins/platforms/xcb/gl_integrations/gl_integrations_plugin_base.pri @@ -22,10 +22,7 @@ CONFIG += qpa/genericunixfontdatabase !qtConfig(system-xcb) { DEFINES += XCB_USE_RENDER - XCB_DIR = $$clean_path($$PWD/../../../../3rdparty/xcb) - INCLUDEPATH += $$XCB_DIR/include $$XCB_DIR/include/xcb $$XCB_DIR/sysinclude - LIBS += -L$$MODULE_BASE_OUTDIR/lib -lxcb-static$$qtPlatformTargetSuffix() - QMAKE_USE += xcb + QMAKE_USE += xcb-static xcb } else { qtConfig(xkb): QMAKE_USE += xcb_xkb # to support custom cursors with depth > 1 diff --git a/src/plugins/platforms/xcb/xcb-static/xcb-static.pro b/src/plugins/platforms/xcb/xcb-static/xcb-static.pro index a1dec2b0b5..f3e54813ee 100644 --- a/src/plugins/platforms/xcb/xcb-static/xcb-static.pro +++ b/src/plugins/platforms/xcb/xcb-static/xcb-static.pro @@ -5,11 +5,11 @@ # libxcb-xinerama # CONFIG += static -load(qt_helper_lib) XCB_DIR = ../../../../3rdparty/xcb -INCLUDEPATH += $$XCB_DIR/include $$XCB_DIR/include/xcb $$XCB_DIR/sysinclude +MODULE_INCLUDEPATH += $$XCB_DIR/include $$XCB_DIR/sysinclude +INCLUDEPATH += $$XCB_DIR/include/xcb QMAKE_USE += xcb/nolink @@ -75,3 +75,5 @@ SOURCES += \ OTHER_FILES = $$XCB_DIR/README TR_EXCLUDE += $$XCB_DIR/* + +load(qt_helper_lib) diff --git a/src/plugins/platforms/xcb/xcb_qpa_lib.pro b/src/plugins/platforms/xcb/xcb_qpa_lib.pro index 246bb1f118..69d2e35606 100644 --- a/src/plugins/platforms/xcb/xcb_qpa_lib.pro +++ b/src/plugins/platforms/xcb/xcb_qpa_lib.pro @@ -68,10 +68,7 @@ CONFIG += qpa/genericunixfontdatabase !qtConfig(system-xcb) { DEFINES += XCB_USE_RENDER - XCB_DIR = ../../../3rdparty/xcb - INCLUDEPATH += $$XCB_DIR/include $$XCB_DIR/sysinclude - LIBS += -L$$MODULE_BASE_OUTDIR/lib -lxcb-static$$qtPlatformTargetSuffix() - QMAKE_USE += xcb + QMAKE_USE += xcb-static xcb } else { LIBS += -lxcb-xinerama ### there is no configure test for this! qtConfig(xkb): QMAKE_USE += xcb_xkb -- cgit v1.2.3 From ec774500fb964f039bc47abce67e655699d374f7 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 12 Oct 2016 11:39:26 +0200 Subject: cleanup related to transitive dependencies public uses of external libraries are automatically transitive now, so we can remove some parts which were only meant to pull in transitive dependencies manually. this is particularly good for includes() of parts of QtPlatformSupport, which actually redundantly pulled in the library's sources. this required making the freetype and fontconfig dependencies public, which is ok, as in the end, they are used only by platform plugins, so there is no point in making them private, as plugins are not linked against anyway (except statically, but there public vs. private doesn't apply anyway). Change-Id: Ia2a32f50dc0f8472285675a0903e6ecd142a03b2 Reviewed-by: Jake Petroules --- src/3rdparty/freetype_dependency.pri | 4 ++-- src/plugins/platforms/haiku/haiku.pro | 2 -- src/plugins/platforms/qnx/qnx.pro | 5 ----- src/plugins/platforms/windows/windows.pri | 5 ----- src/plugins/platforms/winrt/winrt.pro | 1 - 5 files changed, 2 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/3rdparty/freetype_dependency.pri b/src/3rdparty/freetype_dependency.pri index ca871a92d7..c477e6fdea 100644 --- a/src/3rdparty/freetype_dependency.pri +++ b/src/3rdparty/freetype_dependency.pri @@ -1,5 +1,5 @@ qtConfig(system-freetype) { - QMAKE_USE_PRIVATE += freetype/nolink + QMAKE_USE += freetype/nolink } else: qtConfig(freetype) { - QMAKE_USE_PRIVATE += freetype + QMAKE_USE += freetype } diff --git a/src/plugins/platforms/haiku/haiku.pro b/src/plugins/platforms/haiku/haiku.pro index ea5bb632db..931dfb28a8 100644 --- a/src/plugins/platforms/haiku/haiku.pro +++ b/src/plugins/platforms/haiku/haiku.pro @@ -36,8 +36,6 @@ LIBS += -lbe OTHER_FILES += haiku.json -include (../../../platformsupport/fontdatabases/fontdatabases.pri) - PLUGIN_TYPE = platforms PLUGIN_CLASS_NAME = QHaikuIntegrationPlugin load(qt_plugin) diff --git a/src/plugins/platforms/qnx/qnx.pro b/src/plugins/platforms/qnx/qnx.pro index e47731476f..a726980f5b 100644 --- a/src/plugins/platforms/qnx/qnx.pro +++ b/src/plugins/platforms/qnx/qnx.pro @@ -121,11 +121,6 @@ lgmon { OTHER_FILES += qnx.json -QMAKE_CXXFLAGS += -I./private - -include (../../../platformsupport/eglconvenience/eglconvenience.pri) -include (../../../platformsupport/fontdatabases/fontdatabases.pri) - PLUGIN_TYPE = platforms PLUGIN_CLASS_NAME = QQnxIntegrationPlugin !equals(TARGET, $$QT_DEFAULT_QPA_PLUGIN): PLUGIN_EXTENDS = - diff --git a/src/plugins/platforms/windows/windows.pri b/src/plugins/platforms/windows/windows.pri index 6929f7365f..411c9e032b 100644 --- a/src/plugins/platforms/windows/windows.pri +++ b/src/plugins/platforms/windows/windows.pri @@ -114,11 +114,6 @@ RESOURCES += $$PWD/openglblacklists.qrc qtConfig(freetype) { HEADERS += $$PWD/qwindowsfontdatabase_ft.h SOURCES += $$PWD/qwindowsfontdatabase_ft.cpp - qtConfig(system-freetype) { - include($$QT_SOURCE_TREE/src/platformsupport/fontdatabases/basic/basic.pri) - } else { - include($$QT_SOURCE_TREE/src/3rdparty/freetype_dependency.pri) - } } qtConfig(accessibility): include($$PWD/accessible/accessible.pri) diff --git a/src/plugins/platforms/winrt/winrt.pro b/src/plugins/platforms/winrt/winrt.pro index 28456f66ec..174b0362b4 100644 --- a/src/plugins/platforms/winrt/winrt.pro +++ b/src/plugins/platforms/winrt/winrt.pro @@ -7,7 +7,6 @@ QT += core-private gui-private platformsupport-private DEFINES *= QT_NO_CAST_FROM_ASCII __WRL_NO_DEFAULT_LIB__ LIBS += $$QMAKE_LIBS_CORE -ldwrite -ld3d11 -INCLUDEPATH += $$QT_SOURCE_TREE/src/3rdparty/freetype/include SOURCES = \ main.cpp \ -- cgit v1.2.3 From ea913750b8793e1e518bd0eabc338e557df5ee6c Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 12 Oct 2016 11:55:52 +0200 Subject: create modularized version of qtplatformsupport module lumping together all kinds of unrelated stuff has caused problems with spurious dependencies from the beginning. as the modularization infra is now in a state which supports many small private libraries just fine, take advantage of it. Change-Id: Ic40f47ce76a308bbfd32deae281f6f064fe1ef4c Reviewed-by: Jake Petroules --- .../nativecontexts/qeglnativecontext.h | 2 +- .../accessibility/accessibility.pri | 9 --- .../accessibility/accessibility.pro | 16 +++++ .../cglconvenience/cglconvenience.pri | 11 ---- .../cglconvenience/cglconvenience.pro | 18 ++++++ src/platformsupport/clipboard/clipboard.pri | 7 -- src/platformsupport/clipboard/clipboard.pro | 15 +++++ .../devicediscovery/devicediscovery.pri | 13 ---- .../devicediscovery/devicediscovery.pro | 25 ++++++++ .../eglconvenience/eglconvenience.pri | 32 ---------- .../eglconvenience/eglconvenience.pro | 43 +++++++++++++ .../eglconvenience/qeglconvenience_p.h | 2 +- src/platformsupport/eglconvenience/qeglpbuffer_p.h | 2 +- .../eglconvenience/qeglplatformcontext_p.h | 2 +- .../eglconvenience/qeglstreamconvenience_p.h | 2 +- .../eventdispatchers/eventdispatchers.pri | 21 ------ .../eventdispatchers/eventdispatchers.pro | 32 ++++++++++ .../fbconvenience/fbconvenience.pri | 11 ---- .../fbconvenience/fbconvenience.pro | 24 +++++++ .../fontconfig/qfontconfigdatabase_p.h | 2 +- .../fontdatabases/fontdatabases.pri | 15 ----- .../fontdatabases/fontdatabases.pro | 26 ++++++++ .../genericunix/qgenericunixfontdatabase_p.h | 4 +- .../glxconvenience/glxconvenience.pri | 8 --- .../glxconvenience/glxconvenience.pro | 16 +++++ src/platformsupport/graphics/graphics.pri | 2 - src/platformsupport/graphics/graphics.pro | 13 ++++ .../input/evdevkeyboard/qevdevkeyboardmanager_p.h | 2 +- .../input/evdevmouse/qevdevmousemanager.cpp | 2 +- .../input/evdevtablet/qevdevtabletmanager.cpp | 2 +- .../input/evdevtouch/qevdevtouchmanager.cpp | 2 +- src/platformsupport/input/input.pri | 18 ------ src/platformsupport/input/input.pro | 29 +++++++++ src/platformsupport/legacy.cpp | 48 ++++++++++++++ src/platformsupport/legacy.pro | 32 ++++++++++ .../linuxaccessibility/atspiadaptor.cpp | 2 +- .../linuxaccessibility/linuxaccessibility.pri | 25 -------- .../linuxaccessibility/linuxaccessibility.pro | 30 +++++++++ .../platformcompositor/platformcompositor.pri | 7 -- .../platformcompositor/platformcompositor.pro | 18 ++++++ src/platformsupport/platformsupport.pro | 74 ++++++++++++++-------- src/platformsupport/services/services.pri | 3 - src/platformsupport/services/services.pro | 13 ++++ .../themes/genericunix/qgenericunixthemes.cpp | 7 +- src/platformsupport/themes/themes.pri | 9 --- src/platformsupport/themes/themes.pro | 19 ++++++ 46 files changed, 480 insertions(+), 235 deletions(-) delete mode 100644 src/platformsupport/accessibility/accessibility.pri create mode 100644 src/platformsupport/accessibility/accessibility.pro delete mode 100644 src/platformsupport/cglconvenience/cglconvenience.pri create mode 100644 src/platformsupport/cglconvenience/cglconvenience.pro delete mode 100644 src/platformsupport/clipboard/clipboard.pri create mode 100644 src/platformsupport/clipboard/clipboard.pro delete mode 100644 src/platformsupport/devicediscovery/devicediscovery.pri create mode 100644 src/platformsupport/devicediscovery/devicediscovery.pro delete mode 100644 src/platformsupport/eglconvenience/eglconvenience.pri create mode 100644 src/platformsupport/eglconvenience/eglconvenience.pro delete mode 100644 src/platformsupport/eventdispatchers/eventdispatchers.pri create mode 100644 src/platformsupport/eventdispatchers/eventdispatchers.pro delete mode 100644 src/platformsupport/fbconvenience/fbconvenience.pri create mode 100644 src/platformsupport/fbconvenience/fbconvenience.pro delete mode 100644 src/platformsupport/fontdatabases/fontdatabases.pri create mode 100644 src/platformsupport/fontdatabases/fontdatabases.pro delete mode 100644 src/platformsupport/glxconvenience/glxconvenience.pri create mode 100644 src/platformsupport/glxconvenience/glxconvenience.pro delete mode 100644 src/platformsupport/graphics/graphics.pri create mode 100644 src/platformsupport/graphics/graphics.pro delete mode 100644 src/platformsupport/input/input.pri create mode 100644 src/platformsupport/input/input.pro create mode 100644 src/platformsupport/legacy.cpp create mode 100644 src/platformsupport/legacy.pro delete mode 100644 src/platformsupport/linuxaccessibility/linuxaccessibility.pri create mode 100644 src/platformsupport/linuxaccessibility/linuxaccessibility.pro delete mode 100644 src/platformsupport/platformcompositor/platformcompositor.pri create mode 100644 src/platformsupport/platformcompositor/platformcompositor.pro delete mode 100644 src/platformsupport/services/services.pri create mode 100644 src/platformsupport/services/services.pro delete mode 100644 src/platformsupport/themes/themes.pri create mode 100644 src/platformsupport/themes/themes.pro (limited to 'src') diff --git a/src/platformheaders/nativecontexts/qeglnativecontext.h b/src/platformheaders/nativecontexts/qeglnativecontext.h index 67a6d2b808..697b3ef3fd 100644 --- a/src/platformheaders/nativecontexts/qeglnativecontext.h +++ b/src/platformheaders/nativecontexts/qeglnativecontext.h @@ -41,7 +41,7 @@ #define QEGLNATIVECONTEXT_H #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/platformsupport/accessibility/accessibility.pri b/src/platformsupport/accessibility/accessibility.pri deleted file mode 100644 index 924f6a512f..0000000000 --- a/src/platformsupport/accessibility/accessibility.pri +++ /dev/null @@ -1,9 +0,0 @@ -qtConfig(accessibility) { - INCLUDEPATH += $$PWD - - HEADERS += \ - $$PWD/qaccessiblebridgeutils_p.h - - SOURCES += \ - $$PWD/qaccessiblebridgeutils.cpp -} diff --git a/src/platformsupport/accessibility/accessibility.pro b/src/platformsupport/accessibility/accessibility.pro new file mode 100644 index 0000000000..49be899b08 --- /dev/null +++ b/src/platformsupport/accessibility/accessibility.pro @@ -0,0 +1,16 @@ +TARGET = QtAccessibilitySupport +MODULE = accessibility_support + +QT = core-private gui +CONFIG += static internal_module + +DEFINES += QT_NO_CAST_FROM_ASCII +PRECOMPILED_HEADER = ../../corelib/global/qt_pch.h + +HEADERS += \ + qaccessiblebridgeutils_p.h + +SOURCES += \ + qaccessiblebridgeutils.cpp + +load(qt_module) diff --git a/src/platformsupport/cglconvenience/cglconvenience.pri b/src/platformsupport/cglconvenience/cglconvenience.pri deleted file mode 100644 index 1de38bbd08..0000000000 --- a/src/platformsupport/cglconvenience/cglconvenience.pri +++ /dev/null @@ -1,11 +0,0 @@ -osx { - INCLUDEPATH += $$PWD - - HEADERS += \ - $$PWD/cglconvenience_p.h - - OBJECTIVE_SOURCES += \ - $$PWD/cglconvenience.mm - - LIBS_PRIVATE += -framework AppKit -framework OpenGL -} diff --git a/src/platformsupport/cglconvenience/cglconvenience.pro b/src/platformsupport/cglconvenience/cglconvenience.pro new file mode 100644 index 0000000000..0422a844aa --- /dev/null +++ b/src/platformsupport/cglconvenience/cglconvenience.pro @@ -0,0 +1,18 @@ +TARGET = QtCglSupport +MODULE = cgl_support + +QT = core-private gui +CONFIG += static internal_module + +DEFINES += QT_NO_CAST_FROM_ASCII +PRECOMPILED_HEADER = ../../corelib/global/qt_pch.h + +HEADERS += \ + cglconvenience_p.h + +OBJECTIVE_SOURCES += \ + cglconvenience.mm + +LIBS_PRIVATE += -framework AppKit -framework OpenGL + +load(qt_module) diff --git a/src/platformsupport/clipboard/clipboard.pri b/src/platformsupport/clipboard/clipboard.pri deleted file mode 100644 index cb8315d003..0000000000 --- a/src/platformsupport/clipboard/clipboard.pri +++ /dev/null @@ -1,7 +0,0 @@ -mac { - HEADERS += $$PWD/qmacmime_p.h - OBJECTIVE_SOURCES += $$PWD/qmacmime.mm - - osx: LIBS_PRIVATE += -framework AppKit -} - diff --git a/src/platformsupport/clipboard/clipboard.pro b/src/platformsupport/clipboard/clipboard.pro new file mode 100644 index 0000000000..336d81fe46 --- /dev/null +++ b/src/platformsupport/clipboard/clipboard.pro @@ -0,0 +1,15 @@ +TARGET = QtClipboardSupport +MODULE = clipboard_support + +QT = core-private gui +CONFIG += static internal_module + +DEFINES += QT_NO_CAST_FROM_ASCII +PRECOMPILED_HEADER = ../../corelib/global/qt_pch.h + +HEADERS += qmacmime_p.h +SOURCES += qmacmime.mm + +macos: LIBS_PRIVATE += -framework AppKit + +load(qt_module) diff --git a/src/platformsupport/devicediscovery/devicediscovery.pri b/src/platformsupport/devicediscovery/devicediscovery.pri deleted file mode 100644 index f4e9103130..0000000000 --- a/src/platformsupport/devicediscovery/devicediscovery.pri +++ /dev/null @@ -1,13 +0,0 @@ -HEADERS += $$PWD/qdevicediscovery_p.h - -qtConfig(libudev) { - SOURCES += $$PWD/qdevicediscovery_udev.cpp - HEADERS += $$PWD/qdevicediscovery_udev_p.h - QMAKE_USE_PRIVATE += libudev -} else: qtConfig(evdev) { - SOURCES += $$PWD/qdevicediscovery_static.cpp - HEADERS += $$PWD/qdevicediscovery_static_p.h -} else { - SOURCES += $$PWD/qdevicediscovery_dummy.cpp - HEADERS += $$PWD/qdevicediscovery_dummy_p.h -} diff --git a/src/platformsupport/devicediscovery/devicediscovery.pro b/src/platformsupport/devicediscovery/devicediscovery.pro new file mode 100644 index 0000000000..b429b8b97e --- /dev/null +++ b/src/platformsupport/devicediscovery/devicediscovery.pro @@ -0,0 +1,25 @@ +TARGET = QtDeviceDiscoverySupport +MODULE = devicediscovery_support + +QT = core-private +QT_FOR_CONFIG += gui-private +CONFIG += static internal_module + +DEFINES += QT_NO_CAST_FROM_ASCII +PRECOMPILED_HEADER = ../../corelib/global/qt_pch.h + +HEADERS += qdevicediscovery_p.h + +qtConfig(libudev) { + SOURCES += qdevicediscovery_udev.cpp + HEADERS += qdevicediscovery_udev_p.h + QMAKE_USE_PRIVATE += libudev +} else: qtConfig(evdev) { + SOURCES += qdevicediscovery_static.cpp + HEADERS += qdevicediscovery_static_p.h +} else { + SOURCES += qdevicediscovery_dummy.cpp + HEADERS += qdevicediscovery_dummy_p.h +} + +load(qt_module) diff --git a/src/platformsupport/eglconvenience/eglconvenience.pri b/src/platformsupport/eglconvenience/eglconvenience.pri deleted file mode 100644 index 4a93d997fb..0000000000 --- a/src/platformsupport/eglconvenience/eglconvenience.pri +++ /dev/null @@ -1,32 +0,0 @@ -qtConfig(egl) { - HEADERS += \ - $$PWD/qeglconvenience_p.h \ - $$PWD/qeglstreamconvenience_p.h \ - $$PWD/qt_egl_p.h - - SOURCES += \ - $$PWD/qeglconvenience.cpp \ - $$PWD/qeglstreamconvenience.cpp - - qtConfig(opengl) { - HEADERS += $$PWD/qeglplatformcontext_p.h \ - $$PWD/qeglpbuffer_p.h - - SOURCES += $$PWD/qeglplatformcontext.cpp \ - $$PWD/qeglpbuffer.cpp - } - - # Avoid X11 header collision, use generic EGL native types - DEFINES += QT_EGL_NO_X11 - - qtConfig(xlib) { - HEADERS += \ - $$PWD/qxlibeglintegration_p.h - SOURCES += \ - $$PWD/qxlibeglintegration.cpp - LIBS_PRIVATE += $$QMAKE_LIBS_X11 - } - CONFIG += egl - - LIBS_PRIVATE += $$QMAKE_LIBS_DYNLOAD -} diff --git a/src/platformsupport/eglconvenience/eglconvenience.pro b/src/platformsupport/eglconvenience/eglconvenience.pro new file mode 100644 index 0000000000..d364a42b3b --- /dev/null +++ b/src/platformsupport/eglconvenience/eglconvenience.pro @@ -0,0 +1,43 @@ +TARGET = QtEglSupport +MODULE = egl_support + +QT = core-private gui-private +CONFIG += static internal_module + +DEFINES += QT_NO_CAST_FROM_ASCII +PRECOMPILED_HEADER = ../../corelib/global/qt_pch.h + +HEADERS += \ + qeglconvenience_p.h \ + qeglstreamconvenience_p.h \ + qt_egl_p.h + +SOURCES += \ + qeglconvenience.cpp \ + qeglstreamconvenience.cpp + +qtConfig(opengl) { + HEADERS += \ + qeglplatformcontext_p.h \ + qeglpbuffer_p.h + + SOURCES += \ + qeglplatformcontext.cpp \ + qeglpbuffer.cpp +} + +# Avoid X11 header collision, use generic EGL native types +DEFINES += QT_EGL_NO_X11 + +qtConfig(xlib) { + HEADERS += \ + qxlibeglintegration_p.h + SOURCES += \ + qxlibeglintegration.cpp + LIBS_PRIVATE += $$QMAKE_LIBS_X11 +} +CONFIG += egl + +LIBS_PRIVATE += $$QMAKE_LIBS_DYNLOAD + +load(qt_module) diff --git a/src/platformsupport/eglconvenience/qeglconvenience_p.h b/src/platformsupport/eglconvenience/qeglconvenience_p.h index fdd21b8f19..ab2b813515 100644 --- a/src/platformsupport/eglconvenience/qeglconvenience_p.h +++ b/src/platformsupport/eglconvenience/qeglconvenience_p.h @@ -54,7 +54,7 @@ #include #include #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/platformsupport/eglconvenience/qeglpbuffer_p.h b/src/platformsupport/eglconvenience/qeglpbuffer_p.h index 4f9ea9d5f3..38370c0e62 100644 --- a/src/platformsupport/eglconvenience/qeglpbuffer_p.h +++ b/src/platformsupport/eglconvenience/qeglpbuffer_p.h @@ -52,7 +52,7 @@ // #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/platformsupport/eglconvenience/qeglplatformcontext_p.h b/src/platformsupport/eglconvenience/qeglplatformcontext_p.h index f6b2b876f7..9d41eecd99 100644 --- a/src/platformsupport/eglconvenience/qeglplatformcontext_p.h +++ b/src/platformsupport/eglconvenience/qeglplatformcontext_p.h @@ -55,7 +55,7 @@ #include #include #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/platformsupport/eglconvenience/qeglstreamconvenience_p.h b/src/platformsupport/eglconvenience/qeglstreamconvenience_p.h index a4c8245280..6c84f29613 100644 --- a/src/platformsupport/eglconvenience/qeglstreamconvenience_p.h +++ b/src/platformsupport/eglconvenience/qeglstreamconvenience_p.h @@ -52,7 +52,7 @@ // #include -#include +#include // This provides runtime EGLDevice/Output/Stream support even when eglext.h in // the sysroot is not up-to-date. diff --git a/src/platformsupport/eventdispatchers/eventdispatchers.pri b/src/platformsupport/eventdispatchers/eventdispatchers.pri deleted file mode 100644 index fb0f3b3827..0000000000 --- a/src/platformsupport/eventdispatchers/eventdispatchers.pri +++ /dev/null @@ -1,21 +0,0 @@ -unix { -SOURCES +=\ - $$PWD/qunixeventdispatcher.cpp\ - $$PWD/qgenericunixeventdispatcher.cpp\ - -HEADERS +=\ - $$PWD/qunixeventdispatcher_qpa_p.h\ - $$PWD/qgenericunixeventdispatcher_p.h\ -} else: win32 { -SOURCES +=\ - $$PWD/qwindowsguieventdispatcher.cpp - -HEADERS +=\ - $$PWD/qwindowsguieventdispatcher_p.h -} - -qtConfig(glib) { - SOURCES +=$$PWD/qeventdispatcher_glib.cpp - HEADERS +=$$PWD/qeventdispatcher_glib_p.h - QMAKE_USE_PRIVATE += glib -} diff --git a/src/platformsupport/eventdispatchers/eventdispatchers.pro b/src/platformsupport/eventdispatchers/eventdispatchers.pro new file mode 100644 index 0000000000..9d3ac4bbc6 --- /dev/null +++ b/src/platformsupport/eventdispatchers/eventdispatchers.pro @@ -0,0 +1,32 @@ +TARGET = QtEventDispatcherSupport +MODULE = eventdispatcher_support + +QT = core-private gui-private +CONFIG += static internal_module + +DEFINES += QT_NO_CAST_FROM_ASCII +PRECOMPILED_HEADER = ../../corelib/global/qt_pch.h + +unix { + SOURCES += \ + qunixeventdispatcher.cpp \ + qgenericunixeventdispatcher.cpp + + HEADERS += \ + qunixeventdispatcher_qpa_p.h \ + qgenericunixeventdispatcher_p.h +} else { + SOURCES += \ + qwindowsguieventdispatcher.cpp + + HEADERS += \ + qwindowsguieventdispatcher_p.h +} + +qtConfig(glib) { + SOURCES += qeventdispatcher_glib.cpp + HEADERS += qeventdispatcher_glib_p.h + QMAKE_USE_PRIVATE += glib +} + +load(qt_module) diff --git a/src/platformsupport/fbconvenience/fbconvenience.pri b/src/platformsupport/fbconvenience/fbconvenience.pri deleted file mode 100644 index 4634f57fb4..0000000000 --- a/src/platformsupport/fbconvenience/fbconvenience.pri +++ /dev/null @@ -1,11 +0,0 @@ -SOURCES += $$PWD/qfbscreen.cpp \ - $$PWD/qfbbackingstore.cpp \ - $$PWD/qfbwindow.cpp \ - $$PWD/qfbcursor.cpp \ - $$PWD/qfbvthandler.cpp - -HEADERS += $$PWD/qfbscreen_p.h \ - $$PWD/qfbbackingstore_p.h \ - $$PWD/qfbwindow_p.h \ - $$PWD/qfbcursor_p.h \ - $$PWD/qfbvthandler_p.h diff --git a/src/platformsupport/fbconvenience/fbconvenience.pro b/src/platformsupport/fbconvenience/fbconvenience.pro new file mode 100644 index 0000000000..3775906470 --- /dev/null +++ b/src/platformsupport/fbconvenience/fbconvenience.pro @@ -0,0 +1,24 @@ +TARGET = QtFbSupport +MODULE = fb_support + +QT = core-private gui-private +CONFIG += static internal_module + +DEFINES += QT_NO_CAST_FROM_ASCII +PRECOMPILED_HEADER = ../../corelib/global/qt_pch.h + +SOURCES += \ + qfbscreen.cpp \ + qfbbackingstore.cpp \ + qfbwindow.cpp \ + qfbcursor.cpp \ + qfbvthandler.cpp + +HEADERS += \ + qfbscreen_p.h \ + qfbbackingstore_p.h \ + qfbwindow_p.h \ + qfbcursor_p.h \ + qfbvthandler_p.h + +load(qt_module) diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h index 244558b910..f7e3172b65 100644 --- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h +++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase_p.h @@ -52,7 +52,7 @@ // #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/platformsupport/fontdatabases/fontdatabases.pri b/src/platformsupport/fontdatabases/fontdatabases.pri deleted file mode 100644 index 5bf73566d8..0000000000 --- a/src/platformsupport/fontdatabases/fontdatabases.pri +++ /dev/null @@ -1,15 +0,0 @@ -darwin:!if(watchos:CONFIG(simulator, simulator|device)) { - include($$PWD/mac/coretext.pri) -} else { - qtConfig(freetype) { - include($$PWD/basic/basic.pri) - } - - unix { - CONFIG += qpa/genericunixfontdatabase - include($$PWD/genericunix/genericunix.pri) - qtConfig(fontconfig) { - include($$PWD/fontconfig/fontconfig.pri) - } - } -} diff --git a/src/platformsupport/fontdatabases/fontdatabases.pro b/src/platformsupport/fontdatabases/fontdatabases.pro new file mode 100644 index 0000000000..fdfe3f59ea --- /dev/null +++ b/src/platformsupport/fontdatabases/fontdatabases.pro @@ -0,0 +1,26 @@ +TARGET = QtFontDatabaseSupport +MODULE = fontdatabase_support + +QT = core-private gui-private +CONFIG += static internal_module + +DEFINES += QT_NO_CAST_FROM_ASCII +PRECOMPILED_HEADER = ../../corelib/global/qt_pch.h + +darwin:!if(watchos:CONFIG(simulator, simulator|device)) { + include($$PWD/mac/coretext.pri) +} else { + qtConfig(freetype) { + include($$PWD/basic/basic.pri) + } + + unix { + CONFIG += qpa/genericunixfontdatabase + include($$PWD/genericunix/genericunix.pri) + qtConfig(fontconfig) { + include($$PWD/fontconfig/fontconfig.pri) + } + } +} + +load(qt_module) diff --git a/src/platformsupport/fontdatabases/genericunix/qgenericunixfontdatabase_p.h b/src/platformsupport/fontdatabases/genericunix/qgenericunixfontdatabase_p.h index 267ef5e3f2..37c667eeb3 100644 --- a/src/platformsupport/fontdatabases/genericunix/qgenericunixfontdatabase_p.h +++ b/src/platformsupport/fontdatabases/genericunix/qgenericunixfontdatabase_p.h @@ -54,10 +54,10 @@ #include #if QT_CONFIG(fontconfig) -#include +#include typedef QFontconfigDatabase QGenericUnixFontDatabase; #else -#include +#include typedef QBasicFontDatabase QGenericUnixFontDatabase; #endif //Q_FONTCONFIGDATABASE diff --git a/src/platformsupport/glxconvenience/glxconvenience.pri b/src/platformsupport/glxconvenience/glxconvenience.pri deleted file mode 100644 index 80e79ee663..0000000000 --- a/src/platformsupport/glxconvenience/glxconvenience.pri +++ /dev/null @@ -1,8 +0,0 @@ -qtConfig(xlib) { - qtConfig(opengl):!qtConfig(opengles2) { - qtConfig(xrender): QMAKE_USE_PRIVATE += xrender - LIBS_PRIVATE += $$QMAKE_LIBS_X11 - HEADERS += $$PWD/qglxconvenience_p.h - SOURCES += $$PWD/qglxconvenience.cpp - } -} diff --git a/src/platformsupport/glxconvenience/glxconvenience.pro b/src/platformsupport/glxconvenience/glxconvenience.pro new file mode 100644 index 0000000000..185d6b0364 --- /dev/null +++ b/src/platformsupport/glxconvenience/glxconvenience.pro @@ -0,0 +1,16 @@ +TARGET = QtGlxSupport +MODULE = glx_support + +QT = core-private gui-private +CONFIG += static internal_module + +DEFINES += QT_NO_CAST_FROM_ASCII +PRECOMPILED_HEADER = ../../corelib/global/qt_pch.h + +qtConfig(xrender): QMAKE_USE_PRIVATE += xrender +LIBS_PRIVATE += $$QMAKE_LIBS_X11 + +HEADERS += qglxconvenience_p.h +SOURCES += qglxconvenience.cpp + +load(qt_module) diff --git a/src/platformsupport/graphics/graphics.pri b/src/platformsupport/graphics/graphics.pri deleted file mode 100644 index 43062682aa..0000000000 --- a/src/platformsupport/graphics/graphics.pri +++ /dev/null @@ -1,2 +0,0 @@ -HEADERS += $$PWD/qrasterbackingstore_p.h -SOURCES += $$PWD/qrasterbackingstore.cpp diff --git a/src/platformsupport/graphics/graphics.pro b/src/platformsupport/graphics/graphics.pro new file mode 100644 index 0000000000..878fca7f49 --- /dev/null +++ b/src/platformsupport/graphics/graphics.pro @@ -0,0 +1,13 @@ +TARGET = QtGraphicsSupport +MODULE = graphics_support + +QT = core-private gui-private +CONFIG += static internal_module + +DEFINES += QT_NO_CAST_FROM_ASCII +PRECOMPILED_HEADER = ../../corelib/global/qt_pch.h + +HEADERS += $$PWD/qrasterbackingstore_p.h +SOURCES += $$PWD/qrasterbackingstore.cpp + +load(qt_module) diff --git a/src/platformsupport/input/evdevkeyboard/qevdevkeyboardmanager_p.h b/src/platformsupport/input/evdevkeyboard/qevdevkeyboardmanager_p.h index 01f23f2542..d2e34fead3 100644 --- a/src/platformsupport/input/evdevkeyboard/qevdevkeyboardmanager_p.h +++ b/src/platformsupport/input/evdevkeyboard/qevdevkeyboardmanager_p.h @@ -53,7 +53,7 @@ #include "qevdevkeyboardhandler_p.h" -#include +#include #include #include diff --git a/src/platformsupport/input/evdevmouse/qevdevmousemanager.cpp b/src/platformsupport/input/evdevmouse/qevdevmousemanager.cpp index 2d96691b09..b2f3fe5787 100644 --- a/src/platformsupport/input/evdevmouse/qevdevmousemanager.cpp +++ b/src/platformsupport/input/evdevmouse/qevdevmousemanager.cpp @@ -44,7 +44,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/platformsupport/input/evdevtablet/qevdevtabletmanager.cpp b/src/platformsupport/input/evdevtablet/qevdevtabletmanager.cpp index 89a60df98d..4b00424e92 100644 --- a/src/platformsupport/input/evdevtablet/qevdevtabletmanager.cpp +++ b/src/platformsupport/input/evdevtablet/qevdevtabletmanager.cpp @@ -43,7 +43,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/platformsupport/input/evdevtouch/qevdevtouchmanager.cpp b/src/platformsupport/input/evdevtouch/qevdevtouchmanager.cpp index d0c6c10224..ab71d08fb1 100644 --- a/src/platformsupport/input/evdevtouch/qevdevtouchmanager.cpp +++ b/src/platformsupport/input/evdevtouch/qevdevtouchmanager.cpp @@ -43,7 +43,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/platformsupport/input/input.pri b/src/platformsupport/input/input.pri deleted file mode 100644 index eb4d8a983d..0000000000 --- a/src/platformsupport/input/input.pri +++ /dev/null @@ -1,18 +0,0 @@ -qtConfig(evdev) { - include($$PWD/evdevmouse/evdevmouse.pri) - include($$PWD/evdevkeyboard/evdevkeyboard.pri) - include($$PWD/evdevtouch/evdevtouch.pri) - include($$PWD/evdevtablet/evdevtablet.pri) -} - -qtConfig(tslib) { - include($$PWD/tslib/tslib.pri) -} - -qtConfig(libinput) { - include($$PWD/libinput/libinput.pri) -} - -qtConfig(evdev)|qtConfig(libinput) { - include($$PWD/shared/shared.pri) -} diff --git a/src/platformsupport/input/input.pro b/src/platformsupport/input/input.pro new file mode 100644 index 0000000000..2c2ace6780 --- /dev/null +++ b/src/platformsupport/input/input.pro @@ -0,0 +1,29 @@ +TARGET = QtInputSupport +MODULE = input_support + +QT = core-private gui-private devicediscovery_support-private +CONFIG += static internal_module + +DEFINES += QT_NO_CAST_FROM_ASCII +PRECOMPILED_HEADER = ../../corelib/global/qt_pch.h + +qtConfig(evdev) { + include($$PWD/evdevmouse/evdevmouse.pri) + include($$PWD/evdevkeyboard/evdevkeyboard.pri) + include($$PWD/evdevtouch/evdevtouch.pri) + include($$PWD/evdevtablet/evdevtablet.pri) +} + +qtConfig(tslib) { + include($$PWD/tslib/tslib.pri) +} + +qtConfig(libinput) { + include($$PWD/libinput/libinput.pri) +} + +qtConfig(evdev)|qtConfig(libinput) { + include($$PWD/shared/shared.pri) +} + +load(qt_module) diff --git a/src/platformsupport/legacy.cpp b/src/platformsupport/legacy.cpp new file mode 100644 index 0000000000..49def2ecca --- /dev/null +++ b/src/platformsupport/legacy.cpp @@ -0,0 +1,48 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +QT_BEGIN_NAMESPACE + +void dummy() +{ +} + +QT_END_NAMESPACE diff --git a/src/platformsupport/legacy.pro b/src/platformsupport/legacy.pro new file mode 100644 index 0000000000..042f16301d --- /dev/null +++ b/src/platformsupport/legacy.pro @@ -0,0 +1,32 @@ +TARGET = QtPlatformSupport +MODULE = platformsupport + +QT_FOR_CONFIG += gui-private +CONFIG += static internal_module + +SOURCES += legacy.cpp + +mods = \ + accessibility \ + cgl \ + clipboard \ + devicediscovery \ + egl \ + eventdispatcher \ + fb \ + fontdatabase \ + glx \ + graphics \ + input \ + linuxaccessibility \ + platformcompositor \ + service \ + theme + +for (mod, mods) { + mod = $${mod}_support-private + qtHaveModule($$mod): \ + QT += $$mod +} + +load(qt_module) diff --git a/src/platformsupport/linuxaccessibility/atspiadaptor.cpp b/src/platformsupport/linuxaccessibility/atspiadaptor.cpp index f6c126a771..70c4aa563c 100644 --- a/src/platformsupport/linuxaccessibility/atspiadaptor.cpp +++ b/src/platformsupport/linuxaccessibility/atspiadaptor.cpp @@ -50,7 +50,7 @@ #ifndef QT_NO_ACCESSIBILITY #include "socket_interface.h" #include "constant_mappings_p.h" -#include "../accessibility/qaccessiblebridgeutils_p.h" +#include #include "application_p.h" /*! diff --git a/src/platformsupport/linuxaccessibility/linuxaccessibility.pri b/src/platformsupport/linuxaccessibility/linuxaccessibility.pri deleted file mode 100644 index 1f36b815cf..0000000000 --- a/src/platformsupport/linuxaccessibility/linuxaccessibility.pri +++ /dev/null @@ -1,25 +0,0 @@ -qtConfig(accessibility-atspi-bridge) { - - QT_FOR_PRIVATE += dbus - include(../../3rdparty/atspi2/atspi2.pri) - - INCLUDEPATH += $$PWD - - HEADERS += \ - $$PWD/application_p.h \ - $$PWD/bridge_p.h \ - $$PWD/cache_p.h \ - $$PWD/struct_marshallers_p.h \ - $$PWD/constant_mappings_p.h \ - $$PWD/dbusconnection_p.h \ - $$PWD/atspiadaptor_p.h - - SOURCES += \ - $$PWD/application.cpp \ - $$PWD/bridge.cpp \ - $$PWD/cache.cpp \ - $$PWD/struct_marshallers.cpp \ - $$PWD/constant_mappings.cpp \ - $$PWD/dbusconnection.cpp \ - $$PWD/atspiadaptor.cpp -} diff --git a/src/platformsupport/linuxaccessibility/linuxaccessibility.pro b/src/platformsupport/linuxaccessibility/linuxaccessibility.pro new file mode 100644 index 0000000000..6d68909047 --- /dev/null +++ b/src/platformsupport/linuxaccessibility/linuxaccessibility.pro @@ -0,0 +1,30 @@ +TARGET = QtLinuxAccessibilitySupport +MODULE = linuxaccessibility_support + +QT = core-private dbus gui-private accessibility_support-private +CONFIG += static internal_module + +DEFINES += QT_NO_CAST_FROM_ASCII +PRECOMPILED_HEADER = ../../corelib/global/qt_pch.h + +include(../../3rdparty/atspi2/atspi2.pri) + +HEADERS += \ + application_p.h \ + bridge_p.h \ + cache_p.h \ + struct_marshallers_p.h \ + constant_mappings_p.h \ + dbusconnection_p.h \ + atspiadaptor_p.h + +SOURCES += \ + application.cpp \ + bridge.cpp \ + cache.cpp \ + struct_marshallers.cpp \ + constant_mappings.cpp \ + dbusconnection.cpp \ + atspiadaptor.cpp + +load(qt_module) diff --git a/src/platformsupport/platformcompositor/platformcompositor.pri b/src/platformsupport/platformcompositor/platformcompositor.pri deleted file mode 100644 index 1e908c9998..0000000000 --- a/src/platformsupport/platformcompositor/platformcompositor.pri +++ /dev/null @@ -1,7 +0,0 @@ -qtConfig(opengl) { - SOURCES += $$PWD/qopenglcompositor.cpp \ - $$PWD/qopenglcompositorbackingstore.cpp - - HEADERS += $$PWD/qopenglcompositor_p.h \ - $$PWD/qopenglcompositorbackingstore_p.h -} diff --git a/src/platformsupport/platformcompositor/platformcompositor.pro b/src/platformsupport/platformcompositor/platformcompositor.pro new file mode 100644 index 0000000000..633e71fb9d --- /dev/null +++ b/src/platformsupport/platformcompositor/platformcompositor.pro @@ -0,0 +1,18 @@ +TARGET = QtPlatformCompositorSupport +MODULE = platformcompositor_support + +QT = core-private gui-private +CONFIG += static internal_module + +DEFINES += QT_NO_CAST_FROM_ASCII +PRECOMPILED_HEADER = ../../corelib/global/qt_pch.h + +SOURCES += \ + qopenglcompositor.cpp \ + qopenglcompositorbackingstore.cpp + +HEADERS += \ + qopenglcompositor_p.h \ + qopenglcompositorbackingstore_p.h + +load(qt_module) diff --git a/src/platformsupport/platformsupport.pro b/src/platformsupport/platformsupport.pro index f9b57acaa8..5161ce3520 100644 --- a/src/platformsupport/platformsupport.pro +++ b/src/platformsupport/platformsupport.pro @@ -1,27 +1,47 @@ -TARGET = QtPlatformSupport -QT = core-private gui-private - -CONFIG += static internal_module -mac:LIBS_PRIVATE += -lz - -DEFINES += QT_NO_CAST_FROM_ASCII -PRECOMPILED_HEADER = ../corelib/global/qt_pch.h - -include(cglconvenience/cglconvenience.pri) -include(eglconvenience/eglconvenience.pri) -include(eventdispatchers/eventdispatchers.pri) -include(fbconvenience/fbconvenience.pri) -include(fontdatabases/fontdatabases.pri) -include(glxconvenience/glxconvenience.pri) -include(input/input.pri) -include(devicediscovery/devicediscovery.pri) -include(services/services.pri) -include(themes/themes.pri) -include(accessibility/accessibility.pri) -include(linuxaccessibility/linuxaccessibility.pri) -include(clipboard/clipboard.pri) -include(platformcompositor/platformcompositor.pri) - -darwin: include(graphics/graphics.pri) - -load(qt_module) +TEMPLATE = subdirs +QT_FOR_CONFIG += gui-private + +SUBDIRS = \ + eventdispatchers \ + devicediscovery \ + fbconvenience \ + themes + +qtConfig(freetype)|if(darwin:!if(watchos:CONFIG(simulator, simulator|device))): \ + SUBDIRS += fontdatabases + +qtConfig(evdev)|qtConfig(tslib)|qtConfig(libinput) { + SUBDIRS += input + input.depends += devicediscovery +} + +unix:!darwin: \ + SUBDIRS += services + +qtConfig(opengl): \ + SUBDIRS += platformcompositor +qtConfig(egl): \ + SUBDIRS += eglconvenience +qtConfig(xlib):qtConfig(opengl):!qtConfig(opengles2): \ + SUBDIRS += glxconvenience + +qtConfig(accessibility) { + SUBDIRS += accessibility + qtConfig(accessibility-atspi-bridge) { + SUBDIRS += linuxaccessibility + linuxaccessibility.depends += accessibility + } +} + +darwin { + SUBDIRS += \ + clipboard \ + graphics + macos: \ + SUBDIRS += cglconvenience +} + +# This aggregates all of them. +legacy.file = legacy.pro +legacy.depends = $$SUBDIRS +SUBDIRS += legacy diff --git a/src/platformsupport/services/services.pri b/src/platformsupport/services/services.pri deleted file mode 100644 index adee852626..0000000000 --- a/src/platformsupport/services/services.pri +++ /dev/null @@ -1,3 +0,0 @@ -unix:!mac { - include($$PWD/genericunix/genericunix.pri) -} diff --git a/src/platformsupport/services/services.pro b/src/platformsupport/services/services.pro new file mode 100644 index 0000000000..91957a0a78 --- /dev/null +++ b/src/platformsupport/services/services.pro @@ -0,0 +1,13 @@ +TARGET = QtServiceSupport +MODULE = service_support + +QT = core-private gui-private +CONFIG += static internal_module + +DEFINES += QT_NO_CAST_FROM_ASCII +PRECOMPILED_HEADER = ../../corelib/global/qt_pch.h + +unix:!darwin: \ + include($$PWD/genericunix/genericunix.pri) + +load(qt_module) diff --git a/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp b/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp index db264d1b22..1e1b1af4b5 100644 --- a/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp +++ b/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp @@ -38,7 +38,6 @@ ****************************************************************************/ #include "qgenericunixthemes_p.h" -#include "../../services/genericunix/qgenericunixservices_p.h" #include "qpa/qplatformtheme_p.h" @@ -61,11 +60,11 @@ #include #include #ifndef QT_NO_DBUS -#include "QtPlatformSupport/private/qdbusplatformmenu_p.h" -#include "QtPlatformSupport/private/qdbusmenubar_p.h" +#include "qdbusplatformmenu_p.h" +#include "qdbusmenubar_p.h" #endif #if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON) -#include "QtPlatformSupport/private/qdbustrayicon_p.h" +#include "qdbustrayicon_p.h" #endif #include diff --git a/src/platformsupport/themes/themes.pri b/src/platformsupport/themes/themes.pri deleted file mode 100644 index 552973431f..0000000000 --- a/src/platformsupport/themes/themes.pri +++ /dev/null @@ -1,9 +0,0 @@ -unix:!mac { - include($$PWD/genericunix/genericunix.pri) -} - -HEADERS += \ - $$PWD/qabstractfileiconengine_p.h - -SOURCES += \ - $$PWD/qabstractfileiconengine.cpp diff --git a/src/platformsupport/themes/themes.pro b/src/platformsupport/themes/themes.pro new file mode 100644 index 0000000000..2aeb1f89ad --- /dev/null +++ b/src/platformsupport/themes/themes.pro @@ -0,0 +1,19 @@ +TARGET = QtThemeSupport +MODULE = theme_support + +QT = core-private gui-private +CONFIG += static internal_module + +DEFINES += QT_NO_CAST_FROM_ASCII +PRECOMPILED_HEADER = ../../corelib/global/qt_pch.h + +unix:!darwin: \ + include($$PWD/genericunix/genericunix.pri) + +HEADERS += \ + qabstractfileiconengine_p.h + +SOURCES += \ + qabstractfileiconengine.cpp + +load(qt_module) -- cgit v1.2.3 From 135fcd599200cdacf637b5c77824776c3fb181d1 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 30 Sep 2016 13:08:03 +0200 Subject: port to modularized platformsupport libraries Change-Id: I20eb0e33abfd70b6a5240e7b6b0aa0425f2d2ee7 Reviewed-by: Jake Petroules --- .../generic/evdevkeyboard/evdevkeyboard.pro | 2 +- src/plugins/generic/evdevkeyboard/main.cpp | 2 +- src/plugins/generic/evdevmouse/evdevmouse.pro | 2 +- src/plugins/generic/evdevmouse/main.cpp | 2 +- src/plugins/generic/evdevtablet/evdevtablet.pro | 2 +- src/plugins/generic/evdevtablet/main.cpp | 2 +- src/plugins/generic/evdevtouch/evdevtouch.pro | 2 +- src/plugins/generic/evdevtouch/main.cpp | 2 +- src/plugins/generic/libinput/libinput.pro | 2 +- src/plugins/generic/libinput/main.cpp | 2 +- src/plugins/generic/tslib/main.cpp | 2 +- src/plugins/generic/tslib/tslib.pro | 2 +- src/plugins/platforms/android/android.pro | 5 +++- .../platforms/android/androidjniaccessibility.cpp | 2 +- .../platforms/android/qandroideventdispatcher.h | 2 +- .../android/qandroidplatformfontdatabase.h | 2 +- .../android/qandroidplatformintegration.cpp | 2 +- .../android/qandroidplatformopenglcontext.cpp | 2 +- .../android/qandroidplatformopenglcontext.h | 2 +- .../android/qandroidplatformopenglwindow.cpp | 2 +- src/plugins/platforms/bsdfb/bsdfb.pro | 8 ++++++- src/plugins/platforms/bsdfb/qbsdfbintegration.cpp | 16 ++++++------- src/plugins/platforms/bsdfb/qbsdfbscreen.cpp | 4 ++-- src/plugins/platforms/bsdfb/qbsdfbscreen.h | 2 +- src/plugins/platforms/cocoa/cocoa.pro | 5 +++- .../platforms/cocoa/qcocoaaccessibilityelement.mm | 2 +- src/plugins/platforms/cocoa/qcocoabackingstore.h | 2 +- src/plugins/platforms/cocoa/qcocoaglcontext.mm | 2 +- src/plugins/platforms/cocoa/qcocoaintegration.h | 2 +- src/plugins/platforms/cocoa/qcocoamimetypes.mm | 2 +- src/plugins/platforms/cocoa/qcocoatheme.mm | 4 ++-- src/plugins/platforms/cocoa/qmacclipboard.h | 2 +- src/plugins/platforms/direct2d/direct2d.pro | 6 ++--- .../direct2d/qwindowsdirect2dintegration.cpp | 2 +- src/plugins/platforms/directfb/directfb.pro | 5 +++- src/plugins/platforms/directfb/qdirectfb_egl.cpp | 6 ++--- .../platforms/directfb/qdirectfbintegration.cpp | 6 ++--- src/plugins/platforms/eglfs/api/qeglfscontext.cpp | 4 ++-- src/plugins/platforms/eglfs/api/qeglfscontext_p.h | 2 +- .../eglfs/api/qeglfsdeviceintegration.cpp | 2 +- src/plugins/platforms/eglfs/api/qeglfsglobal_p.h | 2 +- .../platforms/eglfs/api/qeglfsintegration.cpp | 28 +++++++++++----------- .../platforms/eglfs/api/qeglfsoffscreenwindow.cpp | 2 +- src/plugins/platforms/eglfs/api/qeglfsscreen.cpp | 2 +- src/plugins/platforms/eglfs/api/qeglfswindow.cpp | 4 ++-- src/plugins/platforms/eglfs/api/qeglfswindow_p.h | 2 +- .../deviceintegration/eglfs_brcm/eglfs_brcm.pro | 2 +- .../deviceintegration/eglfs_kms/eglfs_kms.pro | 2 +- .../eglfs_kms/qeglfskmsgbmintegration.cpp | 2 +- .../eglfs_kms/qeglfskmsgbmscreen.cpp | 2 +- .../eglfs_kms_egldevice/eglfs_kms_egldevice.pro | 2 +- .../qeglfskmsegldeviceintegration.cpp | 2 +- .../qeglfskmsegldeviceintegration.h | 2 +- .../eglfs_kms_support/eglfs_kms_support.pro | 2 +- .../eglfs_kms_support/qeglfskmsscreen.cpp | 2 +- .../deviceintegration/eglfs_mali/eglfs_mali.pro | 2 +- .../deviceintegration/eglfs_viv/eglfs_viv.pro | 2 +- .../eglfs_viv_wl/eglfs_viv_wl.pro | 2 +- .../deviceintegration/eglfs_x11/eglfs_x11.pro | 2 +- src/plugins/platforms/eglfs/eglfs-plugin.pro | 2 +- .../platforms/eglfs/eglfsdeviceintegration.pro | 14 ++++++++++- src/plugins/platforms/haiku/haiku.pro | 2 +- src/plugins/platforms/haiku/qhaikuintegration.cpp | 2 +- src/plugins/platforms/integrity/integrity.pro | 5 +++- .../integrity/qintegrityfbintegration.cpp | 12 +++++----- .../platforms/integrity/qintegrityfbscreen.cpp | 4 ++-- .../platforms/integrity/qintegrityfbscreen.h | 2 +- src/plugins/platforms/ios/ios.pro | 5 +++- src/plugins/platforms/ios/qiosbackingstore.h | 2 +- src/plugins/platforms/ios/qiosclipboard.mm | 2 +- src/plugins/platforms/ios/qiosintegration.mm | 4 ++-- src/plugins/platforms/ios/qiostheme.mm | 2 +- src/plugins/platforms/linuxfb/linuxfb.pro | 8 ++++++- .../platforms/linuxfb/qlinuxfbintegration.cpp | 24 +++++++++---------- src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp | 4 ++-- src/plugins/platforms/linuxfb/qlinuxfbscreen.h | 2 +- src/plugins/platforms/minimal/minimal.pro | 4 +++- .../platforms/minimal/qminimalintegration.cpp | 6 ++--- src/plugins/platforms/minimalegl/minimalegl.pro | 4 +++- .../minimalegl/qminimaleglintegration.cpp | 8 +++---- .../platforms/minimalegl/qminimaleglscreen.cpp | 4 ++-- .../platforms/minimalegl/qminimaleglscreen.h | 2 +- src/plugins/platforms/mirclient/mirclient.pro | 5 +++- .../platforms/mirclient/qmirclientglcontext.cpp | 2 +- .../platforms/mirclient/qmirclientintegration.cpp | 4 ++-- .../mirclient/qmirclientplatformservices.h | 4 ++-- .../platforms/mirclient/qmirclientscreen.cpp | 2 +- src/plugins/platforms/mirclient/qmirclienttheme.h | 2 +- src/plugins/platforms/offscreen/offscreen.pro | 5 +++- .../platforms/offscreen/qoffscreenintegration.cpp | 6 ++--- .../offscreen/qoffscreenintegration_x11.cpp | 2 +- src/plugins/platforms/openwfd/openwf.pro | 4 +++- .../platforms/openwfd/qopenwfdintegration.cpp | 4 ++-- src/plugins/platforms/qnx/qnx.pro | 4 +++- src/plugins/platforms/vnc/qvncintegration.cpp | 14 +++++------ src/plugins/platforms/vnc/qvncscreen.cpp | 4 ++-- src/plugins/platforms/vnc/qvncscreen.h | 2 +- src/plugins/platforms/vnc/vnc.pro | 8 ++++++- .../platforms/windows/accessible/iaccessible2.cpp | 2 +- .../platforms/windows/qwindowsclipboard.cpp | 2 +- src/plugins/platforms/windows/qwindowscontext.cpp | 2 +- .../platforms/windows/qwindowsfontdatabase_ft.h | 2 +- .../platforms/windows/qwindowsintegration.cpp | 2 +- .../platforms/windows/qwindowskeymapper.cpp | 2 +- src/plugins/platforms/windows/qwindowstheme.cpp | 2 +- src/plugins/platforms/windows/windows.pro | 7 +++--- src/plugins/platforms/winrt/qwinrteglcontext.cpp | 4 ++-- src/plugins/platforms/winrt/qwinrtfontdatabase.h | 2 +- src/plugins/platforms/winrt/qwinrtintegration.cpp | 2 +- src/plugins/platforms/winrt/qwinrtwindow.cpp | 2 +- src/plugins/platforms/winrt/winrt.pro | 4 +++- .../gl_integrations_plugin_base.pri | 2 +- .../xcb/gl_integrations/xcb_egl/qxcbeglcontext.h | 4 ++-- .../xcb/gl_integrations/xcb_egl/qxcbeglinclude.h | 2 +- .../gl_integrations/xcb_egl/qxcbeglintegration.cpp | 2 +- .../xcb/gl_integrations/xcb_egl/qxcbeglwindow.cpp | 4 ++-- .../xcb/gl_integrations/xcb_egl/xcb_egl.pro | 1 + .../gl_integrations/xcb_glx/qglxintegration.cpp | 2 +- .../xcb/gl_integrations/xcb_glx/qxcbglxwindow.cpp | 2 +- .../xcb/gl_integrations/xcb_glx/xcb_glx.pro | 1 + src/plugins/platforms/xcb/qxcbintegration.cpp | 8 +++---- src/plugins/platforms/xcb/xcb-plugin.pro | 2 +- src/plugins/platforms/xcb/xcb_qpa_lib.pro | 8 ++++++- src/plugins/platformthemes/gtk3/gtk3.pro | 2 +- 124 files changed, 267 insertions(+), 197 deletions(-) (limited to 'src') diff --git a/src/plugins/generic/evdevkeyboard/evdevkeyboard.pro b/src/plugins/generic/evdevkeyboard/evdevkeyboard.pro index d23ad3bad0..73fddf4d26 100644 --- a/src/plugins/generic/evdevkeyboard/evdevkeyboard.pro +++ b/src/plugins/generic/evdevkeyboard/evdevkeyboard.pro @@ -1,6 +1,6 @@ TARGET = qevdevkeyboardplugin -QT += core-private platformsupport-private gui-private +QT += core-private gui-private input_support-private SOURCES = main.cpp diff --git a/src/plugins/generic/evdevkeyboard/main.cpp b/src/plugins/generic/evdevkeyboard/main.cpp index 7fd6feaecc..ef08cd56ab 100644 --- a/src/plugins/generic/evdevkeyboard/main.cpp +++ b/src/plugins/generic/evdevkeyboard/main.cpp @@ -38,7 +38,7 @@ ****************************************************************************/ #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/generic/evdevmouse/evdevmouse.pro b/src/plugins/generic/evdevmouse/evdevmouse.pro index 1a0bc08853..f3a8558ef2 100644 --- a/src/plugins/generic/evdevmouse/evdevmouse.pro +++ b/src/plugins/generic/evdevmouse/evdevmouse.pro @@ -1,6 +1,6 @@ TARGET = qevdevmouseplugin -QT += core-private platformsupport-private gui-private +QT += core-private gui-private input_support-private SOURCES = main.cpp diff --git a/src/plugins/generic/evdevmouse/main.cpp b/src/plugins/generic/evdevmouse/main.cpp index 88c29366fa..86ec7cb575 100644 --- a/src/plugins/generic/evdevmouse/main.cpp +++ b/src/plugins/generic/evdevmouse/main.cpp @@ -38,7 +38,7 @@ ****************************************************************************/ #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/generic/evdevtablet/evdevtablet.pro b/src/plugins/generic/evdevtablet/evdevtablet.pro index aaf0ef4c67..1409cd83c9 100644 --- a/src/plugins/generic/evdevtablet/evdevtablet.pro +++ b/src/plugins/generic/evdevtablet/evdevtablet.pro @@ -2,7 +2,7 @@ TARGET = qevdevtabletplugin SOURCES = main.cpp -QT += core-private platformsupport-private gui-private +QT += core-private gui-private input_support-private OTHER_FILES += \ evdevtablet.json diff --git a/src/plugins/generic/evdevtablet/main.cpp b/src/plugins/generic/evdevtablet/main.cpp index cf8dc15c6e..0646d71146 100644 --- a/src/plugins/generic/evdevtablet/main.cpp +++ b/src/plugins/generic/evdevtablet/main.cpp @@ -38,7 +38,7 @@ ****************************************************************************/ #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/generic/evdevtouch/evdevtouch.pro b/src/plugins/generic/evdevtouch/evdevtouch.pro index 4d61db4eb0..3ca646aaca 100644 --- a/src/plugins/generic/evdevtouch/evdevtouch.pro +++ b/src/plugins/generic/evdevtouch/evdevtouch.pro @@ -2,7 +2,7 @@ TARGET = qevdevtouchplugin SOURCES = main.cpp -QT += core-private platformsupport-private gui-private +QT += core-private gui-private input_support-private OTHER_FILES += \ evdevtouch.json diff --git a/src/plugins/generic/evdevtouch/main.cpp b/src/plugins/generic/evdevtouch/main.cpp index 411bf3d7a0..aa60614936 100644 --- a/src/plugins/generic/evdevtouch/main.cpp +++ b/src/plugins/generic/evdevtouch/main.cpp @@ -38,7 +38,7 @@ ****************************************************************************/ #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/generic/libinput/libinput.pro b/src/plugins/generic/libinput/libinput.pro index 335605d354..434bf7b945 100644 --- a/src/plugins/generic/libinput/libinput.pro +++ b/src/plugins/generic/libinput/libinput.pro @@ -1,6 +1,6 @@ TARGET = qlibinputplugin -QT += core-private platformsupport-private gui-private +QT += core-private gui-private input_support-private SOURCES = main.cpp diff --git a/src/plugins/generic/libinput/main.cpp b/src/plugins/generic/libinput/main.cpp index e40fdd0097..6d1e76c0f0 100644 --- a/src/plugins/generic/libinput/main.cpp +++ b/src/plugins/generic/libinput/main.cpp @@ -38,7 +38,7 @@ ****************************************************************************/ #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/generic/tslib/main.cpp b/src/plugins/generic/tslib/main.cpp index c5e0c720fc..fb9e0c35f3 100644 --- a/src/plugins/generic/tslib/main.cpp +++ b/src/plugins/generic/tslib/main.cpp @@ -38,7 +38,7 @@ ****************************************************************************/ #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/generic/tslib/tslib.pro b/src/plugins/generic/tslib/tslib.pro index d6a0eea3a0..7c3a0bf607 100644 --- a/src/plugins/generic/tslib/tslib.pro +++ b/src/plugins/generic/tslib/tslib.pro @@ -2,7 +2,7 @@ TARGET = qtslibplugin SOURCES = main.cpp -QT += gui-private platformsupport-private +QT += core-private gui-private input_support-private QMAKE_USE += tslib diff --git a/src/plugins/platforms/android/android.pro b/src/plugins/platforms/android/android.pro index 544b2ca63a..5912edc847 100644 --- a/src/plugins/platforms/android/android.pro +++ b/src/plugins/platforms/android/android.pro @@ -6,7 +6,10 @@ DEFINES += QT_STATICPLUGIN LIBS += -ljnigraphics -landroid -QT += core-private gui-private platformsupport-private +QT += \ + core-private gui-private \ + eventdispatcher_support-private accessibility_support-private \ + fontdatabase_support-private egl_support-private CONFIG += qpa/genericunixfontdatabase diff --git a/src/plugins/platforms/android/androidjniaccessibility.cpp b/src/plugins/platforms/android/androidjniaccessibility.cpp index e8536235d7..a987092862 100644 --- a/src/plugins/platforms/android/androidjniaccessibility.cpp +++ b/src/plugins/platforms/android/androidjniaccessibility.cpp @@ -41,7 +41,7 @@ #include "androidjnimain.h" #include "qandroidplatformintegration.h" #include "qpa/qplatformaccessibility.h" -#include +#include #include "qguiapplication.h" #include "qwindow.h" #include "qrect.h" diff --git a/src/plugins/platforms/android/qandroideventdispatcher.h b/src/plugins/platforms/android/qandroideventdispatcher.h index 227027f3c3..86a7e460b3 100644 --- a/src/plugins/platforms/android/qandroideventdispatcher.h +++ b/src/plugins/platforms/android/qandroideventdispatcher.h @@ -42,7 +42,7 @@ #include #include -#include +#include class QAndroidEventDispatcher : public QUnixEventDispatcherQPA { diff --git a/src/plugins/platforms/android/qandroidplatformfontdatabase.h b/src/plugins/platforms/android/qandroidplatformfontdatabase.h index a00a3730fb..b20fd75cb2 100644 --- a/src/plugins/platforms/android/qandroidplatformfontdatabase.h +++ b/src/plugins/platforms/android/qandroidplatformfontdatabase.h @@ -40,7 +40,7 @@ #ifndef QANDROIDPLATFORMFONTDATABASE_H #define QANDROIDPLATFORMFONTDATABASE_H -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/android/qandroidplatformintegration.cpp b/src/plugins/platforms/android/qandroidplatformintegration.cpp index e10bd95e12..6669ee3176 100644 --- a/src/plugins/platforms/android/qandroidplatformintegration.cpp +++ b/src/plugins/platforms/android/qandroidplatformintegration.cpp @@ -46,7 +46,7 @@ #include #include -#include +#include #include #include #include diff --git a/src/plugins/platforms/android/qandroidplatformopenglcontext.cpp b/src/plugins/platforms/android/qandroidplatformopenglcontext.cpp index 80693acf88..2644fa27f6 100644 --- a/src/plugins/platforms/android/qandroidplatformopenglcontext.cpp +++ b/src/plugins/platforms/android/qandroidplatformopenglcontext.cpp @@ -42,7 +42,7 @@ #include "qandroidplatformopenglwindow.h" #include "qandroidplatformintegration.h" -#include +#include #include #include diff --git a/src/plugins/platforms/android/qandroidplatformopenglcontext.h b/src/plugins/platforms/android/qandroidplatformopenglcontext.h index c88dbf327b..d3f6cf13a4 100644 --- a/src/plugins/platforms/android/qandroidplatformopenglcontext.h +++ b/src/plugins/platforms/android/qandroidplatformopenglcontext.h @@ -41,7 +41,7 @@ #ifndef QANDROIDPLATFORMOPENGLCONTEXT_H #define QANDROIDPLATFORMOPENGLCONTEXT_H -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp b/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp index 7801629633..3e1cfe305d 100644 --- a/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp +++ b/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp @@ -50,7 +50,7 @@ #include #include -#include +#include #include #include diff --git a/src/plugins/platforms/bsdfb/bsdfb.pro b/src/plugins/platforms/bsdfb/bsdfb.pro index c24d8dd9e5..294edcd35d 100644 --- a/src/plugins/platforms/bsdfb/bsdfb.pro +++ b/src/plugins/platforms/bsdfb/bsdfb.pro @@ -1,6 +1,12 @@ TARGET = qbsdfb -QT += core-private gui-private platformsupport-private +QT += \ + core-private gui-private \ + service_support-private eventdispatcher_support-private \ + fontdatabase_support-private fb_support-private + +qtHaveModule(input_support-private): \ + QT += input_support-private SOURCES = main.cpp qbsdfbintegration.cpp qbsdfbscreen.cpp HEADERS = qbsdfbintegration.h qbsdfbscreen.h diff --git a/src/plugins/platforms/bsdfb/qbsdfbintegration.cpp b/src/plugins/platforms/bsdfb/qbsdfbintegration.cpp index 9c25076c9c..1fa13183f8 100644 --- a/src/plugins/platforms/bsdfb/qbsdfbintegration.cpp +++ b/src/plugins/platforms/bsdfb/qbsdfbintegration.cpp @@ -35,21 +35,21 @@ #include "qbsdfbintegration.h" #include "qbsdfbscreen.h" -#include -#include -#include +#include +#include +#include -#include -#include -#include -#include +#include +#include +#include +#include #include #include #include #if QT_CONFIG(tslib) -#include +#include #endif QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/bsdfb/qbsdfbscreen.cpp b/src/plugins/platforms/bsdfb/qbsdfbscreen.cpp index ee2dce6867..0ef57d37e5 100644 --- a/src/plugins/platforms/bsdfb/qbsdfbscreen.cpp +++ b/src/plugins/platforms/bsdfb/qbsdfbscreen.cpp @@ -33,8 +33,8 @@ ****************************************************************************/ #include "qbsdfbscreen.h" -#include -#include +#include +#include #include #include diff --git a/src/plugins/platforms/bsdfb/qbsdfbscreen.h b/src/plugins/platforms/bsdfb/qbsdfbscreen.h index 0d9964afd5..3e244e3460 100644 --- a/src/plugins/platforms/bsdfb/qbsdfbscreen.h +++ b/src/plugins/platforms/bsdfb/qbsdfbscreen.h @@ -35,7 +35,7 @@ #ifndef QBSDFBSCREEN_H #define QBSDFBSCREEN_H -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/cocoa/cocoa.pro b/src/plugins/platforms/cocoa/cocoa.pro index d9d3cb1627..0664841c2d 100644 --- a/src/plugins/platforms/cocoa/cocoa.pro +++ b/src/plugins/platforms/cocoa/cocoa.pro @@ -81,7 +81,10 @@ RESOURCES += qcocoaresources.qrc LIBS += -framework AppKit -framework Carbon -framework IOKit -lcups -QT += core-private gui-private platformsupport-private +QT += \ + core-private gui-private \ + accessibility_support-private clipboard_support-private theme_support-private \ + fontdatabase_support-private graphics_support-private cgl_support-private qtHaveModule(widgets) { OBJECTIVE_SOURCES += \ diff --git a/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm b/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm index 9c410506b0..97bd402b73 100644 --- a/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm +++ b/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm @@ -41,7 +41,7 @@ #include "qcocoahelpers.h" #include "qcocoawindow.h" #include "private/qaccessiblecache_p.h" -#include +#include #include #import diff --git a/src/plugins/platforms/cocoa/qcocoabackingstore.h b/src/plugins/platforms/cocoa/qcocoabackingstore.h index 562be2be8f..5ed455fd71 100644 --- a/src/plugins/platforms/cocoa/qcocoabackingstore.h +++ b/src/plugins/platforms/cocoa/qcocoabackingstore.h @@ -40,7 +40,7 @@ #ifndef QBACKINGSTORE_COCOA_H #define QBACKINGSTORE_COCOA_H -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/cocoa/qcocoaglcontext.mm b/src/plugins/platforms/cocoa/qcocoaglcontext.mm index 31b93be136..a7cc19b3bf 100644 --- a/src/plugins/platforms/cocoa/qcocoaglcontext.mm +++ b/src/plugins/platforms/cocoa/qcocoaglcontext.mm @@ -42,7 +42,7 @@ #include "qcocoahelpers.h" #include #include -#include +#include #include #include diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.h b/src/plugins/platforms/cocoa/qcocoaintegration.h index 85ea2d8ba9..32f6fe0af1 100644 --- a/src/plugins/platforms/cocoa/qcocoaintegration.h +++ b/src/plugins/platforms/cocoa/qcocoaintegration.h @@ -54,7 +54,7 @@ #include #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/cocoa/qcocoamimetypes.mm b/src/plugins/platforms/cocoa/qcocoamimetypes.mm index c109eb7bf4..093f86da6e 100644 --- a/src/plugins/platforms/cocoa/qcocoamimetypes.mm +++ b/src/plugins/platforms/cocoa/qcocoamimetypes.mm @@ -38,7 +38,7 @@ ****************************************************************************/ #include "qcocoamimetypes.h" -#include +#include #include "qcocoahelpers.h" #include diff --git a/src/plugins/platforms/cocoa/qcocoatheme.mm b/src/plugins/platforms/cocoa/qcocoatheme.mm index 03ad15a381..4d74c11581 100644 --- a/src/plugins/platforms/cocoa/qcocoatheme.mm +++ b/src/plugins/platforms/cocoa/qcocoatheme.mm @@ -58,8 +58,8 @@ #include #include #include -#include -#include +#include +#include #include #include diff --git a/src/plugins/platforms/cocoa/qmacclipboard.h b/src/plugins/platforms/cocoa/qmacclipboard.h index 2ee0cb91e4..1d229a55d2 100644 --- a/src/plugins/platforms/cocoa/qmacclipboard.h +++ b/src/plugins/platforms/cocoa/qmacclipboard.h @@ -41,7 +41,7 @@ #define QMACCLIPBOARD_H #include -#include +#include #import diff --git a/src/plugins/platforms/direct2d/direct2d.pro b/src/plugins/platforms/direct2d/direct2d.pro index f4c3b5cc3b..83c4a730f4 100644 --- a/src/plugins/platforms/direct2d/direct2d.pro +++ b/src/plugins/platforms/direct2d/direct2d.pro @@ -1,8 +1,8 @@ TARGET = qdirect2d -QT *= core-private -QT *= gui-private -QT *= platformsupport-private +QT += \ + core-private gui-private \ + eventdispatcher_support-private LIBS += -ldwmapi -ld2d1 -ld3d11 -ldwrite -lVersion -lgdi32 diff --git a/src/plugins/platforms/direct2d/qwindowsdirect2dintegration.cpp b/src/plugins/platforms/direct2d/qwindowsdirect2dintegration.cpp index deabe98fbe..1d24247d75 100644 --- a/src/plugins/platforms/direct2d/qwindowsdirect2dintegration.cpp +++ b/src/plugins/platforms/direct2d/qwindowsdirect2dintegration.cpp @@ -50,7 +50,7 @@ #include #include #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/directfb/directfb.pro b/src/plugins/platforms/directfb/directfb.pro index de0344ff5c..da7634856c 100644 --- a/src/plugins/platforms/directfb/directfb.pro +++ b/src/plugins/platforms/directfb/directfb.pro @@ -1,6 +1,9 @@ TARGET = qdirectfb -QT += core-private gui-private platformsupport-private +QT += \ + core-private gui-private \ + eventdispatcher_support-private service_support-private \ + fontdatabase_support-private egl_support-private QMAKE_USE += directfb diff --git a/src/plugins/platforms/directfb/qdirectfb_egl.cpp b/src/plugins/platforms/directfb/qdirectfb_egl.cpp index 2a04c0bba3..dad553c890 100644 --- a/src/plugins/platforms/directfb/qdirectfb_egl.cpp +++ b/src/plugins/platforms/directfb/qdirectfb_egl.cpp @@ -46,10 +46,10 @@ #include #include -#include -#include +#include +#include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/directfb/qdirectfbintegration.cpp b/src/plugins/platforms/directfb/qdirectfbintegration.cpp index 506432f886..cdf340da7a 100644 --- a/src/plugins/platforms/directfb/qdirectfbintegration.cpp +++ b/src/plugins/platforms/directfb/qdirectfbintegration.cpp @@ -44,9 +44,9 @@ #include "qdirectfbcursor.h" #include "qdirectfbwindow.h" -#include -#include -#include +#include +#include +#include #include #include diff --git a/src/plugins/platforms/eglfs/api/qeglfscontext.cpp b/src/plugins/platforms/eglfs/api/qeglfscontext.cpp index 1a33215295..c5cef34d8e 100644 --- a/src/plugins/platforms/eglfs/api/qeglfscontext.cpp +++ b/src/plugins/platforms/eglfs/api/qeglfscontext.cpp @@ -39,8 +39,8 @@ #include "qeglfsglobal_p.h" #include -#include -#include +#include +#include #include "qeglfscontext_p.h" #include "qeglfswindow_p.h" diff --git a/src/plugins/platforms/eglfs/api/qeglfscontext_p.h b/src/plugins/platforms/eglfs/api/qeglfscontext_p.h index 65af3a7cee..ab5bf99c3c 100644 --- a/src/plugins/platforms/eglfs/api/qeglfscontext_p.h +++ b/src/plugins/platforms/eglfs/api/qeglfscontext_p.h @@ -52,7 +52,7 @@ // #include "qeglfsglobal_p.h" -#include +#include #include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/eglfs/api/qeglfsdeviceintegration.cpp b/src/plugins/platforms/eglfs/api/qeglfsdeviceintegration.cpp index 9f05767366..48e0af5479 100644 --- a/src/plugins/platforms/eglfs/api/qeglfsdeviceintegration.cpp +++ b/src/plugins/platforms/eglfs/api/qeglfsdeviceintegration.cpp @@ -44,7 +44,7 @@ #include "qeglfsscreen_p.h" #include "qeglfshooks_p.h" -#include +#include #include #include #include diff --git a/src/plugins/platforms/eglfs/api/qeglfsglobal_p.h b/src/plugins/platforms/eglfs/api/qeglfsglobal_p.h index bad5095d21..8d76ff5ee0 100644 --- a/src/plugins/platforms/eglfs/api/qeglfsglobal_p.h +++ b/src/plugins/platforms/eglfs/api/qeglfsglobal_p.h @@ -53,7 +53,7 @@ #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp b/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp index 4974499e0a..733f0bd139 100644 --- a/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp +++ b/src/plugins/platforms/eglfs/api/qeglfsintegration.cpp @@ -49,7 +49,6 @@ #include #include #include -#include #include "qeglfsintegration_p.h" #include "qeglfswindow_p.h" @@ -58,30 +57,31 @@ #include "qeglfsoffscreenwindow_p.h" #include "qeglfscursor_p.h" -#include -#include -#include +#include +#include +#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include #if QT_CONFIG(libinput) -#include +#include #endif #if QT_CONFIG(evdev) -#include -#include -#include +#include +#include +#include #endif #if QT_CONFIG(tslib) -#include +#include #endif #include diff --git a/src/plugins/platforms/eglfs/api/qeglfsoffscreenwindow.cpp b/src/plugins/platforms/eglfs/api/qeglfsoffscreenwindow.cpp index 7de5379ae3..864271cd3a 100644 --- a/src/plugins/platforms/eglfs/api/qeglfsoffscreenwindow.cpp +++ b/src/plugins/platforms/eglfs/api/qeglfsoffscreenwindow.cpp @@ -40,7 +40,7 @@ #include "qeglfsoffscreenwindow_p.h" #include "qeglfshooks_p.h" #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/eglfs/api/qeglfsscreen.cpp b/src/plugins/platforms/eglfs/api/qeglfsscreen.cpp index b0c32e5176..5613179041 100644 --- a/src/plugins/platforms/eglfs/api/qeglfsscreen.cpp +++ b/src/plugins/platforms/eglfs/api/qeglfsscreen.cpp @@ -41,7 +41,7 @@ #include #include #include -#include +#include #include "qeglfsscreen_p.h" #include "qeglfswindow_p.h" diff --git a/src/plugins/platforms/eglfs/api/qeglfswindow.cpp b/src/plugins/platforms/eglfs/api/qeglfswindow.cpp index 5ce88e6bd8..e79b377d40 100644 --- a/src/plugins/platforms/eglfs/api/qeglfswindow.cpp +++ b/src/plugins/platforms/eglfs/api/qeglfswindow.cpp @@ -43,8 +43,8 @@ #include #include #include -#include -#include +#include +#include #include "qeglfswindow_p.h" #include "qeglfscursor_p.h" diff --git a/src/plugins/platforms/eglfs/api/qeglfswindow_p.h b/src/plugins/platforms/eglfs/api/qeglfswindow_p.h index 6e752b8f79..0889f27ae3 100644 --- a/src/plugins/platforms/eglfs/api/qeglfswindow_p.h +++ b/src/plugins/platforms/eglfs/api/qeglfswindow_p.h @@ -56,7 +56,7 @@ #include "qeglfsscreen_p.h" #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_brcm/eglfs_brcm.pro b/src/plugins/platforms/eglfs/deviceintegration/eglfs_brcm/eglfs_brcm.pro index 7f1e7b9f59..fee67da2de 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_brcm/eglfs_brcm.pro +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_brcm/eglfs_brcm.pro @@ -1,6 +1,6 @@ TARGET = qeglfs-brcm-integration -QT += core-private gui-private platformsupport-private eglfsdeviceintegration-private +QT += core-private gui-private eglfsdeviceintegration-private INCLUDEPATH += $$PWD/../../api CONFIG += egl diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/eglfs_kms.pro b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/eglfs_kms.pro index 10571dc978..255db824b7 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/eglfs_kms.pro +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/eglfs_kms.pro @@ -4,7 +4,7 @@ PLUGIN_TYPE = egldeviceintegrations PLUGIN_CLASS_NAME = QEglFSKmsGbmIntegrationPlugin load(qt_plugin) -QT += core-private gui-private platformsupport-private eglfsdeviceintegration-private eglfs_kms_support-private +QT += core-private gui-private eglfsdeviceintegration-private eglfs_kms_support-private INCLUDEPATH += $$PWD/../../api $$PWD/../eglfs_kms_support diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmintegration.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmintegration.cpp index a5ab73cca4..a78f445995 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmintegration.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmintegration.cpp @@ -45,7 +45,7 @@ #include "qeglfskmsgbmcursor.h" #include "private/qeglfscursor_p.h" -#include +#include #include #include #include diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmscreen.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmscreen.cpp index 75ff3ac749..bed775ff81 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmscreen.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmscreen.cpp @@ -47,7 +47,7 @@ #include #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/eglfs_kms_egldevice.pro b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/eglfs_kms_egldevice.pro index 582982df76..a625021aba 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/eglfs_kms_egldevice.pro +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/eglfs_kms_egldevice.pro @@ -1,6 +1,6 @@ TARGET = qeglfs-kms-egldevice-integration -QT += core-private gui-private platformsupport-private eglfsdeviceintegration-private eglfs_kms_support-private +QT += core-private gui-private eglfsdeviceintegration-private eglfs_kms_support-private INCLUDEPATH += $$PWD/../../api $$PWD/../eglfs_kms_support diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp index ddb2499751..d0c9c9565e 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp @@ -39,7 +39,7 @@ ****************************************************************************/ #include "qeglfskmsegldeviceintegration.h" -#include +#include #include "private/qeglfswindow_p.h" #include "private/qeglfscursor_p.h" #include "qeglfskmsegldevice.h" diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.h b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.h index 375c388548..cddfdbd5c6 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.h +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.h @@ -46,7 +46,7 @@ #include #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/eglfs_kms_support.pro b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/eglfs_kms_support.pro index f88a7c847e..487edb569e 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/eglfs_kms_support.pro +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/eglfs_kms_support.pro @@ -2,7 +2,7 @@ TARGET = QtEglFsKmsSupport CONFIG += no_module_headers internal_module load(qt_module) -QT += core-private gui-private platformsupport-private eglfsdeviceintegration-private +QT += core-private gui-private eglfsdeviceintegration-private INCLUDEPATH += $$PWD/../../api diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen.cpp index e4b6c67f28..4021609407 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen.cpp @@ -46,7 +46,7 @@ #include #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_mali/eglfs_mali.pro b/src/plugins/platforms/eglfs/deviceintegration/eglfs_mali/eglfs_mali.pro index e72f5bdd14..5e6f636e2b 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_mali/eglfs_mali.pro +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_mali/eglfs_mali.pro @@ -1,6 +1,6 @@ TARGET = qeglfs-mali-integration -QT += core-private gui-private platformsupport-private eglfsdeviceintegration-private +QT += core-private gui-private eglfsdeviceintegration-private # Avoid X11 header collision, use generic EGL native types DEFINES += QT_EGL_NO_X11 diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_viv/eglfs_viv.pro b/src/plugins/platforms/eglfs/deviceintegration/eglfs_viv/eglfs_viv.pro index 364812ec60..f9cce8d48b 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_viv/eglfs_viv.pro +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_viv/eglfs_viv.pro @@ -1,6 +1,6 @@ TARGET = qeglfs-viv-integration -QT += core-private gui-private platformsupport-private eglfsdeviceintegration-private +QT += core-private gui-private eglfsdeviceintegration-private INCLUDEPATH += $$PWD/../../api CONFIG += egl diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_viv_wl/eglfs_viv_wl.pro b/src/plugins/platforms/eglfs/deviceintegration/eglfs_viv_wl/eglfs_viv_wl.pro index ccdf20b417..f934fd85ed 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_viv_wl/eglfs_viv_wl.pro +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_viv_wl/eglfs_viv_wl.pro @@ -1,6 +1,6 @@ TARGET = qeglfs-viv-wl-integration -QT += core-private gui-private platformsupport-private eglfsdeviceintegration-private +QT += core-private gui-private eglfsdeviceintegration-private INCLUDEPATH += $$PWD/../../api CONFIG += egl diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/eglfs_x11.pro b/src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/eglfs_x11.pro index 51a026e2cf..391f63615b 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/eglfs_x11.pro +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/eglfs_x11.pro @@ -1,6 +1,6 @@ TARGET = qeglfs-x11-integration -QT += core-private gui-private platformsupport-private eglfsdeviceintegration-private +QT += core-private gui-private eglfsdeviceintegration-private # Avoid X11 header collision, use generic EGL native types DEFINES += QT_EGL_NO_X11 diff --git a/src/plugins/platforms/eglfs/eglfs-plugin.pro b/src/plugins/platforms/eglfs/eglfs-plugin.pro index d8adc13226..cf4863975a 100644 --- a/src/plugins/platforms/eglfs/eglfs-plugin.pro +++ b/src/plugins/platforms/eglfs/eglfs-plugin.pro @@ -1,6 +1,6 @@ TARGET = qeglfs -QT += platformsupport-private eglfsdeviceintegration-private +QT += eglfsdeviceintegration-private SOURCES += $$PWD/qeglfsmain.cpp diff --git a/src/plugins/platforms/eglfs/eglfsdeviceintegration.pro b/src/plugins/platforms/eglfs/eglfsdeviceintegration.pro index 15a825a7b0..638d12a368 100644 --- a/src/plugins/platforms/eglfs/eglfsdeviceintegration.pro +++ b/src/plugins/platforms/eglfs/eglfsdeviceintegration.pro @@ -8,7 +8,15 @@ TARGET = QtEglFSDeviceIntegration CONFIG += internal_module MODULE = eglfsdeviceintegration -QT += core-private gui-private platformsupport-private +QT += \ + core-private gui-private \ + devicediscovery_support-private eventdispatcher_support-private \ + service_support-private theme_support-private fontdatabase_support-private \ + fb_support-private egl_support-private platformcompositor_support-private + +qtHaveModule(input_support-private): \ + QT += input_support-private + LIBS += $$QMAKE_LIBS_DYNLOAD # Avoid X11 header collision, use generic EGL native types @@ -33,6 +41,10 @@ QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF CONFIG += egl qpa/genericunixfontdatabase +# Prevent gold linker from crashing. +# This started happening when QtPlatformSupport was modularized. +use_gold_linker: CONFIG += no_linker_version_script + !contains(DEFINES, QT_NO_CURSOR): RESOURCES += $$PWD/cursor.qrc load(qt_module) diff --git a/src/plugins/platforms/haiku/haiku.pro b/src/plugins/platforms/haiku/haiku.pro index 931dfb28a8..fd1f47b963 100644 --- a/src/plugins/platforms/haiku/haiku.pro +++ b/src/plugins/platforms/haiku/haiku.pro @@ -1,6 +1,6 @@ TARGET = qhaiku -QT += platformsupport-private core-private gui-private +QT += core-private gui-private eventdistpatcher_support-private SOURCES = \ main.cpp \ diff --git a/src/plugins/platforms/haiku/qhaikuintegration.cpp b/src/plugins/platforms/haiku/qhaikuintegration.cpp index d239380866..d46d77ff18 100644 --- a/src/plugins/platforms/haiku/qhaikuintegration.cpp +++ b/src/plugins/platforms/haiku/qhaikuintegration.cpp @@ -49,7 +49,7 @@ #include #include #include -#include +#include #include diff --git a/src/plugins/platforms/integrity/integrity.pro b/src/plugins/platforms/integrity/integrity.pro index 07dbf4093d..178fc1b882 100644 --- a/src/plugins/platforms/integrity/integrity.pro +++ b/src/plugins/platforms/integrity/integrity.pro @@ -1,6 +1,9 @@ TARGET = integrityfb -QT += core-private gui-private platformsupport-private +QT += \ + core-private gui-private \ + eventdispatcher_support-private service_support-private \ + fontdatabase_support-private fb_support-private SOURCES = \ main.cpp \ diff --git a/src/plugins/platforms/integrity/qintegrityfbintegration.cpp b/src/plugins/platforms/integrity/qintegrityfbintegration.cpp index 5332718c5e..a88c85e30d 100644 --- a/src/plugins/platforms/integrity/qintegrityfbintegration.cpp +++ b/src/plugins/platforms/integrity/qintegrityfbintegration.cpp @@ -35,13 +35,13 @@ #include "qintegrityfbscreen.h" #include "qintegrityhidmanager.h" -#include -#include -#include +#include +#include +#include -#include -#include -#include +#include +#include +#include #include #include diff --git a/src/plugins/platforms/integrity/qintegrityfbscreen.cpp b/src/plugins/platforms/integrity/qintegrityfbscreen.cpp index e043da7786..256cc117a2 100644 --- a/src/plugins/platforms/integrity/qintegrityfbscreen.cpp +++ b/src/plugins/platforms/integrity/qintegrityfbscreen.cpp @@ -32,8 +32,8 @@ ****************************************************************************/ #include "qintegrityfbscreen.h" -#include -#include +#include +#include #include #include diff --git a/src/plugins/platforms/integrity/qintegrityfbscreen.h b/src/plugins/platforms/integrity/qintegrityfbscreen.h index 2a83f3426f..5b4d900a4b 100644 --- a/src/plugins/platforms/integrity/qintegrityfbscreen.h +++ b/src/plugins/platforms/integrity/qintegrityfbscreen.h @@ -34,7 +34,7 @@ #ifndef QINTEGRITYFBSCREEN_H #define QINTEGRITYFBSCREEN_H -#include +#include #include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/ios/ios.pro b/src/plugins/platforms/ios/ios.pro index 2c85a68f0b..56efd12435 100644 --- a/src/plugins/platforms/ios/ios.pro +++ b/src/plugins/platforms/ios/ios.pro @@ -1,6 +1,9 @@ TARGET = qios -QT += core-private gui-private platformsupport-private +QT += \ + core-private gui-private \ + clipboard_support-private fontdatabase_support-private graphics_support-private + LIBS += -framework Foundation -framework UIKit -framework QuartzCore -framework AudioToolbox OBJECTIVE_SOURCES = \ diff --git a/src/plugins/platforms/ios/qiosbackingstore.h b/src/plugins/platforms/ios/qiosbackingstore.h index 5c37be5d38..1c072c0935 100644 --- a/src/plugins/platforms/ios/qiosbackingstore.h +++ b/src/plugins/platforms/ios/qiosbackingstore.h @@ -42,7 +42,7 @@ #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/ios/qiosclipboard.mm b/src/plugins/platforms/ios/qiosclipboard.mm index 960c9f39db..ef3b453bbf 100644 --- a/src/plugins/platforms/ios/qiosclipboard.mm +++ b/src/plugins/platforms/ios/qiosclipboard.mm @@ -41,7 +41,7 @@ #ifndef QT_NO_CLIPBOARD -#include +#include #include #include diff --git a/src/plugins/platforms/ios/qiosintegration.mm b/src/plugins/platforms/ios/qiosintegration.mm index 94dd643116..82b5f3b755 100644 --- a/src/plugins/platforms/ios/qiosintegration.mm +++ b/src/plugins/platforms/ios/qiosintegration.mm @@ -57,8 +57,8 @@ #include #include -#include -#include +#include +#include #include #import diff --git a/src/plugins/platforms/ios/qiostheme.mm b/src/plugins/platforms/ios/qiostheme.mm index 83a8176478..91980d3f35 100644 --- a/src/plugins/platforms/ios/qiostheme.mm +++ b/src/plugins/platforms/ios/qiostheme.mm @@ -44,7 +44,7 @@ #include -#include +#include #include #include diff --git a/src/plugins/platforms/linuxfb/linuxfb.pro b/src/plugins/platforms/linuxfb/linuxfb.pro index db365ce739..a752f95917 100644 --- a/src/plugins/platforms/linuxfb/linuxfb.pro +++ b/src/plugins/platforms/linuxfb/linuxfb.pro @@ -2,7 +2,13 @@ TARGET = qlinuxfb DEFINES += QT_NO_FOREACH -QT += core-private gui-private platformsupport-private +QT += \ + core-private gui-private \ + service_support-private eventdispatcher_support-private \ + fontdatabase_support-private fb_support-private + +qtHaveModule(input_support-private): \ + QT += input_support-private SOURCES = main.cpp qlinuxfbintegration.cpp qlinuxfbscreen.cpp HEADERS = qlinuxfbintegration.h qlinuxfbscreen.h diff --git a/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp b/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp index 707301487d..893205177d 100644 --- a/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp +++ b/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp @@ -40,30 +40,30 @@ #include "qlinuxfbintegration.h" #include "qlinuxfbscreen.h" -#include -#include -#include +#include +#include +#include -#include -#include -#include -#include +#include +#include +#include +#include #include #include #if QT_CONFIG(libinput) -#include +#include #endif #if QT_CONFIG(evdev) && !defined(Q_OS_ANDROID) -#include -#include -#include +#include +#include +#include #endif #if QT_CONFIG(tslib) && !defined(Q_OS_ANDROID) -#include +#include #endif QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp b/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp index a2e09611b4..246c959fd3 100644 --- a/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp +++ b/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp @@ -38,8 +38,8 @@ ****************************************************************************/ #include "qlinuxfbscreen.h" -#include -#include +#include +#include #include #include #include diff --git a/src/plugins/platforms/linuxfb/qlinuxfbscreen.h b/src/plugins/platforms/linuxfb/qlinuxfbscreen.h index ada9c4d830..1e98191569 100644 --- a/src/plugins/platforms/linuxfb/qlinuxfbscreen.h +++ b/src/plugins/platforms/linuxfb/qlinuxfbscreen.h @@ -40,7 +40,7 @@ #ifndef QLINUXFBSCREEN_H #define QLINUXFBSCREEN_H -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/minimal/minimal.pro b/src/plugins/platforms/minimal/minimal.pro index d4627605bb..0fffb24d24 100644 --- a/src/plugins/platforms/minimal/minimal.pro +++ b/src/plugins/platforms/minimal/minimal.pro @@ -1,6 +1,8 @@ TARGET = qminimal -QT += core-private gui-private platformsupport-private +QT += \ + core-private gui-private \ + eventdispatcher_support-private fontdatabase_support-private DEFINES += QT_NO_FOREACH diff --git a/src/plugins/platforms/minimal/qminimalintegration.cpp b/src/plugins/platforms/minimal/qminimalintegration.cpp index 558089dfce..03c72502cb 100644 --- a/src/plugins/platforms/minimal/qminimalintegration.cpp +++ b/src/plugins/platforms/minimal/qminimalintegration.cpp @@ -45,15 +45,15 @@ #include #if defined(Q_OS_WIN) -#include +#include #elif QT_CONFIG(fontconfig) -#include +#include #else #include #endif #if !defined(Q_OS_WIN) -#include +#include #elif defined(Q_OS_WINRT) #include #else diff --git a/src/plugins/platforms/minimalegl/minimalegl.pro b/src/plugins/platforms/minimalegl/minimalegl.pro index b8a91729fd..46334a0250 100644 --- a/src/plugins/platforms/minimalegl/minimalegl.pro +++ b/src/plugins/platforms/minimalegl/minimalegl.pro @@ -1,6 +1,8 @@ TARGET = qminimalegl -QT += core-private gui-private platformsupport-private +QT += \ + core-private gui-private \ + eventdispatcher_support-private fontdatabase_support-private egl_support-private #DEFINES += QEGL_EXTRA_DEBUG diff --git a/src/plugins/platforms/minimalegl/qminimaleglintegration.cpp b/src/plugins/platforms/minimalegl/qminimaleglintegration.cpp index b1d3691a10..2afe42532e 100644 --- a/src/plugins/platforms/minimalegl/qminimaleglintegration.cpp +++ b/src/plugins/platforms/minimalegl/qminimaleglintegration.cpp @@ -42,15 +42,15 @@ #include "qminimaleglwindow.h" #include "qminimaleglbackingstore.h" -#include +#include #if defined(Q_OS_UNIX) -# include +# include #elif defined(Q_OS_WINRT) # include # include #elif defined(Q_OS_WIN) -# include +# include #endif #include @@ -58,7 +58,7 @@ #include #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/minimalegl/qminimaleglscreen.cpp b/src/plugins/platforms/minimalegl/qminimaleglscreen.cpp index e8a9641224..d3d091fab7 100644 --- a/src/plugins/platforms/minimalegl/qminimaleglscreen.cpp +++ b/src/plugins/platforms/minimalegl/qminimaleglscreen.cpp @@ -40,8 +40,8 @@ #include "qminimaleglscreen.h" #include "qminimaleglwindow.h" -#include -#include +#include +#include #ifdef Q_OPENKODE #include diff --git a/src/plugins/platforms/minimalegl/qminimaleglscreen.h b/src/plugins/platforms/minimalegl/qminimaleglscreen.h index 4b53bbd39a..ba605835a8 100644 --- a/src/plugins/platforms/minimalegl/qminimaleglscreen.h +++ b/src/plugins/platforms/minimalegl/qminimaleglscreen.h @@ -44,7 +44,7 @@ #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/mirclient/mirclient.pro b/src/plugins/platforms/mirclient/mirclient.pro index d5d35f1632..054fe74a46 100644 --- a/src/plugins/platforms/mirclient/mirclient.pro +++ b/src/plugins/platforms/mirclient/mirclient.pro @@ -1,6 +1,9 @@ TARGET = qmirclient -QT += core-private gui-private platformsupport-private dbus +QT += \ + core-private gui-private dbus \ + theme_support-private eventdispatcher_support-private \ + fontdatabase_support-private egl_support-private CONFIG += qpa/genericunixfontdatabase diff --git a/src/plugins/platforms/mirclient/qmirclientglcontext.cpp b/src/plugins/platforms/mirclient/qmirclientglcontext.cpp index 4092669cfc..38eb0a4609 100644 --- a/src/plugins/platforms/mirclient/qmirclientglcontext.cpp +++ b/src/plugins/platforms/mirclient/qmirclientglcontext.cpp @@ -41,7 +41,7 @@ #include "qmirclientglcontext.h" #include "qmirclientwindow.h" #include "qmirclientlogging.h" -#include +#include #include #include diff --git a/src/plugins/platforms/mirclient/qmirclientintegration.cpp b/src/plugins/platforms/mirclient/qmirclientintegration.cpp index cfbcdc937e..2c8740f070 100644 --- a/src/plugins/platforms/mirclient/qmirclientintegration.cpp +++ b/src/plugins/platforms/mirclient/qmirclientintegration.cpp @@ -56,8 +56,8 @@ #include #include #include -#include -#include +#include +#include #include // platform-api diff --git a/src/plugins/platforms/mirclient/qmirclientplatformservices.h b/src/plugins/platforms/mirclient/qmirclientplatformservices.h index 46cf4300f8..a1cd5758ca 100644 --- a/src/plugins/platforms/mirclient/qmirclientplatformservices.h +++ b/src/plugins/platforms/mirclient/qmirclientplatformservices.h @@ -42,8 +42,8 @@ #define QMIRCLIENTPLATFORMSERVICES_H #include -#include -#include +#include +#include class QMirClientPlatformServices : public QPlatformServices { public: diff --git a/src/plugins/platforms/mirclient/qmirclientscreen.cpp b/src/plugins/platforms/mirclient/qmirclientscreen.cpp index ca0c3e4733..0a2253e9e2 100644 --- a/src/plugins/platforms/mirclient/qmirclientscreen.cpp +++ b/src/plugins/platforms/mirclient/qmirclientscreen.cpp @@ -51,7 +51,7 @@ #include #include #include -#include +#include #include diff --git a/src/plugins/platforms/mirclient/qmirclienttheme.h b/src/plugins/platforms/mirclient/qmirclienttheme.h index 19728741e3..4bab1d0ee0 100644 --- a/src/plugins/platforms/mirclient/qmirclienttheme.h +++ b/src/plugins/platforms/mirclient/qmirclienttheme.h @@ -41,7 +41,7 @@ #ifndef QMIRCLIENTTHEME_H #define QMIRCLIENTTHEME_H -#include +#include class QMirClientTheme : public QGenericUnixTheme { diff --git a/src/plugins/platforms/offscreen/offscreen.pro b/src/plugins/platforms/offscreen/offscreen.pro index fbaa853c41..6652cefd86 100644 --- a/src/plugins/platforms/offscreen/offscreen.pro +++ b/src/plugins/platforms/offscreen/offscreen.pro @@ -1,6 +1,8 @@ TARGET = qoffscreen -QT += core-private gui-private platformsupport-private +QT += \ + core-private gui-private \ + eventdispatcher_support-private fontdatabase_support-private DEFINES += QT_NO_FOREACH @@ -18,6 +20,7 @@ OTHER_FILES += offscreen.json qtConfig(xlib):qtConfig(opengl):!qtConfig(opengles2) { SOURCES += qoffscreenintegration_x11.cpp HEADERS += qoffscreenintegration_x11.h + QT += glx_support-private system(echo "Using X11 offscreen integration with GLX") } else { SOURCES += qoffscreenintegration_dummy.cpp diff --git a/src/plugins/platforms/offscreen/qoffscreenintegration.cpp b/src/plugins/platforms/offscreen/qoffscreenintegration.cpp index 4c3d62a53b..56e6075cb2 100644 --- a/src/plugins/platforms/offscreen/qoffscreenintegration.cpp +++ b/src/plugins/platforms/offscreen/qoffscreenintegration.cpp @@ -42,14 +42,14 @@ #include "qoffscreencommon.h" #if defined(Q_OS_UNIX) -#include +#include #if defined(Q_OS_MAC) #include #else -#include +#include #endif #elif defined(Q_OS_WIN) -#include +#include #ifndef Q_OS_WINRT #include #else diff --git a/src/plugins/platforms/offscreen/qoffscreenintegration_x11.cpp b/src/plugins/platforms/offscreen/qoffscreenintegration_x11.cpp index 2187eceed4..b46d94dfd3 100644 --- a/src/plugins/platforms/offscreen/qoffscreenintegration_x11.cpp +++ b/src/plugins/platforms/offscreen/qoffscreenintegration_x11.cpp @@ -45,7 +45,7 @@ #include #include -#include +#include #include #include diff --git a/src/plugins/platforms/openwfd/openwf.pro b/src/plugins/platforms/openwfd/openwf.pro index 79f349f472..747cbf404a 100644 --- a/src/plugins/platforms/openwfd/openwf.pro +++ b/src/plugins/platforms/openwfd/openwf.pro @@ -1,6 +1,8 @@ TARGET = qopenwf -QT += core-private gui-private platformsupport-private +QT += \ + core-private gui-private \ + eventdispatcher_support-private fontdatabase_support-private CONFIG += qpa/genericunixfontdatabase diff --git a/src/plugins/platforms/openwfd/qopenwfdintegration.cpp b/src/plugins/platforms/openwfd/qopenwfdintegration.cpp index 71e2b381fc..9ed61f7b2e 100644 --- a/src/plugins/platforms/openwfd/qopenwfdintegration.cpp +++ b/src/plugins/platforms/openwfd/qopenwfdintegration.cpp @@ -51,8 +51,8 @@ #include #include -#include -#include +#include +#include #include diff --git a/src/plugins/platforms/qnx/qnx.pro b/src/plugins/platforms/qnx/qnx.pro index a726980f5b..9da3d6811b 100644 --- a/src/plugins/platforms/qnx/qnx.pro +++ b/src/plugins/platforms/qnx/qnx.pro @@ -1,6 +1,8 @@ TARGET = qqnx -QT += platformsupport-private core-private gui-private +QT += \ + core-private gui-private \ + fontdatabase_support-private eventdispatcher_support-private egl_support-private # Uncomment this to build with support for IMF once it becomes available in the BBNDK #CONFIG += qqnx_imf diff --git a/src/plugins/platforms/vnc/qvncintegration.cpp b/src/plugins/platforms/vnc/qvncintegration.cpp index 3227478ebe..025112c790 100644 --- a/src/plugins/platforms/vnc/qvncintegration.cpp +++ b/src/plugins/platforms/vnc/qvncintegration.cpp @@ -38,19 +38,19 @@ #include "qvncscreen.h" #include "qvnc_p.h" -#include -#include -#include +#include +#include +#include -#include -#include -#include +#include +#include +#include #include #include #include #if QT_CONFIG(libinput) -#include +#include #endif #include diff --git a/src/plugins/platforms/vnc/qvncscreen.cpp b/src/plugins/platforms/vnc/qvncscreen.cpp index 6d117c62bf..34def45767 100644 --- a/src/plugins/platforms/vnc/qvncscreen.cpp +++ b/src/plugins/platforms/vnc/qvncscreen.cpp @@ -39,8 +39,8 @@ #include "qvncscreen.h" #include "qvnc_p.h" -#include -#include +#include +#include #include #include diff --git a/src/plugins/platforms/vnc/qvncscreen.h b/src/plugins/platforms/vnc/qvncscreen.h index e3c6651781..785abd6dc2 100644 --- a/src/plugins/platforms/vnc/qvncscreen.h +++ b/src/plugins/platforms/vnc/qvncscreen.h @@ -40,7 +40,7 @@ #ifndef QVncScreen_H #define QVncScreen_H -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/vnc/vnc.pro b/src/plugins/platforms/vnc/vnc.pro index 1817e15201..15407f9298 100644 --- a/src/plugins/platforms/vnc/vnc.pro +++ b/src/plugins/platforms/vnc/vnc.pro @@ -5,7 +5,13 @@ PLUGIN_CLASS_NAME = QVncIntegrationPlugin !equals(TARGET, $$QT_DEFAULT_QPA_PLUGIN): PLUGIN_EXTENDS = - load(qt_plugin) -QT += core-private gui-private platformsupport-private network +QT += \ + core-private network gui-private \ + service_support-private theme_support-private fb_support-private \ + eventdispatcher_support-private fontdatabase_support-private + +qtHaveModule(input_support-private): \ + QT += input_support-private DEFINES += QT_NO_FOREACH diff --git a/src/plugins/platforms/windows/accessible/iaccessible2.cpp b/src/plugins/platforms/windows/accessible/iaccessible2.cpp index 5ba49a8a98..d5cd9ac6db 100644 --- a/src/plugins/platforms/windows/accessible/iaccessible2.cpp +++ b/src/plugins/platforms/windows/accessible/iaccessible2.cpp @@ -41,7 +41,7 @@ #include "iaccessible2.h" #include "qwindowsaccessibility.h" -#include +#include #include #include #include diff --git a/src/plugins/platforms/windows/qwindowsclipboard.cpp b/src/plugins/platforms/windows/qwindowsclipboard.cpp index 21bc9d7377..d4a7e27762 100644 --- a/src/plugins/platforms/windows/qwindowsclipboard.cpp +++ b/src/plugins/platforms/windows/qwindowsclipboard.cpp @@ -53,7 +53,7 @@ #include #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp index d4cdf3ef3c..bc317c7f5d 100644 --- a/src/plugins/platforms/windows/qwindowscontext.cpp +++ b/src/plugins/platforms/windows/qwindowscontext.cpp @@ -72,7 +72,7 @@ #include #include -#include +#include #include #include diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.h b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.h index fa8f777133..90008e20a4 100644 --- a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.h +++ b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.h @@ -40,7 +40,7 @@ #ifndef QWINDOWSFONTDATABASEFT_H #define QWINDOWSFONTDATABASEFT_H -#include +#include #include #include diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp index b9a63c7a89..16a2b56774 100644 --- a/src/plugins/platforms/windows/qwindowsintegration.cpp +++ b/src/plugins/platforms/windows/qwindowsintegration.cpp @@ -72,7 +72,7 @@ #include #include -#include +#include #include #include diff --git a/src/plugins/platforms/windows/qwindowskeymapper.cpp b/src/plugins/platforms/windows/qwindowskeymapper.cpp index fd7eca9e32..b8c4f0b736 100644 --- a/src/plugins/platforms/windows/qwindowskeymapper.cpp +++ b/src/plugins/platforms/windows/qwindowskeymapper.cpp @@ -49,7 +49,7 @@ #include #include #include -#include +#include #if defined(WM_APPCOMMAND) # ifndef FAPPCOMMAND_MOUSE diff --git a/src/plugins/platforms/windows/qwindowstheme.cpp b/src/plugins/platforms/windows/qwindowstheme.cpp index 841464391d..fe67c0ce37 100644 --- a/src/plugins/platforms/windows/qwindowstheme.cpp +++ b/src/plugins/platforms/windows/qwindowstheme.cpp @@ -68,7 +68,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/plugins/platforms/windows/windows.pro b/src/plugins/platforms/windows/windows.pro index adafa830d5..23168c10dc 100644 --- a/src/plugins/platforms/windows/windows.pro +++ b/src/plugins/platforms/windows/windows.pro @@ -1,8 +1,9 @@ TARGET = qwindows -QT *= core-private -QT *= gui-private -QT *= platformsupport-private +QT += \ + core-private gui-private \ + eventdispatcher_support-private accessibility_support-private \ + fontdatabase_support-private theme_support-private LIBS += -lgdi32 -ldwmapi diff --git a/src/plugins/platforms/winrt/qwinrteglcontext.cpp b/src/plugins/platforms/winrt/qwinrteglcontext.cpp index 5c3ecd8726..8a250c516a 100644 --- a/src/plugins/platforms/winrt/qwinrteglcontext.cpp +++ b/src/plugins/platforms/winrt/qwinrteglcontext.cpp @@ -51,8 +51,8 @@ #include #include -#include -#include +#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/winrt/qwinrtfontdatabase.h b/src/plugins/platforms/winrt/qwinrtfontdatabase.h index 8539bcb9db..8fed4a3fa7 100644 --- a/src/plugins/platforms/winrt/qwinrtfontdatabase.h +++ b/src/plugins/platforms/winrt/qwinrtfontdatabase.h @@ -40,7 +40,7 @@ #ifndef QWINRTFONTDATABASE_H #define QWINRTFONTDATABASE_H -#include +#include #include struct IDWriteFontFile; diff --git a/src/plugins/platforms/winrt/qwinrtintegration.cpp b/src/plugins/platforms/winrt/qwinrtintegration.cpp index 32edf2b1a2..7a0c95e6c1 100644 --- a/src/plugins/platforms/winrt/qwinrtintegration.cpp +++ b/src/plugins/platforms/winrt/qwinrtintegration.cpp @@ -56,7 +56,7 @@ #include #include -#include +#include #include #include #include diff --git a/src/plugins/platforms/winrt/qwinrtwindow.cpp b/src/plugins/platforms/winrt/qwinrtwindow.cpp index 5b82183d40..297e6618d1 100644 --- a/src/plugins/platforms/winrt/qwinrtwindow.cpp +++ b/src/plugins/platforms/winrt/qwinrtwindow.cpp @@ -50,7 +50,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/plugins/platforms/winrt/winrt.pro b/src/plugins/platforms/winrt/winrt.pro index 174b0362b4..8fd2a83a16 100644 --- a/src/plugins/platforms/winrt/winrt.pro +++ b/src/plugins/platforms/winrt/winrt.pro @@ -2,7 +2,9 @@ TARGET = qwinrt CONFIG -= precompile_header -QT += core-private gui-private platformsupport-private +QT += \ + core-private gui-private \ + fontdatabase_support-private egl_support-private DEFINES *= QT_NO_CAST_FROM_ASCII __WRL_NO_DEFAULT_LIB__ diff --git a/src/plugins/platforms/xcb/gl_integrations/gl_integrations_plugin_base.pri b/src/plugins/platforms/xcb/gl_integrations/gl_integrations_plugin_base.pri index a94815dfbd..b44e4ecaa9 100644 --- a/src/plugins/platforms/xcb/gl_integrations/gl_integrations_plugin_base.pri +++ b/src/plugins/platforms/xcb/gl_integrations/gl_integrations_plugin_base.pri @@ -1,4 +1,4 @@ -QT += core-private gui-private platformsupport-private xcb_qpa_lib-private +QT += core-private gui-private xcb_qpa_lib-private INCLUDEPATH += $$PWD INCLUDEPATH += $$PWD/../ diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglcontext.h b/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglcontext.h index 64e9bec6db..48e774bbb2 100644 --- a/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglcontext.h +++ b/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglcontext.h @@ -41,8 +41,8 @@ #define QXCBEGLCONTEXT_H #include "qxcbeglwindow.h" -#include -#include +#include +#include #include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglinclude.h b/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglinclude.h index 7c6524c8ee..a5a47dd0bb 100644 --- a/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglinclude.h +++ b/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglinclude.h @@ -46,7 +46,7 @@ #include #include -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglintegration.cpp b/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglintegration.cpp index 00f64e3c40..4852d38f7e 100644 --- a/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglintegration.cpp +++ b/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglintegration.cpp @@ -42,7 +42,7 @@ #include "qxcbeglcontext.h" #include -#include +#include #include "qxcbeglnativeinterfacehandler.h" diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglwindow.cpp b/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglwindow.cpp index 69b7dfbdbf..3f7ef94238 100644 --- a/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglwindow.cpp +++ b/src/plugins/platforms/xcb/gl_integrations/xcb_egl/qxcbeglwindow.cpp @@ -41,8 +41,8 @@ #include "qxcbeglintegration.h" -#include -#include +#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_egl/xcb_egl.pro b/src/plugins/platforms/xcb/gl_integrations/xcb_egl/xcb_egl.pro index 6b3f9b171a..1c193849ca 100644 --- a/src/plugins/platforms/xcb/gl_integrations/xcb_egl/xcb_egl.pro +++ b/src/plugins/platforms/xcb/gl_integrations/xcb_egl/xcb_egl.pro @@ -1,6 +1,7 @@ TARGET = qxcb-egl-integration include(../gl_integrations_plugin_base.pri) +QT += egl_support-private CONFIG += egl diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp index 5580f81a7a..dc720c090f 100644 --- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp +++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp @@ -51,7 +51,7 @@ #include #include "qglxintegration.h" -#include +#include #include #if defined(Q_OS_LINUX) || defined(Q_OS_BSD4) diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxwindow.cpp b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxwindow.cpp index 8ae83b8084..e534ae13c6 100644 --- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxwindow.cpp +++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxwindow.cpp @@ -40,7 +40,7 @@ #include "qxcbglxwindow.h" #include "qxcbscreen.h" -#include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/xcb_glx.pro b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/xcb_glx.pro index e52677d091..8aa6e1febd 100644 --- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/xcb_glx.pro +++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/xcb_glx.pro @@ -1,6 +1,7 @@ TARGET = qxcb-glx-integration include(../gl_integrations_plugin_base.pri) +QT += glx_support-private #should be removed from the sources DEFINES += XCB_USE_GLX XCB_USE_XLIB diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp index b0c5ac79f9..f4da7ba033 100644 --- a/src/plugins/platforms/xcb/qxcbintegration.cpp +++ b/src/plugins/platforms/xcb/qxcbintegration.cpp @@ -55,9 +55,9 @@ #include -#include -#include -#include +#include +#include +#include #include @@ -77,7 +77,7 @@ #ifndef QT_NO_ACCESSIBILITY #include #ifndef QT_NO_ACCESSIBILITY_ATSPI_BRIDGE -#include "../../../platformsupport/linuxaccessibility/bridge_p.h" +#include #endif #endif diff --git a/src/plugins/platforms/xcb/xcb-plugin.pro b/src/plugins/platforms/xcb/xcb-plugin.pro index d7f150f276..01d493156d 100644 --- a/src/plugins/platforms/xcb/xcb-plugin.pro +++ b/src/plugins/platforms/xcb/xcb-plugin.pro @@ -1,6 +1,6 @@ TARGET = qxcb -QT += core-private gui-private platformsupport-private xcb_qpa_lib-private +QT += core-private gui-private xcb_qpa_lib-private DEFINES += QT_NO_FOREACH diff --git a/src/plugins/platforms/xcb/xcb_qpa_lib.pro b/src/plugins/platforms/xcb/xcb_qpa_lib.pro index 69d2e35606..37556baa1d 100644 --- a/src/plugins/platforms/xcb/xcb_qpa_lib.pro +++ b/src/plugins/platforms/xcb/xcb_qpa_lib.pro @@ -2,7 +2,13 @@ TARGET = QtXcbQpa CONFIG += no_module_headers internal_module DEFINES += QT_NO_FOREACH -QT += core-private gui-private platformsupport-private +QT += \ + core-private gui-private \ + service_support-private theme_support-private \ + eventdispatcher_support-private fontdatabase_support-private + +qtHaveModule(linuxaccessibility_support-private): \ + QT += linuxaccessibility_support-private SOURCES = \ qxcbclipboard.cpp \ diff --git a/src/plugins/platformthemes/gtk3/gtk3.pro b/src/plugins/platformthemes/gtk3/gtk3.pro index 12364b0b57..c291ac56a0 100644 --- a/src/plugins/platformthemes/gtk3/gtk3.pro +++ b/src/plugins/platformthemes/gtk3/gtk3.pro @@ -5,7 +5,7 @@ PLUGIN_EXTENDS = - PLUGIN_CLASS_NAME = QGtk3ThemePlugin load(qt_plugin) -QT += core-private gui-private platformsupport-private +QT += core-private gui-private theme_support-private CONFIG += X11 QMAKE_USE += gtk3 -- cgit v1.2.3 From f25afef61da17088fc9cdeb15be7144ef0c7c867 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 12 Oct 2016 12:08:33 +0200 Subject: rely on transitive library dependencies for freetype/fontconfig so far, we have been delaying the linking, because we didn't want to make the monolithic platformsupport module pull in spurious dependencies. however, now that the module was split, there is no need to play such games any more. a nice effect of this is that the hideous qpa/*unixfontdatabase.prf files disappear, and finally freetype_dependency.pri also becomes trivial and is thus inlined. Change-Id: I255376d592625542310a31222eb6ac965943df99 Reviewed-by: Jake Petroules --- src/3rdparty/freetype_dependency.pri | 5 ----- src/platformsupport/fontdatabases/basic/basic.pri | 2 +- src/platformsupport/fontdatabases/fontconfig/fontconfig.pri | 2 +- src/platformsupport/fontdatabases/fontdatabases.pro | 1 - src/platformsupport/fontdatabases/mac/coretext.pri | 2 +- src/plugins/platforms/android/android.pro | 2 -- src/plugins/platforms/bsdfb/bsdfb.pro | 2 -- src/plugins/platforms/directfb/directfb.pro | 3 --- src/plugins/platforms/eglfs/eglfsdeviceintegration.pro | 2 +- src/plugins/platforms/integrity/integrity.pro | 2 -- src/plugins/platforms/linuxfb/linuxfb.pro | 2 -- src/plugins/platforms/minimal/minimal.pro | 2 -- src/plugins/platforms/minimalegl/minimalegl.pro | 2 +- src/plugins/platforms/mirclient/mirclient.pro | 2 -- src/plugins/platforms/openwfd/openwf.pro | 2 -- src/plugins/platforms/vnc/vnc.pro | 2 -- .../platforms/xcb/gl_integrations/gl_integrations_plugin_base.pri | 2 -- src/plugins/platforms/xcb/xcb_qpa_lib.pro | 2 -- 18 files changed, 5 insertions(+), 34 deletions(-) delete mode 100644 src/3rdparty/freetype_dependency.pri (limited to 'src') diff --git a/src/3rdparty/freetype_dependency.pri b/src/3rdparty/freetype_dependency.pri deleted file mode 100644 index c477e6fdea..0000000000 --- a/src/3rdparty/freetype_dependency.pri +++ /dev/null @@ -1,5 +0,0 @@ -qtConfig(system-freetype) { - QMAKE_USE += freetype/nolink -} else: qtConfig(freetype) { - QMAKE_USE += freetype -} diff --git a/src/platformsupport/fontdatabases/basic/basic.pri b/src/platformsupport/fontdatabases/basic/basic.pri index 575c93fe20..c50dba3ce2 100644 --- a/src/platformsupport/fontdatabases/basic/basic.pri +++ b/src/platformsupport/fontdatabases/basic/basic.pri @@ -6,4 +6,4 @@ SOURCES += \ $$PWD/qbasicfontdatabase.cpp \ $$QT_SOURCE_TREE/src/gui/text/qfontengine_ft.cpp -include($$QT_SOURCE_TREE/src/3rdparty/freetype_dependency.pri) +QMAKE_USE += freetype diff --git a/src/platformsupport/fontdatabases/fontconfig/fontconfig.pri b/src/platformsupport/fontdatabases/fontconfig/fontconfig.pri index 911f0c884d..6458464870 100644 --- a/src/platformsupport/fontdatabases/fontconfig/fontconfig.pri +++ b/src/platformsupport/fontdatabases/fontconfig/fontconfig.pri @@ -3,4 +3,4 @@ HEADERS += $$PWD/qfontconfigdatabase_p.h \ SOURCES += $$PWD/qfontconfigdatabase.cpp \ $$PWD/qfontenginemultifontconfig.cpp -QMAKE_USE += fontconfig/nolink +QMAKE_USE += fontconfig diff --git a/src/platformsupport/fontdatabases/fontdatabases.pro b/src/platformsupport/fontdatabases/fontdatabases.pro index fdfe3f59ea..7ffeda6fe2 100644 --- a/src/platformsupport/fontdatabases/fontdatabases.pro +++ b/src/platformsupport/fontdatabases/fontdatabases.pro @@ -15,7 +15,6 @@ darwin:!if(watchos:CONFIG(simulator, simulator|device)) { } unix { - CONFIG += qpa/genericunixfontdatabase include($$PWD/genericunix/genericunix.pri) qtConfig(fontconfig) { include($$PWD/fontconfig/fontconfig.pri) diff --git a/src/platformsupport/fontdatabases/mac/coretext.pri b/src/platformsupport/fontdatabases/mac/coretext.pri index 4d19a59226..1caeb2c1ac 100644 --- a/src/platformsupport/fontdatabases/mac/coretext.pri +++ b/src/platformsupport/fontdatabases/mac/coretext.pri @@ -2,7 +2,7 @@ HEADERS += $$PWD/qcoretextfontdatabase_p.h $$PWD/qfontengine_coretext_p.h OBJECTIVE_SOURCES += $$PWD/qfontengine_coretext.mm $$PWD/qcoretextfontdatabase.mm qtConfig(freetype) { - include($$QT_SOURCE_TREE/src/3rdparty/freetype_dependency.pri) + QMAKE_USE += freetype HEADERS += $$QT_SOURCE_TREE/src/gui/text/qfontengine_ft_p.h SOURCES += $$QT_SOURCE_TREE/src/gui/text/qfontengine_ft.cpp } diff --git a/src/plugins/platforms/android/android.pro b/src/plugins/platforms/android/android.pro index 5912edc847..bd3fe5a6cc 100644 --- a/src/plugins/platforms/android/android.pro +++ b/src/plugins/platforms/android/android.pro @@ -11,8 +11,6 @@ QT += \ eventdispatcher_support-private accessibility_support-private \ fontdatabase_support-private egl_support-private -CONFIG += qpa/genericunixfontdatabase - OTHER_FILES += $$PWD/android.json INCLUDEPATH += \ diff --git a/src/plugins/platforms/bsdfb/bsdfb.pro b/src/plugins/platforms/bsdfb/bsdfb.pro index 294edcd35d..770145a8ff 100644 --- a/src/plugins/platforms/bsdfb/bsdfb.pro +++ b/src/plugins/platforms/bsdfb/bsdfb.pro @@ -11,8 +11,6 @@ qtHaveModule(input_support-private): \ SOURCES = main.cpp qbsdfbintegration.cpp qbsdfbscreen.cpp HEADERS = qbsdfbintegration.h qbsdfbscreen.h -CONFIG += qpa/genericunixfontdatabase - OTHER_FILES += bsdfb.json PLUGIN_TYPE = platforms diff --git a/src/plugins/platforms/directfb/directfb.pro b/src/plugins/platforms/directfb/directfb.pro index da7634856c..406b89e3b2 100644 --- a/src/plugins/platforms/directfb/directfb.pro +++ b/src/plugins/platforms/directfb/directfb.pro @@ -44,9 +44,6 @@ qtConfig(directfb_egl) { SOURCES += qdirectfbeglhooks_stub.cpp } - -CONFIG += qpa/genericunixfontdatabase - OTHER_FILES += directfb.json PLUGIN_TYPE = platforms diff --git a/src/plugins/platforms/eglfs/eglfsdeviceintegration.pro b/src/plugins/platforms/eglfs/eglfsdeviceintegration.pro index 638d12a368..35af3615bd 100644 --- a/src/plugins/platforms/eglfs/eglfsdeviceintegration.pro +++ b/src/plugins/platforms/eglfs/eglfsdeviceintegration.pro @@ -39,7 +39,7 @@ QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF DEFINES += EGLFS_PREFERRED_PLUGIN=$$EGLFS_DEVICE_INTEGRATION } -CONFIG += egl qpa/genericunixfontdatabase +CONFIG += egl # Prevent gold linker from crashing. # This started happening when QtPlatformSupport was modularized. diff --git a/src/plugins/platforms/integrity/integrity.pro b/src/plugins/platforms/integrity/integrity.pro index 178fc1b882..0fb256793d 100644 --- a/src/plugins/platforms/integrity/integrity.pro +++ b/src/plugins/platforms/integrity/integrity.pro @@ -16,8 +16,6 @@ HEADERS = \ qintegrityfbscreen.h \ qintegrityhidmanager.h -CONFIG += qpa/genericunixfontdatabase - OTHER_FILES += integrity.json PLUGIN_TYPE = platforms diff --git a/src/plugins/platforms/linuxfb/linuxfb.pro b/src/plugins/platforms/linuxfb/linuxfb.pro index a752f95917..e2fa31211d 100644 --- a/src/plugins/platforms/linuxfb/linuxfb.pro +++ b/src/plugins/platforms/linuxfb/linuxfb.pro @@ -13,8 +13,6 @@ qtHaveModule(input_support-private): \ SOURCES = main.cpp qlinuxfbintegration.cpp qlinuxfbscreen.cpp HEADERS = qlinuxfbintegration.h qlinuxfbscreen.h -CONFIG += qpa/genericunixfontdatabase - OTHER_FILES += linuxfb.json PLUGIN_TYPE = platforms diff --git a/src/plugins/platforms/minimal/minimal.pro b/src/plugins/platforms/minimal/minimal.pro index 0fffb24d24..8cfb68824e 100644 --- a/src/plugins/platforms/minimal/minimal.pro +++ b/src/plugins/platforms/minimal/minimal.pro @@ -14,8 +14,6 @@ HEADERS = qminimalintegration.h \ OTHER_FILES += minimal.json -CONFIG += qpa/genericunixfontdatabase - PLUGIN_TYPE = platforms PLUGIN_CLASS_NAME = QMinimalIntegrationPlugin !equals(TARGET, $$QT_DEFAULT_QPA_PLUGIN): PLUGIN_EXTENDS = - diff --git a/src/plugins/platforms/minimalegl/minimalegl.pro b/src/plugins/platforms/minimalegl/minimalegl.pro index 46334a0250..88466e7f36 100644 --- a/src/plugins/platforms/minimalegl/minimalegl.pro +++ b/src/plugins/platforms/minimalegl/minimalegl.pro @@ -22,7 +22,7 @@ HEADERS = qminimaleglintegration.h \ qminimaleglbackingstore.h \ qminimaleglscreen.h -CONFIG += egl qpa/genericunixfontdatabase +CONFIG += egl OTHER_FILES += \ minimalegl.json diff --git a/src/plugins/platforms/mirclient/mirclient.pro b/src/plugins/platforms/mirclient/mirclient.pro index 054fe74a46..623f7bf97b 100644 --- a/src/plugins/platforms/mirclient/mirclient.pro +++ b/src/plugins/platforms/mirclient/mirclient.pro @@ -5,8 +5,6 @@ QT += \ theme_support-private eventdispatcher_support-private \ fontdatabase_support-private egl_support-private -CONFIG += qpa/genericunixfontdatabase - DEFINES += MESA_EGL_NO_X11_HEADERS # CONFIG += c++11 # only enables C++0x QMAKE_CXXFLAGS += -fvisibility=hidden -fvisibility-inlines-hidden -std=c++11 -Werror -Wall diff --git a/src/plugins/platforms/openwfd/openwf.pro b/src/plugins/platforms/openwfd/openwf.pro index 747cbf404a..6012731b65 100644 --- a/src/plugins/platforms/openwfd/openwf.pro +++ b/src/plugins/platforms/openwfd/openwf.pro @@ -4,8 +4,6 @@ QT += \ core-private gui-private \ eventdispatcher_support-private fontdatabase_support-private -CONFIG += qpa/genericunixfontdatabase - HEADERS += \ qopenwfddevice.h \ qopenwfdintegration.h \ diff --git a/src/plugins/platforms/vnc/vnc.pro b/src/plugins/platforms/vnc/vnc.pro index 15407f9298..3cd7e9b160 100644 --- a/src/plugins/platforms/vnc/vnc.pro +++ b/src/plugins/platforms/vnc/vnc.pro @@ -28,6 +28,4 @@ HEADERS = \ qvnc_p.h \ qvncclient.h -CONFIG += qpa/genericunixfontdatabase - OTHER_FILES += vnc.json diff --git a/src/plugins/platforms/xcb/gl_integrations/gl_integrations_plugin_base.pri b/src/plugins/platforms/xcb/gl_integrations/gl_integrations_plugin_base.pri index b44e4ecaa9..4ab406acb9 100644 --- a/src/plugins/platforms/xcb/gl_integrations/gl_integrations_plugin_base.pri +++ b/src/plugins/platforms/xcb/gl_integrations/gl_integrations_plugin_base.pri @@ -18,8 +18,6 @@ qtConfig(xcb-sm) { DEFINES += XCB_USE_SM } -CONFIG += qpa/genericunixfontdatabase - !qtConfig(system-xcb) { DEFINES += XCB_USE_RENDER QMAKE_USE += xcb-static xcb diff --git a/src/plugins/platforms/xcb/xcb_qpa_lib.pro b/src/plugins/platforms/xcb/xcb_qpa_lib.pro index 37556baa1d..6db0c76dea 100644 --- a/src/plugins/platforms/xcb/xcb_qpa_lib.pro +++ b/src/plugins/platforms/xcb/xcb_qpa_lib.pro @@ -70,8 +70,6 @@ qtConfig(xcb-sm) { include(gl_integrations/gl_integrations.pri) -CONFIG += qpa/genericunixfontdatabase - !qtConfig(system-xcb) { DEFINES += XCB_USE_RENDER QMAKE_USE += xcb-static xcb -- cgit v1.2.3 From d976cee1e524006a3c813c23d46fd0404d1cac08 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 29 Sep 2016 10:46:59 +0200 Subject: make use of QT_REQUIRE_CONFIG() in platformsupport modules Change-Id: I26fbe75c65c10d68454e64e306f7155367e66cf6 Reviewed-by: Jake Petroules --- src/platformsupport/accessibility/accessibility.pro | 2 +- src/platformsupport/accessibility/qaccessiblebridgeutils.cpp | 4 ---- src/platformsupport/accessibility/qaccessiblebridgeutils_p.h | 6 +++--- src/platformsupport/linuxaccessibility/application_p.h | 5 ++--- src/platformsupport/linuxaccessibility/atspiadaptor_p.h | 5 +++-- src/platformsupport/linuxaccessibility/bridge_p.h | 5 +++-- src/platformsupport/linuxaccessibility/cache_p.h | 5 +++-- src/platformsupport/linuxaccessibility/constant_mappings_p.h | 4 ++-- src/platformsupport/linuxaccessibility/struct_marshallers_p.h | 5 +++-- src/platformsupport/themes/genericunix/dbustray/qdbustrayicon_p.h | 5 ++--- src/platformsupport/themes/genericunix/dbustray/qdbustraytypes_p.h | 5 +++-- .../themes/genericunix/dbustray/qstatusnotifieritemadaptor_p.h | 6 +++--- 12 files changed, 28 insertions(+), 29 deletions(-) (limited to 'src') diff --git a/src/platformsupport/accessibility/accessibility.pro b/src/platformsupport/accessibility/accessibility.pro index 49be899b08..5004dc8cbe 100644 --- a/src/platformsupport/accessibility/accessibility.pro +++ b/src/platformsupport/accessibility/accessibility.pro @@ -1,7 +1,7 @@ TARGET = QtAccessibilitySupport MODULE = accessibility_support -QT = core-private gui +QT = core-private gui-private CONFIG += static internal_module DEFINES += QT_NO_CAST_FROM_ASCII diff --git a/src/platformsupport/accessibility/qaccessiblebridgeutils.cpp b/src/platformsupport/accessibility/qaccessiblebridgeutils.cpp index 935cff3e6c..f280e65c29 100644 --- a/src/platformsupport/accessibility/qaccessiblebridgeutils.cpp +++ b/src/platformsupport/accessibility/qaccessiblebridgeutils.cpp @@ -39,8 +39,6 @@ #include "qaccessiblebridgeutils_p.h" #include -#ifndef QT_NO_ACCESSIBILITY - QT_BEGIN_NAMESPACE namespace QAccessibleBridgeUtils { @@ -113,5 +111,3 @@ bool performEffectiveAction(QAccessibleInterface *iface, const QString &actionNa } //namespace QT_END_NAMESPACE - -#endif diff --git a/src/platformsupport/accessibility/qaccessiblebridgeutils_p.h b/src/platformsupport/accessibility/qaccessiblebridgeutils_p.h index 79b153a749..cf8e126894 100644 --- a/src/platformsupport/accessibility/qaccessiblebridgeutils_p.h +++ b/src/platformsupport/accessibility/qaccessiblebridgeutils_p.h @@ -51,10 +51,12 @@ // We mean it. // +#include + #include #include -#ifndef QT_NO_ACCESSIBILITY +QT_REQUIRE_CONFIG(accessibility); QT_BEGIN_NAMESPACE @@ -65,6 +67,4 @@ namespace QAccessibleBridgeUtils { QT_END_NAMESPACE -#endif - #endif //QACCESSIBLEBRIDGEUTILS_H diff --git a/src/platformsupport/linuxaccessibility/application_p.h b/src/platformsupport/linuxaccessibility/application_p.h index 2e6d7a78c1..9c053b253c 100644 --- a/src/platformsupport/linuxaccessibility/application_p.h +++ b/src/platformsupport/linuxaccessibility/application_p.h @@ -51,12 +51,13 @@ // We mean it. // +#include #include #include #include #include -#ifndef QT_NO_ACCESSIBILITY +QT_REQUIRE_CONFIG(accessibility); QT_BEGIN_NAMESPACE @@ -94,6 +95,4 @@ private: QT_END_NAMESPACE -#endif //QT_NO_ACCESSIBILITY - #endif diff --git a/src/platformsupport/linuxaccessibility/atspiadaptor_p.h b/src/platformsupport/linuxaccessibility/atspiadaptor_p.h index 87bdbe4bb6..b5704f53ad 100644 --- a/src/platformsupport/linuxaccessibility/atspiadaptor_p.h +++ b/src/platformsupport/linuxaccessibility/atspiadaptor_p.h @@ -54,6 +54,7 @@ #include +#include #include #include #include @@ -61,7 +62,8 @@ #include "dbusconnection_p.h" #include "struct_marshallers_p.h" -#ifndef QT_NO_ACCESSIBILITY +QT_REQUIRE_CONFIG(accessibility); + QT_BEGIN_NAMESPACE class QAccessibleInterface; @@ -222,6 +224,5 @@ private: }; QT_END_NAMESPACE -#endif //QT_NO_ACCESSIBILITY #endif diff --git a/src/platformsupport/linuxaccessibility/bridge_p.h b/src/platformsupport/linuxaccessibility/bridge_p.h index 44dfa82f5d..1e435ca351 100644 --- a/src/platformsupport/linuxaccessibility/bridge_p.h +++ b/src/platformsupport/linuxaccessibility/bridge_p.h @@ -52,12 +52,14 @@ // We mean it. // +#include #include #include class DeviceEventControllerAdaptor; -#ifndef QT_NO_ACCESSIBILITY +QT_REQUIRE_CONFIG(accessibility); + QT_BEGIN_NAMESPACE class DBusConnection; @@ -89,6 +91,5 @@ private: }; QT_END_NAMESPACE -#endif //QT_NO_ACCESSIBILITY #endif diff --git a/src/platformsupport/linuxaccessibility/cache_p.h b/src/platformsupport/linuxaccessibility/cache_p.h index f141785301..e8529b779b 100644 --- a/src/platformsupport/linuxaccessibility/cache_p.h +++ b/src/platformsupport/linuxaccessibility/cache_p.h @@ -52,10 +52,12 @@ // We mean it. // +#include #include #include "struct_marshallers_p.h" -#ifndef QT_NO_ACCESSIBILITY +QT_REQUIRE_CONFIG(accessibility); + QT_BEGIN_NAMESPACE class QSpiDBusCache : public QObject @@ -76,6 +78,5 @@ public Q_SLOTS: }; QT_END_NAMESPACE -#endif //QT_NO_ACCESSIBILITY #endif /* Q_SPI_CACHE_H */ diff --git a/src/platformsupport/linuxaccessibility/constant_mappings_p.h b/src/platformsupport/linuxaccessibility/constant_mappings_p.h index a096261da6..4da818c8c1 100644 --- a/src/platformsupport/linuxaccessibility/constant_mappings_p.h +++ b/src/platformsupport/linuxaccessibility/constant_mappings_p.h @@ -58,10 +58,11 @@ #include "struct_marshallers_p.h" +#include #include #include -#ifndef QT_NO_ACCESSIBILITY +QT_REQUIRE_CONFIG(accessibility); // interface names from at-spi2-core/atspi/atspi-misc-private.h #define ATSPI_DBUS_NAME_REGISTRY "org.a11y.atspi.Registry" @@ -141,6 +142,5 @@ QSpiUIntList spiStateSetFromSpiStates(quint64 states); AtspiRelationType qAccessibleRelationToAtSpiRelation(QAccessible::Relation relation); QT_END_NAMESPACE -#endif //QT_NO_ACCESSIBILITY #endif /* Q_SPI_CONSTANT_MAPPINGS_H */ diff --git a/src/platformsupport/linuxaccessibility/struct_marshallers_p.h b/src/platformsupport/linuxaccessibility/struct_marshallers_p.h index 28d96ec5ea..c8cc05ab5b 100644 --- a/src/platformsupport/linuxaccessibility/struct_marshallers_p.h +++ b/src/platformsupport/linuxaccessibility/struct_marshallers_p.h @@ -52,13 +52,15 @@ // We mean it. // +#include #include #include #include #include #include -#ifndef QT_NO_ACCESSIBILITY +QT_REQUIRE_CONFIG(accessibility); + QT_BEGIN_NAMESPACE typedef QVector QSpiIntList; @@ -192,5 +194,4 @@ Q_DECLARE_METATYPE(QSpiAttributeSet) Q_DECLARE_METATYPE(QSpiAppUpdate) Q_DECLARE_METATYPE(QSpiDeviceEvent) -#endif //QT_NO_ACCESSIBILITY #endif /* Q_SPI_STRUCT_MARSHALLERS_H */ diff --git a/src/platformsupport/themes/genericunix/dbustray/qdbustrayicon_p.h b/src/platformsupport/themes/genericunix/dbustray/qdbustrayicon_p.h index a383ef86fc..234ff60584 100644 --- a/src/platformsupport/themes/genericunix/dbustray/qdbustrayicon_p.h +++ b/src/platformsupport/themes/genericunix/dbustray/qdbustrayicon_p.h @@ -52,9 +52,9 @@ // We mean it. // -#include +#include -#ifndef QT_NO_SYSTEMTRAYICON +QT_REQUIRE_CONFIG(systemtrayicon); #include #include @@ -165,5 +165,4 @@ private: QT_END_NAMESPACE -#endif // QT_NO_SYSTEMTRAYICON #endif // QDBUSTRAYICON_H diff --git a/src/platformsupport/themes/genericunix/dbustray/qdbustraytypes_p.h b/src/platformsupport/themes/genericunix/dbustray/qdbustraytypes_p.h index 1bdc855c3c..3f75555579 100644 --- a/src/platformsupport/themes/genericunix/dbustray/qdbustraytypes_p.h +++ b/src/platformsupport/themes/genericunix/dbustray/qdbustraytypes_p.h @@ -52,7 +52,9 @@ // We mean it. // -#ifndef QT_NO_SYSTEMTRAYICON +#include + +QT_REQUIRE_CONFIG(systemtrayicon); #include #include @@ -104,5 +106,4 @@ Q_DECLARE_METATYPE(QXdgDBusImageStruct) Q_DECLARE_METATYPE(QXdgDBusImageVector) Q_DECLARE_METATYPE(QXdgDBusToolTipStruct) -#endif // QT_NO_SYSTEMTRAYICON #endif // QDBUSTRAYTYPES_P_H diff --git a/src/platformsupport/themes/genericunix/dbustray/qstatusnotifieritemadaptor_p.h b/src/platformsupport/themes/genericunix/dbustray/qstatusnotifieritemadaptor_p.h index 776e1b23ef..3f8fca7ac0 100644 --- a/src/platformsupport/themes/genericunix/dbustray/qstatusnotifieritemadaptor_p.h +++ b/src/platformsupport/themes/genericunix/dbustray/qstatusnotifieritemadaptor_p.h @@ -62,9 +62,9 @@ // We mean it. // -#include +#include -#ifndef QT_NO_SYSTEMTRAYICON +QT_REQUIRE_CONFIG(systemtrayicon); #include #include @@ -200,5 +200,5 @@ private: }; QT_END_NAMESPACE -#endif // QT_NO_SYSTEMTRAYICON + #endif // QSTATUSNOTIFIERITEMADAPTER_P_H -- cgit v1.2.3 From b00565bc2803bb783e8f2b0d02becfa73323e283 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Wed, 15 Jun 2016 14:07:33 +0200 Subject: iOS: check if qApp is still valid before accessing it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When the application quits, the iOS plugin can be told to delete after qApp has been set to null. So we need to add a check for this, to avoid error messages. Change-Id: I687e0b26e0c54fdd5a8539fe0f31b2e756ea92d8 Reviewed-by: Tor Arne Vestbø Reviewed-by: Jake Petroules --- src/plugins/platforms/ios/qiostextinputoverlay.mm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/plugins/platforms/ios/qiostextinputoverlay.mm b/src/plugins/platforms/ios/qiostextinputoverlay.mm index d930965bde..54c2e98d71 100644 --- a/src/plugins/platforms/ios/qiostextinputoverlay.mm +++ b/src/plugins/platforms/ios/qiostextinputoverlay.mm @@ -994,7 +994,8 @@ QIOSTextInputOverlay::QIOSTextInputOverlay() QIOSTextInputOverlay::~QIOSTextInputOverlay() { - disconnect(qApp, 0, this, 0); + if (qApp) + disconnect(qApp, 0, this, 0); } void QIOSTextInputOverlay::updateFocusObject() -- cgit v1.2.3 From 5d1e5003be2f508e1ee9175d7bf1906c6056b9f5 Mon Sep 17 00:00:00 2001 From: Jake Petroules Date: Fri, 14 Oct 2016 08:12:15 -0700 Subject: Explicitly mark old macros as compatibility synonyms MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ia471fff171b3bc3de40e166e18f30e6782581611 Reviewed-by: Tor Arne Vestbø Reviewed-by: Alexandru Croitor --- src/corelib/global/qglobal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index 8b67f0d3ef..1bcd30e0b3 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -593,9 +593,9 @@ Q_DECL_CONSTEXPR inline const T &qBound(const T &min, const T &val, const T &max # define QT_WATCHOS_DEPLOYMENT_TARGET_BELOW(watchos) \ QT_DARWIN_DEPLOYMENT_TARGET_BELOW(__MAC_NA, __IPHONE_NA, __TVOS_NA, watchos) +// Compatibility synonyms, do not use # define QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(osx, ios) QT_MACOS_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(osx, ios) # define QT_MAC_DEPLOYMENT_TARGET_BELOW(osx, ios) QT_MACOS_IOS_DEPLOYMENT_TARGET_BELOW(osx, ios) - # define QT_OSX_PLATFORM_SDK_EQUAL_OR_ABOVE(osx) QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(osx) # define QT_OSX_DEPLOYMENT_TARGET_BELOW(osx) QT_MACOS_DEPLOYMENT_TARGET_BELOW(osx) -- cgit v1.2.3 From 1cc6cc56e16a8fd4fd22dfa187bbb92433a8dba1 Mon Sep 17 00:00:00 2001 From: Jake Petroules Date: Fri, 14 Oct 2016 08:49:54 -0700 Subject: Fix tvOS build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I128605050b68787f8c9671f4aa8de0a1667301d8 Reviewed-by: Tor Arne Vestbø --- src/plugins/platforms/ios/qiosviewcontroller.h | 2 -- src/plugins/platforms/ios/qiosviewcontroller.mm | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/ios/qiosviewcontroller.h b/src/plugins/platforms/ios/qiosviewcontroller.h index f7b190ba22..07d5535e1a 100644 --- a/src/plugins/platforms/ios/qiosviewcontroller.h +++ b/src/plugins/platforms/ios/qiosviewcontroller.h @@ -53,11 +53,9 @@ QT_END_NAMESPACE #ifndef Q_OS_TVOS @property (nonatomic, assign) UIInterfaceOrientation lockedOrientation; -#endif // UIViewController @property (nonatomic, assign) BOOL prefersStatusBarHidden; -#ifndef Q_OS_TVOS @property (nonatomic, assign) UIStatusBarAnimation preferredStatusBarUpdateAnimation; @property (nonatomic, assign) UIStatusBarStyle preferredStatusBarStyle; #endif diff --git a/src/plugins/platforms/ios/qiosviewcontroller.mm b/src/plugins/platforms/ios/qiosviewcontroller.mm index 0478c5b8c8..c47b6d68b1 100644 --- a/src/plugins/platforms/ios/qiosviewcontroller.mm +++ b/src/plugins/platforms/ios/qiosviewcontroller.mm @@ -229,9 +229,11 @@ @implementation QIOSViewController +#ifndef Q_OS_TVOS @synthesize prefersStatusBarHidden; @synthesize preferredStatusBarUpdateAnimation; @synthesize preferredStatusBarStyle; +#endif - (id)initWithQIOSScreen:(QT_PREPEND_NAMESPACE(QIOSScreen) *)screen { -- cgit v1.2.3 From 063997f44ffc1b6650ef6d67832674d5511fdb63 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Fri, 14 Oct 2016 16:16:02 +0200 Subject: QMenu: don't force platform instance creation on construction There's a conflict between QGtk3Menu and QDbusPlatformMenuBar. The problem is that on Unity the type of the platform menu instance must be different depending on whether the menu is in the global menubar or a standalone context menu. Since QMenu creates a platform menu instance at construction time, it does not yet know whether it will be added into a menubar. QMenuBar checks that the QMenu already has a platform menu instance, and passes it to the platform menubar. As a result, a QGtk3Menu instance is passed to QDbusPlatformMenuBar. Currently, a standalone QMenu does not use the native platform menu instance. Only menus that are added to a QMenuBar do. Therefore we don't need to create the platform instance when QMenu is constructed, but only after it is added to QMenuBar. The platform menu instance creation is implemented in QMenuBarPrivate::getPlatformMenu(), and QMenu::setPlatformMenu() calls syncPlatformMenu() to take care of syncing the QMenu properties and actions to the new platform menu instance. The macOS-specific methods QMenu::toNSMenu() and QMenu::setAsDockMenu() rely on the platform menu instance, and must therefore create it on demand. This is a hot fix for the release blocker, not a long term solution. In the future, if standalone QMenus are made to use native platform menu instances, the instance must be created lazily when the menu is about to be made visible. Task-number: QTBUG-56526 Change-Id: I044933cabb1639406fe47908dfc4b1903af214d1 Reviewed-by: Dmitry Shachnev Reviewed-by: Lars Knoll --- src/widgets/widgets/qmenu.cpp | 9 ++++++++- src/widgets/widgets/qmenu_mac.mm | 6 ++++-- src/widgets/widgets/qmenu_p.h | 1 + src/widgets/widgets/qmenubar.cpp | 4 ++++ 4 files changed, 17 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/widgets/widgets/qmenu.cpp b/src/widgets/widgets/qmenu.cpp index d957dda162..a983dc6fde 100644 --- a/src/widgets/widgets/qmenu.cpp +++ b/src/widgets/widgets/qmenu.cpp @@ -153,12 +153,19 @@ void QMenuPrivate::init() scroll->scrollFlags = QMenuPrivate::QMenuScroller::ScrollNone; } - setPlatformMenu(QGuiApplicationPrivate::platformTheme()->createPlatformMenu()); sloppyState.initialize(q); delayState.initialize(q); mousePopupDelay = q->style()->styleHint(QStyle::SH_Menu_SubMenuPopupDelay, 0, q); } +QPlatformMenu *QMenuPrivate::createPlatformMenu() +{ + Q_Q(QMenu); + if (platformMenu.isNull()) + q->setPlatformMenu(QGuiApplicationPrivate::platformTheme()->createPlatformMenu()); + return platformMenu.data(); +} + void QMenuPrivate::setPlatformMenu(QPlatformMenu *menu) { Q_Q(QMenu); diff --git a/src/widgets/widgets/qmenu_mac.mm b/src/widgets/widgets/qmenu_mac.mm index fef1eb2cf4..f9f3ad08dc 100644 --- a/src/widgets/widgets/qmenu_mac.mm +++ b/src/widgets/widgets/qmenu_mac.mm @@ -80,11 +80,12 @@ inline QPlatformNativeInterface::NativeResourceForIntegrationFunction resolvePla */ NSMenu *QMenu::toNSMenu() { + Q_D(QMenu); // Call into the cocoa platform plugin: qMenuToNSMenu(platformMenu()) QPlatformNativeInterface::NativeResourceForIntegrationFunction function = resolvePlatformFunction("qmenutonsmenu"); if (function) { typedef void* (*QMenuToNSMenuFunction)(QPlatformMenu *platformMenu); - return reinterpret_cast(reinterpret_cast(function)(platformMenu())); + return reinterpret_cast(reinterpret_cast(function)(d->createPlatformMenu())); } return nil; } @@ -98,11 +99,12 @@ NSMenu *QMenu::toNSMenu() */ void QMenu::setAsDockMenu() { + Q_D(QMenu); // Call into the cocoa platform plugin: setDockMenu(platformMenu()) QPlatformNativeInterface::NativeResourceForIntegrationFunction function = resolvePlatformFunction("setdockmenu"); if (function) { typedef void (*SetDockMenuFunction)(QPlatformMenu *platformMenu); - reinterpret_cast(function)(platformMenu()); + reinterpret_cast(function)(d->createPlatformMenu()); } } diff --git a/src/widgets/widgets/qmenu_p.h b/src/widgets/widgets/qmenu_p.h index 2b0dc482da..3166e6f6cd 100644 --- a/src/widgets/widgets/qmenu_p.h +++ b/src/widgets/widgets/qmenu_p.h @@ -286,6 +286,7 @@ public: delete platformMenu.data(); } void init(); + QPlatformMenu *createPlatformMenu(); void setPlatformMenu(QPlatformMenu *menu); void syncPlatformMenu(); #ifdef Q_OS_OSX diff --git a/src/widgets/widgets/qmenubar.cpp b/src/widgets/widgets/qmenubar.cpp index a77c0f9753..63fe09f77e 100644 --- a/src/widgets/widgets/qmenubar.cpp +++ b/src/widgets/widgets/qmenubar.cpp @@ -1192,6 +1192,10 @@ QPlatformMenu *QMenuBarPrivate::getPlatformMenu(QAction *action) QPlatformMenu *platformMenu = action->menu()->platformMenu(); if (!platformMenu && platformMenuBar) { platformMenu = platformMenuBar->createMenu(); + // QPlatformMenuBar::createMenu() was introduced in Qt 5.7. Not all third party + // platform themes are using it, so fallback to QPlatformTheme::createPlatformMenu(). + if (!platformMenu) + platformMenu = QGuiApplicationPrivate::platformTheme()->createPlatformMenu(); if (platformMenu) action->menu()->setPlatformMenu(platformMenu); } -- cgit v1.2.3 From d71bb504a635b51a85f3ccd919e0d77f869e50a8 Mon Sep 17 00:00:00 2001 From: hjk Date: Sun, 16 Oct 2016 13:26:30 +0200 Subject: Fix QtGui compilation without OpenGL Change-Id: I2a9f8bde7d2ba672e4e664ff731a3272a6def516 Reviewed-by: Laszlo Agocs --- src/gui/kernel/qsurfaceformat.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src') diff --git a/src/gui/kernel/qsurfaceformat.cpp b/src/gui/kernel/qsurfaceformat.cpp index 18fde5716b..109ba8e610 100644 --- a/src/gui/kernel/qsurfaceformat.cpp +++ b/src/gui/kernel/qsurfaceformat.cpp @@ -759,11 +759,13 @@ Q_GLOBAL_STATIC(QSurfaceFormat, qt_default_surface_format) */ void QSurfaceFormat::setDefaultFormat(const QSurfaceFormat &format) { +#ifndef QT_NO_OPENGL QOpenGLContext *globalContext = QOpenGLContext::globalShareContext(); if (globalContext && globalContext->isValid()) { qWarning("Warning: Setting a new default format with a different version or profile after " "the global shared context is created may cause issues with context sharing."); } +#endif *qt_default_surface_format() = format; } -- cgit v1.2.3 From 9d696af6cd45ee95c155829999b8184229f9bc72 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Tue, 11 Oct 2016 11:24:37 +0200 Subject: Disable WindowsContextHelpButtonHint for Dialogs that are not QWidget MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Do not set WindowsContextHelpButtonHint directly in Windows QPA plugin, but instead rely on logic in QWidgetPrivate::adjustFlags for widgets. If WindowsContextHelpButtonHint is set, a '?' button is shown in the windows decoration. If pressed, an EnterWhatsThisMode event is generated that is consumed in QApplication that then calls into the QWhatsThis singleton, which changes the mouse cursor, and informs the top-level QWidgets about the state change etc. For QGuiApplications though the event is not generated, which makes the button useless by default. In addition, QWhatsThis only works with top level QWidgets, not e.g. QQuickWindows. So for apps using QApplication and QtQuick.Controls this means that the "What's this mode" is never exited. Given that the paradigm is somewhat outdated on the desktop it is unlikely that Qt Quick Controls will implement support for What's this. Anyhow, QWidgetPrivate::adjustFlags sets the hint for Qt::Dialogs, too, so there's no need to set it the Windows QPA plugin. [ChangeLog][Windows] 'What's this' button is now shown by default only for QWidget dialogs. Task-number: QTBUG-56239 Change-Id: I1ea3e92ade723b5865c8f2e19674413433658942 Reviewed-by: Tor Arne Vestbø --- src/plugins/platforms/windows/qwindowswindow.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index 7289f8de6d..0ebed59a1d 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -424,11 +424,9 @@ static inline void fixTopLevelWindowFlags(Qt::WindowFlags &flags) |Qt::WindowMaximizeButtonHint|Qt::WindowCloseButtonHint; break; case Qt::Dialog: - flags |= Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowContextHelpButtonHint | Qt::WindowCloseButtonHint; - break; case Qt::Tool: - flags |= Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint; - break; + flags |= Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint; + break; default: break; } -- cgit v1.2.3 From ce2ae6ebd8cfebf9edbb0b5653e80de029669548 Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Mon, 17 Oct 2016 13:35:45 +0200 Subject: Windows: Fix rendering of MingLiU fonts at some scales At certain sizes and scales, GDI will clip away the bottom line of pixels when rendering the MingLiU fonts. Since DirectWrite renders it correctly, we force the use of DirectWrite in this case. This also requires supporting classic GDI rendering in the DirectWrite engine, to make sure the rendering still looks correct. Note that this does not cover the corner case where the font is loaded directly from data with QRawFont. [ChangeLog][QtGui][Windows] Fixed rendering error when using the MingLiU fonts at certain combinations of pixel size and scale. Task-number: QTBUG-49346 Change-Id: Ie026c0d5932717858c4536dae077013eb6a1eafc Reviewed-by: Konstantin Ritt Reviewed-by: Simon Hausmann --- .../platforms/windows/qwindowsfontdatabase.cpp | 12 ++++++++++-- .../windows/qwindowsfontenginedirectwrite.cpp | 20 ++++++++++++++------ 2 files changed, 24 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp index 4f022141cf..1630b80306 100644 --- a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp +++ b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp @@ -110,13 +110,21 @@ static void createDirectWriteFactory(IDWriteFactory **factory) *factory = static_cast(result); } -static inline bool useDirectWrite(QFont::HintingPreference hintingPreference, bool isColorFont = false) +static inline bool useDirectWrite(QFont::HintingPreference hintingPreference, + const QString &familyName = QString(), + bool isColorFont = false) { const unsigned options = QWindowsIntegration::instance()->options(); if (Q_UNLIKELY(options & QWindowsIntegration::DontUseDirectWriteFonts)) return false; if (isColorFont) return (options & QWindowsIntegration::DontUseColorFonts) == 0; + + // At some scales, GDI will misrender the MingLiU font, so we force use of + // DirectWrite to work around the issue. + if (Q_UNLIKELY(familyName.startsWith(QLatin1String("MingLiU")))) + return true; + return hintingPreference == QFont::PreferNoHinting || hintingPreference == QFont::PreferVerticalHinting || (QHighDpiScaling::isActive() && hintingPreference == QFont::PreferDefaultHinting); @@ -1875,7 +1883,7 @@ QFontEngine *QWindowsFontDatabase::createEngine(const QFontDef &request, #endif const QFont::HintingPreference hintingPreference = static_cast(request.hintingPreference); - const bool useDw = useDirectWrite(hintingPreference, isColorFont); + const bool useDw = useDirectWrite(hintingPreference, fam, isColorFont); qCDebug(lcQpaFonts) << __FUNCTION__ << request.family << request.pointSize << "pt" << "hintingPreference=" << hintingPreference << "color=" << isColorFont << dpi << "dpi" << "useDirectWrite=" << useDw; diff --git a/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.cpp b/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.cpp index 66cc08f9fa..334e9cb8b9 100644 --- a/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.cpp +++ b/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.cpp @@ -185,6 +185,18 @@ namespace { } +static DWRITE_RENDERING_MODE hintingPreferenceToRenderingMode(QFont::HintingPreference hintingPreference) +{ + switch (hintingPreference) { + case QFont::PreferNoHinting: + return DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC; + case QFont::PreferVerticalHinting: + return DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL; + default: + return DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC; + } +} + /*! \class QWindowsFontEngineDirectWrite \brief Windows font engine using Direct Write. @@ -661,9 +673,7 @@ QImage QWindowsFontEngineDirectWrite::imageForGlyph(glyph_t t, transform.m22 = xform.m22(); DWRITE_RENDERING_MODE renderMode = - fontDef.hintingPreference == QFont::PreferNoHinting - ? DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC - : DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL; + hintingPreferenceToRenderingMode(QFont::HintingPreference(fontDef.hintingPreference)); IDWriteGlyphRunAnalysis *glyphAnalysis = NULL; HRESULT hr = m_fontEngineData->directWriteFactory->CreateGlyphRunAnalysis( @@ -950,9 +960,7 @@ glyph_metrics_t QWindowsFontEngineDirectWrite::alphaMapBoundingBox(glyph_t glyph transform.m22 = matrix.m22(); DWRITE_RENDERING_MODE renderMode = - fontDef.hintingPreference == QFont::PreferNoHinting - ? DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC - : DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL; + hintingPreferenceToRenderingMode(QFont::HintingPreference(fontDef.hintingPreference)); IDWriteGlyphRunAnalysis *glyphAnalysis = NULL; HRESULT hr = m_fontEngineData->directWriteFactory->CreateGlyphRunAnalysis( -- cgit v1.2.3 From a81b39934567e46addb9cb822fbaf71e6ffa9ee4 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Mon, 29 Aug 2016 10:06:49 +0200 Subject: Compile uic and qdbusxml2cpp more often against libbootstrap Otherwise, those tools do not compile in configurations which exclude features that these tools require (e.g., -no-feature-textcodec). Change-Id: I9f27257221755a35a48ae2efa9df63f1a319118e Reviewed-by: Lars Knoll Reviewed-by: Oswald Buddenhagen --- src/src.pro | 9 ++++++--- src/tools/qdbusxml2cpp/qdbusxml2cpp.pro | 2 ++ src/tools/uic/uic.pro | 2 ++ 3 files changed, 10 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/src.pro b/src/src.pro index 541053eba5..87391eab5b 100644 --- a/src/src.pro +++ b/src/src.pro @@ -4,6 +4,9 @@ QT_FOR_CONFIG += gui-private include($$OUT_PWD/corelib/qtcore-config.pri) include($$OUT_PWD/gui/qtgui-config.pri) +force_bootstrap|!qtConfig(commandlineparser): \ + CONFIG += force_dbus_bootstrap + src_qtzlib.file = $$PWD/corelib/qtzlib.pro src_qtzlib.target = sub-zlib @@ -34,7 +37,7 @@ src_tools_bootstrap_dbus.depends = src_tools_bootstrap src_tools_qdbusxml2cpp.subdir = tools/qdbusxml2cpp src_tools_qdbusxml2cpp.target = sub-qdbusxml2cpp -force_bootstrap: src_tools_qdbusxml2cpp.depends = src_tools_bootstrap_dbus +force_dbus_bootstrap: src_tools_qdbusxml2cpp.depends = src_tools_bootstrap_dbus else: src_tools_qdbusxml2cpp.depends = src_dbus src_tools_qdbuscpp2xml.subdir = tools/qdbuscpp2xml @@ -57,7 +60,7 @@ src_xml.depends = src_corelib src_dbus.subdir = $$PWD/dbus src_dbus.target = sub-dbus src_dbus.depends = src_corelib -force_bootstrap: src_dbus.depends += src_tools_bootstrap_dbus # avoid syncqt race +force_dbus_bootstrap: src_dbus.depends += src_tools_bootstrap_dbus # avoid syncqt race src_concurrent.subdir = $$PWD/concurrent src_concurrent.target = sub-concurrent @@ -143,7 +146,7 @@ TOOLS = src_tools_moc src_tools_rcc src_tools_qlalr win32:SUBDIRS += src_winmain SUBDIRS += src_network src_sql src_xml src_testlib qtConfig(dbus) { - force_bootstrap|qtConfig(private_tests): \ + force_dbus_bootstrap|qtConfig(private_tests): \ SUBDIRS += src_tools_bootstrap_dbus SUBDIRS += src_dbus src_tools_qdbusxml2cpp src_tools_qdbuscpp2xml TOOLS += src_tools_qdbusxml2cpp src_tools_qdbuscpp2xml diff --git a/src/tools/qdbusxml2cpp/qdbusxml2cpp.pro b/src/tools/qdbusxml2cpp/qdbusxml2cpp.pro index cb14db5fef..d9ee5de0be 100644 --- a/src/tools/qdbusxml2cpp/qdbusxml2cpp.pro +++ b/src/tools/qdbusxml2cpp/qdbusxml2cpp.pro @@ -1,4 +1,6 @@ option(host_build) +!force_bootstrap:!qtConfig(commandlineparser): \ + CONFIG += force_bootstrap QT = core-private force_bootstrap: QT += bootstrap_dbus-private else: QT += dbus-private diff --git a/src/tools/uic/uic.pro b/src/tools/uic/uic.pro index 8008dde07a..9afb2d847f 100644 --- a/src/tools/uic/uic.pro +++ b/src/tools/uic/uic.pro @@ -1,4 +1,6 @@ option(host_build) +!force_bootstrap:if(!qtConfig(commandlineparser)|!qtConfig(textcodec)): \ + CONFIG += force_bootstrap DEFINES += QT_UIC QT_NO_CAST_FROM_ASCII QT_NO_FOREACH -- cgit v1.2.3 From 7c1d640c0c6970342693ce04a60d9b1c84948b1e Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Tue, 11 Oct 2016 18:09:07 +0200 Subject: stop exporting the library versions all users of this functionality have been removed, and not emitting the version info saves quite some noise from the generated files. the reason why the users have been removed is that it was unreliable in the first place: if a dependency is found without pkg-config, no version information would be available. the extraction of the version via pkg-config itself is kept in place, as configure tests could be potentially optimized by utilizing it. this reverts much of commit 48b4e0bf6f. Change-Id: I01917f3b2a56b747d7cc54955141d20d23d0990a Reviewed-by: Jake Petroules Reviewed-by: Lars Knoll --- src/corelib/global/qglobal_p.h | 5 ----- 1 file changed, 5 deletions(-) (limited to 'src') diff --git a/src/corelib/global/qglobal_p.h b/src/corelib/global/qglobal_p.h index c329357f46..b8f9e5fbf7 100644 --- a/src/corelib/global/qglobal_p.h +++ b/src/corelib/global/qglobal_p.h @@ -53,10 +53,5 @@ #include #endif -#define QT_LIBRARY_VERSION(lib) QT_LIBRARY_VERSION_##lib -#define QT_LIBRARY_VERSION_MAJOR(lib) (QT_LIBRARY_VERSION_##lib >> 16) -#define QT_LIBRARY_VERSION_MINOR(lib) ((QT_LIBRARY_VERSION_##lib >> 8) & 0xff) -#define QT_LIBRARY_VERSION_PATCH(lib) (QT_LIBRARY_VERSION_##lib & 0xff) - #endif // QGLOBAL_P_H -- cgit v1.2.3 From 983d9e0c1a93a8f4350fa5c7f1ec4809e15e0d6e Mon Sep 17 00:00:00 2001 From: hjk Date: Sun, 16 Oct 2016 12:35:44 +0200 Subject: Fix DBus compilation Don't use C++11 nullptr in 5.6. Change-Id: I57e9595b2e1cede995eed09878bf02ee30482659 Reviewed-by: Marc Mutz Reviewed-by: Alberto Mardegan --- src/dbus/qdbusserver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/dbus/qdbusserver.cpp b/src/dbus/qdbusserver.cpp index 39d08b4e63..0833134bb3 100644 --- a/src/dbus/qdbusserver.cpp +++ b/src/dbus/qdbusserver.cpp @@ -105,7 +105,7 @@ QDBusServer::~QDBusServer() } d->serverConnectionNames.clear(); } - d->serverObject = nullptr; + d->serverObject = Q_NULLPTR; d->ref.store(0); d->deleteLater(); } -- cgit v1.2.3 From cbb2ba23e203374132e4b134b1c8f1a3626d2378 Mon Sep 17 00:00:00 2001 From: Frederik Schwarzer Date: Mon, 17 Oct 2016 18:56:20 +0200 Subject: Qt 5.7 requires C++11 so this hint is not needed anymore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I7e267c69ccf3835e4d69b4c612f1baaf40d8be39 Reviewed-by: Frederik Gladhorn Reviewed-by: Topi Reiniö --- src/corelib/doc/src/containers.qdoc | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/corelib/doc/src/containers.qdoc b/src/corelib/doc/src/containers.qdoc index 0b98397a68..a1c32bb007 100644 --- a/src/corelib/doc/src/containers.qdoc +++ b/src/corelib/doc/src/containers.qdoc @@ -158,11 +158,8 @@ \endtable Containers can be nested. For example, it is perfectly possible - to use a QMap >, where the key type is - QString and the value type QList. The only pitfall is that - you must insert a space between the closing angle brackets (>); - otherwise the C++ compiler will misinterpret the two >'s as a - right-shift operator (>>) and report a syntax error. + to use a QMap>, where the key type is + QString and the value type QList. The containers are defined in individual header files with the same name as the container (e.g., \c ). For -- cgit v1.2.3 From ed5d04fcfc4e00ce92b04d442e1e69cebb01bc9c Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Fri, 14 Oct 2016 10:40:56 +0200 Subject: QOrderedMutexLocker: fix UB (pointer comparison with <) in static relock() Comparing pointers that do not point into the same array using operator< is UB. You need to use std::less<>. The QOrderedMutexLocker ctor already used std::less to compare pointers, but the static relock() function was not fixed. Amends 50073521649e3818d87920751ab95acd2c2dfd15. Change-Id: I584d382391dd5a2af75020a4e77f3e42ee5d5708 Reviewed-by: Giuseppe D'Angelo --- src/corelib/thread/qorderedmutexlocker_p.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/corelib/thread/qorderedmutexlocker_p.h b/src/corelib/thread/qorderedmutexlocker_p.h index 54887342e7..6402be92bf 100644 --- a/src/corelib/thread/qorderedmutexlocker_p.h +++ b/src/corelib/thread/qorderedmutexlocker_p.h @@ -93,7 +93,7 @@ public: // mtx1 is already locked, mtx2 not... do we need to unlock and relock? if (mtx1 == mtx2) return false; - if (mtx1 < mtx2) { + if (std::less()(mtx1, mtx2)) { mtx2->lock(); return true; } -- cgit v1.2.3 From 158231e073eb2f94e7a6dfbf071dc2f34283321a Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 15 Jul 2016 15:47:29 +0200 Subject: QCommonStyle::standardIcon: Add 64x64 Qt logo pixmap for SP_TitleBarMenuButton MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For SP_TitleBarMenuButton, the style defaulted to standardPixmap() would return a 16x16 XPM encoded pixmap from qcommonstylepixmaps_p.h. This resulted in a too-small menu icon when displaying QMdiSubWindow with the default icon set on a High DPI screen with Qt::AA_DisableHighDpiScaling set. Add a larger icon from resources. Change-Id: If88c606a31ee9499f520089365f685ec75e0ddad Reviewed-by: Morten Johan Sørvig --- src/widgets/styles/qcommonstyle.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/widgets/styles/qcommonstyle.cpp b/src/widgets/styles/qcommonstyle.cpp index 6bf9d20b47..6d83dea4ab 100644 --- a/src/widgets/styles/qcommonstyle.cpp +++ b/src/widgets/styles/qcommonstyle.cpp @@ -5194,6 +5194,8 @@ static QPixmap cachedPixmapFromXPM(const char * const *xpm) return result; } +static inline QPixmap titleBarMenuCachedPixmapFromXPM() { return cachedPixmapFromXPM(qt_menu_xpm); } + #ifndef QT_NO_IMAGEFORMAT_PNG static inline QString clearText16IconPath() { @@ -5538,7 +5540,7 @@ QPixmap QCommonStyle::standardPixmap(StandardPixmap sp, const QStyleOption *opti #ifndef QT_NO_IMAGEFORMAT_XPM switch (sp) { case SP_TitleBarMenuButton: - return cachedPixmapFromXPM(qt_menu_xpm); + return titleBarMenuCachedPixmapFromXPM(); case SP_TitleBarShadeButton: return cachedPixmapFromXPM(qt_shade_xpm); case SP_TitleBarUnshadeButton: @@ -6080,6 +6082,12 @@ QIcon QCommonStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption case SP_MediaVolumeMuted: icon.addFile(QLatin1String(":/qt-project.org/styles/commonstyle/images/media-volume-muted-16.png"), QSize(16, 16)); break; + case SP_TitleBarMenuButton: +# ifndef QT_NO_IMAGEFORMAT_XPM + icon.addPixmap(titleBarMenuCachedPixmapFromXPM()); +# endif + icon.addFile(QLatin1String(":/qt-project.org/qmessagebox/images/qtlogo-64.png")); + break; #endif // QT_NO_IMAGEFORMAT_PNG default: icon.addPixmap(proxy()->standardPixmap(standardIcon, option, widget)); -- cgit v1.2.3 From 4cb614c7abdaa2c5e2d0a75201d51aae01e6f8c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Mon, 3 Oct 2016 18:41:30 +0200 Subject: Apple OS: Handle QSetting strings with embedded zero-bytes Saving strings with embedded zero-bytes (\0) as CFStrings would sometimes fail, and only write the part of the string leading up to the first zero-byte, instead of all the way to the final zero-terminator. This bug was revealed by the code-path that falls back to storing e.g. QTime as strings, via the helper method QSettingsPrivate::variantToString(). We now use the same approach as on platforms such as Windows and WinRT, where the string produced by variantToString() is checked for null-bytes, and if so, stored using a binary representation instead of as a string. For our case that means we fall back to CFData when detecting the null-byte. To separate strings from regular byte arrays, new logic has been added to variantToString() that wraps the null-byte strings in @String(). That way we can implement a fast-path when converting back from CFData, that doesn't go via the slow and lossy conversion via UTF8, and the resulting QVariant will be of type QVariant::ByteArray. The reason for using UTF-8 as the binary representation of the string is that in the case of storing a QByteArray("@foo") we need to still be able to convert it back to the same byte array, which doesn't work if the on-disk format is UTF-16. Task-number: QTBUG-56124 Change-Id: Iab2f71cf96cf3225de48dc5e71870d74b6dde1e8 Cherry-picked: 764f5bf48cc87f4c72550b853ab93b815454cd48 Reviewed-by: Thiago Macieira --- src/corelib/io/qsettings.cpp | 6 +++++- src/corelib/io/qsettings_mac.cpp | 20 ++++++++++++++++++-- src/corelib/io/qsettings_win.cpp | 13 ++----------- src/corelib/io/qsettings_winrt.cpp | 4 ++-- 4 files changed, 27 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/corelib/io/qsettings.cpp b/src/corelib/io/qsettings.cpp index 9e0e6c2769..d1ae14490c 100644 --- a/src/corelib/io/qsettings.cpp +++ b/src/corelib/io/qsettings.cpp @@ -413,7 +413,9 @@ QString QSettingsPrivate::variantToString(const QVariant &v) case QVariant::Double: case QVariant::KeySequence: { result = v.toString(); - if (result.startsWith(QLatin1Char('@'))) + if (result.contains(QChar::Null)) + result = QLatin1String("@String(") + result + QLatin1Char(')'); + else if (result.startsWith(QLatin1Char('@'))) result.prepend(QLatin1Char('@')); break; } @@ -489,6 +491,8 @@ QVariant QSettingsPrivate::stringToVariant(const QString &s) if (s.endsWith(QLatin1Char(')'))) { if (s.startsWith(QLatin1String("@ByteArray("))) { return QVariant(s.midRef(11, s.size() - 12).toLatin1()); + } else if (s.startsWith(QLatin1String("@String("))) { + return QVariant(s.midRef(8, s.size() - 9).toString()); } else if (s.startsWith(QLatin1String("@Variant(")) || s.startsWith(QLatin1String("@DateTime("))) { #ifndef QT_NO_DATASTREAM diff --git a/src/corelib/io/qsettings_mac.cpp b/src/corelib/io/qsettings_mac.cpp index e0b317b4c2..0b039f73dc 100644 --- a/src/corelib/io/qsettings_mac.cpp +++ b/src/corelib/io/qsettings_mac.cpp @@ -208,7 +208,14 @@ static QCFType macValue(const QVariant &value) case QVariant::String: string_case: default: - result = QCFString::toCFStringRef(QSettingsPrivate::variantToString(value)); + QString string = QSettingsPrivate::variantToString(value); + if (string.contains(QChar::Null)) { + QByteArray ba = string.toUtf8(); + result = CFDataCreate(kCFAllocatorDefault, reinterpret_cast(ba.data()), + CFIndex(ba.size())); + } else { + result = QCFString::toCFStringRef(string); + } } return result; } @@ -261,8 +268,17 @@ static QVariant qtValue(CFPropertyListRef cfvalue) return (bool)CFBooleanGetValue(static_cast(cfvalue)); } else if (typeId == CFDataGetTypeID()) { CFDataRef cfdata = static_cast(cfvalue); - return QByteArray(reinterpret_cast(CFDataGetBytePtr(cfdata)), + QByteArray byteArray = QByteArray(reinterpret_cast(CFDataGetBytePtr(cfdata)), CFDataGetLength(cfdata)); + + // Fast-path for QByteArray, so that we don't have to go + // though the expensive and lossy conversion via UTF-8. + if (!byteArray.startsWith('@')) + return byteArray; + + const QString str = QString::fromUtf8(byteArray.constData(), byteArray.size()); + return QSettingsPrivate::stringToVariant(str); + } else if (typeId == CFDictionaryGetTypeID()) { CFDictionaryRef cfdict = static_cast(cfvalue); CFTypeID arrayTypeId = CFArrayGetTypeID(); diff --git a/src/corelib/io/qsettings_win.cpp b/src/corelib/io/qsettings_win.cpp index da0c4c3c14..f6ad182c37 100644 --- a/src/corelib/io/qsettings_win.cpp +++ b/src/corelib/io/qsettings_win.cpp @@ -649,15 +649,6 @@ void QWinSettingsPrivate::remove(const QString &uKey) } } -static bool stringContainsNullChar(const QString &s) -{ - for (int i = 0; i < s.length(); ++i) { - if (s.at(i).unicode() == 0) - return true; - } - return false; -} - void QWinSettingsPrivate::set(const QString &uKey, const QVariant &value) { if (writeHandle() == 0) { @@ -686,7 +677,7 @@ void QWinSettingsPrivate::set(const QString &uKey, const QVariant &value) QStringList l = variantListToStringList(value.toList()); QStringList::const_iterator it = l.constBegin(); for (; it != l.constEnd(); ++it) { - if ((*it).length() == 0 || stringContainsNullChar(*it)) { + if ((*it).length() == 0 || it->contains(QChar::Null)) { type = REG_BINARY; break; } @@ -730,7 +721,7 @@ void QWinSettingsPrivate::set(const QString &uKey, const QVariant &value) // If the string does not contain '\0', we can use REG_SZ, the native registry // string type. Otherwise we use REG_BINARY. QString s = variantToString(value); - type = stringContainsNullChar(s) ? REG_BINARY : REG_SZ; + type = s.contains(QChar::Null) ? REG_BINARY : REG_SZ; if (type == REG_BINARY) { regValueBuff = QByteArray((const char*)s.utf16(), s.length() * 2); } else { diff --git a/src/corelib/io/qsettings_winrt.cpp b/src/corelib/io/qsettings_winrt.cpp index 85ef64cbd4..5ab1133ef3 100644 --- a/src/corelib/io/qsettings_winrt.cpp +++ b/src/corelib/io/qsettings_winrt.cpp @@ -396,7 +396,7 @@ void QWinRTSettingsPrivate::set(const QString &uKey, const QVariant &value) QStringList::const_iterator it = l.constBegin(); bool containsNull = false; for (; it != l.constEnd(); ++it) { - if ((*it).length() == 0 || it->indexOf(QChar::Null) != -1) { + if ((*it).length() == 0 || it->contains(QChar::Null)) { // We can only store as binary containsNull = true; break; @@ -439,7 +439,7 @@ void QWinRTSettingsPrivate::set(const QString &uKey, const QVariant &value) break; default: { const QString s = variantToString(value); - if (s.indexOf(QChar::Null) != -1) { + if (s.contains(QChar::Null)) { hr = valueStatics->CreateUInt8Array(s.length() * 2, (BYTE*) s.utf16(), &val); } else { HStringReference ref((const wchar_t*)s.utf16(), s.size()); -- cgit v1.2.3 From 4a4368df5663729a34761c394a6f02b72071e89c Mon Sep 17 00:00:00 2001 From: Anton Kudryavtsev Date: Tue, 18 Oct 2016 13:17:53 +0300 Subject: QAndroidPlatformTheme: wrap char* in QL1S to avoid warnings Change-Id: Idcc70038051b03366aa447f3a4c48912d3f911d5 Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/plugins/platforms/android/qandroidplatformtheme.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/android/qandroidplatformtheme.cpp b/src/plugins/platforms/android/qandroidplatformtheme.cpp index 9350a15721..801bb78436 100644 --- a/src/plugins/platforms/android/qandroidplatformtheme.cpp +++ b/src/plugins/platforms/android/qandroidplatformtheme.cpp @@ -458,9 +458,9 @@ QVariant QAndroidPlatformTheme::themeHint(ThemeHint hint) const case StyleNames: if (qEnvironmentVariableIntValue("QT_USE_ANDROID_NATIVE_STYLE") && m_androidStyleData) { - return QStringList("android"); + return QStringList(QLatin1String("android")); } - return QStringList("fusion"); + return QStringList(QLatin1String("fusion")); case MouseDoubleClickDistance: { -- cgit v1.2.3 From e80faf3db61ca9c701cd86876e3bce8e33226576 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Mon, 17 Oct 2016 13:00:04 +0200 Subject: QTimer: don't circumvent safety net By templating on the types and unconditionally using duration_cast to coerce the duration into a milliseconds, we violate a principal design rule of , namely that non- narrowing conversions are implicit, but narrowing conversions need duration_cast. By accepting any duration, we allow non- sensical code such as QTimer::singleShot(10us, ...) to compile, which is misleading, since it's actually a zero- timeout timer. Overloading a non-template with a template also has adverse effects: it breaks qOverload(). Fix by replacing the function templates with functions that just take std::chrono::milliseconds. This way, benign code such as QTimer::singleShot(10s, ...) QTimer::singleShot(10min, ...) QTimer::singleShot(1h, ...) work as expected, but attempts to use sub-millisecond resolution fails to compile / needs an explicit user- provided duration_cast. To allow future extension to more precise timers, forcibly inline the functions, so they don't partake in the ABI of the class and we can later support sub-millisecond resolution by simply taking micro- or nano- instead of milliseconds. Change-Id: I12c9a98bdabefcd8ec18a9eb09f87ad908d889de Reviewed-by: Thiago Macieira --- src/corelib/kernel/qtimer.cpp | 12 ++++++------ src/corelib/kernel/qtimer.h | 36 ++++++++++++++++++------------------ 2 files changed, 24 insertions(+), 24 deletions(-) (limited to 'src') diff --git a/src/corelib/kernel/qtimer.cpp b/src/corelib/kernel/qtimer.cpp index 6d39233aa7..4a5738a6dc 100644 --- a/src/corelib/kernel/qtimer.cpp +++ b/src/corelib/kernel/qtimer.cpp @@ -533,7 +533,7 @@ void QTimer::singleShot(int msec, Qt::TimerType timerType, const QObject *receiv */ /*! - \fn void QTimer::singleShot(std::chrono::duration value, const QObject *receiver, const char *member) + \fn void QTimer::singleShot(std::chrono::milliseconds msec, const QObject *receiver, const char *member) \since 5.8 \overload \reentrant @@ -545,13 +545,13 @@ void QTimer::singleShot(int msec, Qt::TimerType timerType, const QObject *receiv create a local QTimer object. The \a receiver is the receiving object and the \a member is the slot. The - time interval is given in the duration object \a value. + time interval is given in the duration object \a msec. \sa start() */ /*! - \fn void QTimer::singleShot(std::chrono::duration value, Qt::TimerType timerType, const QObject *receiver, const char *member) + \fn void QTimer::singleShot(std::chrono::milliseconds msec, Qt::TimerType timerType, const QObject *receiver, const char *member) \since 5.8 \overload \reentrant @@ -563,18 +563,18 @@ void QTimer::singleShot(int msec, Qt::TimerType timerType, const QObject *receiv create a local QTimer object. The \a receiver is the receiving object and the \a member is the slot. The - time interval is given in the duration object \a value. The \a timerType affects the + time interval is given in the duration object \a msec. The \a timerType affects the accuracy of the timer. \sa start() */ /*! - \fn void QTimer::start(std::chrono::duration value) + \fn void QTimer::start(std::chrono::milliseconds msec) \since 5.8 \overload - Starts or restarts the timer with a timeout of duration \a value. + Starts or restarts the timer with a timeout of duration \a msec milliseconds. If the timer is already running, it will be \l{QTimer::stop()}{stopped} and restarted. diff --git a/src/corelib/kernel/qtimer.h b/src/corelib/kernel/qtimer.h index 1567fe760c..4f934d0367 100644 --- a/src/corelib/kernel/qtimer.h +++ b/src/corelib/kernel/qtimer.h @@ -165,38 +165,40 @@ Q_SIGNALS: public: #if QT_HAS_INCLUDE() || defined(Q_QDOC) - template - void setInterval(std::chrono::duration value) + Q_ALWAYS_INLINE + void setInterval(std::chrono::milliseconds value) { - setInterval(std::chrono::duration_cast(value).count()); + setInterval(value.count()); } + Q_ALWAYS_INLINE std::chrono::milliseconds intervalAsDuration() const { return std::chrono::milliseconds(interval()); } + Q_ALWAYS_INLINE std::chrono::milliseconds remainingTimeAsDuration() const { return std::chrono::milliseconds(remainingTime()); } - template - static void singleShot(std::chrono::duration value, const QObject *receiver, const char *member) + Q_ALWAYS_INLINE + static void singleShot(std::chrono::milliseconds value, const QObject *receiver, const char *member) { - singleShot(int(std::chrono::duration_cast(value).count()), receiver, member); + singleShot(int(value.count()), receiver, member); } - template - static void singleShot(std::chrono::duration value, Qt::TimerType timerType, const QObject *receiver, const char *member) + Q_ALWAYS_INLINE + static void singleShot(std::chrono::milliseconds value, Qt::TimerType timerType, const QObject *receiver, const char *member) { - singleShot(int(std::chrono::duration_cast(value).count()), timerType, receiver, member); + singleShot(int(value.count()), timerType, receiver, member); } - template - void start(std::chrono::duration value) + Q_ALWAYS_INLINE + void start(std::chrono::milliseconds value) { - start(int(std::chrono::duration_cast(value).count())); + start(int(value.count())); } #endif @@ -215,15 +217,13 @@ private: const QObject *receiver, QtPrivate::QSlotObjectBase *slotObj); #if QT_HAS_INCLUDE() - template - static Qt::TimerType defaultTypeFor(std::chrono::duration interval) - { return defaultTypeFor(int(std::chrono::duration_cast(interval).count())); } + static Qt::TimerType defaultTypeFor(std::chrono::milliseconds interval) + { return defaultTypeFor(int(interval.count())); } - template - static void singleShotImpl(std::chrono::duration interval, Qt::TimerType timerType, + static void singleShotImpl(std::chrono::milliseconds interval, Qt::TimerType timerType, const QObject *receiver, QtPrivate::QSlotObjectBase *slotObj) { - singleShotImpl(int(std::chrono::duration_cast(interval).count()), + singleShotImpl(int(interval.count()), timerType, receiver, slotObj); } #endif -- cgit v1.2.3 From 3d760312175279cbeefcfc6b26ef12ba940d5f2a Mon Sep 17 00:00:00 2001 From: Anton Kudryavtsev Date: Tue, 18 Oct 2016 14:55:38 +0300 Subject: QJsonDocument: don't re-call QVariant::type() in if-else chain Replace if-else chain with switch statement. Change-Id: Idd2d0198178685bdaf8f77fa6cae5025ea9de561 Reviewed-by: Edward Welbourne Reviewed-by: Thiago Macieira --- src/corelib/json/qjsondocument.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/corelib/json/qjsondocument.cpp b/src/corelib/json/qjsondocument.cpp index 86fd63ead4..630f61a1b0 100644 --- a/src/corelib/json/qjsondocument.cpp +++ b/src/corelib/json/qjsondocument.cpp @@ -268,14 +268,21 @@ QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidati QJsonDocument QJsonDocument::fromVariant(const QVariant &variant) { QJsonDocument doc; - if (variant.type() == QVariant::Map) { + switch (variant.type()) { + case QVariant::Map: doc.setObject(QJsonObject::fromVariantMap(variant.toMap())); - } else if (variant.type() == QVariant::Hash) { + break; + case QVariant::Hash: doc.setObject(QJsonObject::fromVariantHash(variant.toHash())); - } else if (variant.type() == QVariant::List) { + break; + case QVariant::List: doc.setArray(QJsonArray::fromVariantList(variant.toList())); - } else if (variant.type() == QVariant::StringList) { + break; + case QVariant::StringList: doc.setArray(QJsonArray::fromStringList(variant.toStringList())); + break; + default: + break; } return doc; } -- cgit v1.2.3 From f620ad1499c815da2e779cb1cbdd9758fb207c59 Mon Sep 17 00:00:00 2001 From: Anton Kudryavtsev Date: Tue, 18 Oct 2016 14:58:37 +0300 Subject: QJsonDocument: enable NRVO for gcc in toJson() Change-Id: I1b639272d38f8463b17a85a406addb74bb572756 Reviewed-by: Edward Welbourne Reviewed-by: Thiago Macieira --- src/corelib/json/qjsondocument.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/corelib/json/qjsondocument.cpp b/src/corelib/json/qjsondocument.cpp index 630f61a1b0..8927f1330b 100644 --- a/src/corelib/json/qjsondocument.cpp +++ b/src/corelib/json/qjsondocument.cpp @@ -351,10 +351,9 @@ QByteArray QJsonDocument::toJson() const #ifndef QT_JSON_READONLY QByteArray QJsonDocument::toJson(JsonFormat format) const { - if (!d) - return QByteArray(); - QByteArray json; + if (!d) + return json; if (d->header->root()->isArray()) QJsonPrivate::Writer::arrayToJson(static_cast(d->header->root()), json, 0, (format == Compact)); -- cgit v1.2.3 From a769b347542060e7d7e010c343d4a7d5c1549de0 Mon Sep 17 00:00:00 2001 From: Anton Kudryavtsev Date: Tue, 18 Oct 2016 14:05:26 +0300 Subject: QLocale: optimize string usage Use QStringBuilder more. Avoid quadratic behavior when prepending zeros in a loop, prepend whole string intead. Use const API more for CoW types. Change-Id: If114107dc3d9876b9a7c77bc0071878cb6e00892 Reviewed-by: Edward Welbourne Reviewed-by: Thiago Macieira --- src/corelib/tools/qlocale.cpp | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp index 7809c513d6..847fc2d55e 100644 --- a/src/corelib/tools/qlocale.cpp +++ b/src/corelib/tools/qlocale.cpp @@ -1072,20 +1072,14 @@ QLocale::Country QLocale::country() const QString QLocale::name() const { Language l = language(); - - QString result = d->languageCode(); - if (l == C) - return result; + return d->languageCode(); Country c = country(); if (c == AnyCountry) - return result; - - result.append(QLatin1Char('_')); - result.append(d->countryCode()); + return d->languageCode(); - return result; + return d->languageCode() + QLatin1Char('_') + d->countryCode(); } static qlonglong toIntegral_helper(const QLocaleData *d, const QChar *data, int len, bool *ok, @@ -2985,12 +2979,14 @@ QString QLocaleData::unsLongLongToString(const QChar zero, const QChar group, } } - for (int i = num_str.length()/* - cnt_thousand_sep*/; i < precision; ++i) - num_str.prepend(base == 10 ? zero : QChar::fromLatin1('0')); + const QChar resultZero = base == 10 ? zero : QChar(QLatin1Char('0')); + const int zeroPadding = precision - num_str.length()/* + cnt_thousand_sep*/; + if (zeroPadding > 0) + num_str.prepend(QString(zeroPadding, resultZero)); if ((flags & Alternate || flags & ShowBase) && base == 8 - && (num_str.isEmpty() || num_str[0].unicode() != QLatin1Char('0'))) + && (num_str.isEmpty() || num_str.at(0).unicode() != QLatin1Char('0'))) num_str.prepend(QLatin1Char('0')); // LeftAdjusted overrides this flag ZeroPadded. sprintf only padds @@ -3009,8 +3005,8 @@ QString QLocaleData::unsLongLongToString(const QChar zero, const QChar group, else if (base == 2 && flags & Alternate) num_pad_chars -= 2; - for (int i = 0; i < num_pad_chars; ++i) - num_str.prepend(base == 10 ? zero : QChar::fromLatin1('0')); + if (num_pad_chars > 0) + num_str.prepend(QString(num_pad_chars, resultZero)); } if (flags & CapitalEorX) -- cgit v1.2.3 From 6a7b683817e7427cf952130b7726833fd5be74ce Mon Sep 17 00:00:00 2001 From: Anton Kudryavtsev Date: Mon, 17 Oct 2016 18:54:26 +0300 Subject: Plugins: optimize string usage Prefer QStringRef methods to avoid allocations. Use startsWith/endsWith rather than comparing substrings; and avoid substrings where references suffice. Use new QStringList::join(QL1S). Change-Id: I46c44aca96578633370006d613eb0ac13f7cfc03 Reviewed-by: Edward Welbourne Reviewed-by: Thiago Macieira --- src/plugins/bearer/nativewifi/qnativewifiengine.cpp | 2 +- src/plugins/platforms/android/qandroidinputcontext.cpp | 11 +++++------ src/plugins/platforms/qnx/qqnxscreen.cpp | 2 +- src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp | 6 +++--- src/plugins/platforms/xcb/qxcbmime.cpp | 6 +++--- src/plugins/platformthemes/gtk3/qgtk3dialoghelpers.cpp | 4 ++-- src/plugins/printsupport/cups/qppdprintdevice.cpp | 2 +- src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp | 2 +- 8 files changed, 17 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/plugins/bearer/nativewifi/qnativewifiengine.cpp b/src/plugins/bearer/nativewifi/qnativewifiengine.cpp index 23656476bd..bb43072aba 100644 --- a/src/plugins/bearer/nativewifi/qnativewifiengine.cpp +++ b/src/plugins/bearer/nativewifi/qnativewifiengine.cpp @@ -459,7 +459,7 @@ void QNativeWifiEngine::disconnectFromId(const QString &id) return; } - QStringList split = interface.mid(1, interface.length() - 2).split('-'); + const QVector split = interface.midRef(1, interface.length() - 2).split(QLatin1Char('-')); GUID guid; guid.Data1 = split.at(0).toUInt(0, 16); diff --git a/src/plugins/platforms/android/qandroidinputcontext.cpp b/src/plugins/platforms/android/qandroidinputcontext.cpp index 06a9c8c488..2656d45d5f 100644 --- a/src/plugins/platforms/android/qandroidinputcontext.cpp +++ b/src/plugins/platforms/android/qandroidinputcontext.cpp @@ -866,7 +866,7 @@ const QAndroidInputContext::ExtractedText &QAndroidInputContext::getExtractedTex if (composeLength > 0) { //Qt doesn't give us the preedit text, so we have to insert it at the correct position int localComposePos = m_composingTextStart - blockPos; - blockText = blockText.left(localComposePos) + m_composingText + blockText.mid(localComposePos); + blockText = blockText.leftRef(localComposePos) + m_composingText + blockText.midRef(localComposePos); } int cpos = localPos + composeLength; //actual cursor pos relative to the current block @@ -930,9 +930,8 @@ QString QAndroidInputContext::getTextAfterCursor(jint length, jint /*flags*/) QString QAndroidInputContext::getTextBeforeCursor(jint length, jint /*flags*/) { QVariant textBefore = queryFocusObjectThreadSafe(Qt::ImTextBeforeCursor, QVariant(length)); - if (textBefore.isValid()) { - return textBefore.toString().right(length) + m_composingText; - } + if (textBefore.isValid()) + return textBefore.toString().rightRef(length) + m_composingText; //compatibility code for old controls that do not implement the new API QSharedPointer query = focusObjectInputMethodQueryThreadSafe(); @@ -946,9 +945,9 @@ QString QAndroidInputContext::getTextBeforeCursor(jint length, jint /*flags*/) //### the preedit text does not need to be immediately before the cursor if (cursorPos <= length) - return text.left(cursorPos) + m_composingText; + return text.leftRef(cursorPos) + m_composingText; else - return text.mid(cursorPos - length, length) + m_composingText; + return text.midRef(cursorPos - length, length) + m_composingText; } /* diff --git a/src/plugins/platforms/qnx/qqnxscreen.cpp b/src/plugins/platforms/qnx/qqnxscreen.cpp index f8ae5121d1..46df500330 100644 --- a/src/plugins/platforms/qnx/qqnxscreen.cpp +++ b/src/plugins/platforms/qnx/qqnxscreen.cpp @@ -90,7 +90,7 @@ static QSize determineScreenSize(screen_display_t display, bool primaryScreen) { const QString envPhySizeStr = qgetenv("QQNX_PHYSICAL_SCREEN_SIZE"); if (!envPhySizeStr.isEmpty()) { - const QStringList envPhySizeStrList = envPhySizeStr.split(QLatin1Char(',')); + const auto envPhySizeStrList = envPhySizeStr.splitRef(QLatin1Char(',')); const int envWidth = envPhySizeStrList.size() == 2 ? envPhySizeStrList[0].toInt() : -1; const int envHeight = envPhySizeStrList.size() == 2 ? envPhySizeStrList[1].toInt() : -1; diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp index f7c8dbdf23..bc0e5cc523 100644 --- a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp +++ b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp @@ -137,10 +137,10 @@ static FontKeys &fontKeys() QString realKey = registryFontKey; realKey.remove(trueType); realKey.remove(sizeListMatch); - const QStringList fontNames = realKey.trimmed().split(QLatin1Char('&')); + const auto fontNames = QStringRef(&realKey).trimmed().split(QLatin1Char('&')); fontKey.fontNames.reserve(fontNames.size()); - foreach (const QString &fontName, fontNames) - fontKey.fontNames.append(fontName.trimmed()); + for (const QStringRef &fontName : fontNames) + fontKey.fontNames.append(fontName.trimmed().toString()); result.append(fontKey); } } diff --git a/src/plugins/platforms/xcb/qxcbmime.cpp b/src/plugins/platforms/xcb/qxcbmime.cpp index f71c5464d0..3e9b0e1e4a 100644 --- a/src/plugins/platforms/xcb/qxcbmime.cpp +++ b/src/plugins/platforms/xcb/qxcbmime.cpp @@ -208,10 +208,10 @@ QVariant QXcbMime::mimeConvertToFormat(QXcbConnection *connection, xcb_atom_t a, reinterpret_cast(data.constData()), data.size() / 2); if (!str.isNull()) { if (format == QLatin1String("text/uri-list")) { - const QStringList urls = str.split(QLatin1Char('\n')); + const auto urls = str.splitRef(QLatin1Char('\n')); QList list; - for (const QString &s : urls) { - const QUrl url(s.trimmed()); + for (const QStringRef &s : urls) { + const QUrl url(s.trimmed().toString()); if (url.isValid()) list.append(url); } diff --git a/src/plugins/platformthemes/gtk3/qgtk3dialoghelpers.cpp b/src/plugins/platformthemes/gtk3/qgtk3dialoghelpers.cpp index 42d3c1f193..2030732e4b 100644 --- a/src/plugins/platformthemes/gtk3/qgtk3dialoghelpers.cpp +++ b/src/plugins/platformthemes/gtk3/qgtk3dialoghelpers.cpp @@ -463,10 +463,10 @@ void QGtk3FileDialogHelper::setNameFilters(const QStringList &filters) foreach (const QString &filter, filters) { GtkFileFilter *gtkFilter = gtk_file_filter_new(); - const QString name = filter.left(filter.indexOf(QLatin1Char('('))); + const QStringRef name = filter.leftRef(filter.indexOf(QLatin1Char('('))); const QStringList extensions = cleanFilterList(filter); - gtk_file_filter_set_name(gtkFilter, name.isEmpty() ? extensions.join(QStringLiteral(", ")).toUtf8() : name.toUtf8()); + gtk_file_filter_set_name(gtkFilter, name.isEmpty() ? extensions.join(QLatin1String(", ")).toUtf8() : name.toUtf8()); foreach (const QString &ext, extensions) gtk_file_filter_add_pattern(gtkFilter, ext.toUtf8()); diff --git a/src/plugins/printsupport/cups/qppdprintdevice.cpp b/src/plugins/printsupport/cups/qppdprintdevice.cpp index caa7382462..9efa83d409 100644 --- a/src/plugins/printsupport/cups/qppdprintdevice.cpp +++ b/src/plugins/printsupport/cups/qppdprintdevice.cpp @@ -63,7 +63,7 @@ QPpdPrintDevice::QPpdPrintDevice(const QString &id) if (!id.isEmpty()) { // TODO For now each dest is an individual device - QStringList parts = id.split(QLatin1Char('/')); + const auto parts = id.splitRef(QLatin1Char('/')); m_cupsName = parts.at(0).toUtf8(); if (parts.size() > 1) m_cupsInstance = parts.at(1).toUtf8(); diff --git a/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp b/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp index ef4ef2e93c..1cb0f10494 100644 --- a/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp +++ b/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp @@ -72,7 +72,7 @@ QT_BEGIN_NAMESPACE static QString _q_escapeIdentifier(const QString &identifier) { QString res = identifier; - if(!identifier.isEmpty() && identifier.left(1) != QString(QLatin1Char('"')) && identifier.right(1) != QString(QLatin1Char('"')) ) { + if (!identifier.isEmpty() && !identifier.startsWith(QLatin1Char('"')) && !identifier.endsWith(QLatin1Char('"'))) { res.replace(QLatin1Char('"'), QLatin1String("\"\"")); res.prepend(QLatin1Char('"')).append(QLatin1Char('"')); res.replace(QLatin1Char('.'), QLatin1String("\".\"")); -- cgit v1.2.3 From f939e7ea7375dbc051c81abf7b24c6fd5304cbbb Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 13 Oct 2016 09:18:05 +0200 Subject: Testlib: Move classes inheriting QBenchmarkMeasurerBase to separate header QBenchmarkTimeMeasurer uses the 3rd party header cycle_p.h which may include windows.h on Windows (32bit). This can cause clashes in qmltest, which uses QBenchmarkMeasurerBase. Move the derived classes to a separate header to prevent this. Change-Id: I943a11c32a575594e6e79e722e8809b42de35092 Reviewed-by: Maurice Kalinowski Reviewed-by: Lars Knoll --- src/testlib/qbenchmark.cpp | 1 + src/testlib/qbenchmarkmeasurement.cpp | 2 +- src/testlib/qbenchmarkmeasurement_p.h | 36 ------------- src/testlib/qbenchmarktimemeasurers_p.h | 96 +++++++++++++++++++++++++++++++++ src/testlib/testlib.pro | 1 + 5 files changed, 99 insertions(+), 37 deletions(-) create mode 100644 src/testlib/qbenchmarktimemeasurers_p.h (limited to 'src') diff --git a/src/testlib/qbenchmark.cpp b/src/testlib/qbenchmark.cpp index c884d5d740..c933a16c35 100644 --- a/src/testlib/qbenchmark.cpp +++ b/src/testlib/qbenchmark.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include #include diff --git a/src/testlib/qbenchmarkmeasurement.cpp b/src/testlib/qbenchmarkmeasurement.cpp index ac4d75ce3b..228ab15f99 100644 --- a/src/testlib/qbenchmarkmeasurement.cpp +++ b/src/testlib/qbenchmarkmeasurement.cpp @@ -37,7 +37,7 @@ ** ****************************************************************************/ -#include +#include #include #include #include diff --git a/src/testlib/qbenchmarkmeasurement_p.h b/src/testlib/qbenchmarkmeasurement_p.h index 1444439e11..8dbfd4b618 100644 --- a/src/testlib/qbenchmarkmeasurement_p.h +++ b/src/testlib/qbenchmarkmeasurement_p.h @@ -51,8 +51,6 @@ // We mean it. // -#include -#include #include QT_BEGIN_NAMESPACE @@ -73,40 +71,6 @@ public: virtual QTest::QBenchmarkMetric metricType() = 0; }; -class QBenchmarkTimeMeasurer : public QBenchmarkMeasurerBase -{ -public: - void start(); - qint64 checkpoint(); - qint64 stop(); - bool isMeasurementAccepted(qint64 measurement); - int adjustIterationCount(int sugestion); - int adjustMedianCount(int suggestion); - bool needsWarmupIteration(); - QTest::QBenchmarkMetric metricType(); -private: - QElapsedTimer time; -}; - -#ifdef HAVE_TICK_COUNTER // defined in 3rdparty/cycle_p.h - -class QBenchmarkTickMeasurer : public QBenchmarkMeasurerBase -{ -public: - void start(); - qint64 checkpoint(); - qint64 stop(); - bool isMeasurementAccepted(qint64 measurement); - int adjustIterationCount(int); - int adjustMedianCount(int suggestion); - bool needsWarmupIteration(); - QTest::QBenchmarkMetric metricType(); -private: - CycleCounterTicks startTicks; -}; - -#endif - QT_END_NAMESPACE #endif // QBENCHMARKMEASUREMENT_P_H diff --git a/src/testlib/qbenchmarktimemeasurers_p.h b/src/testlib/qbenchmarktimemeasurers_p.h new file mode 100644 index 0000000000..e5ffb1157d --- /dev/null +++ b/src/testlib/qbenchmarktimemeasurers_p.h @@ -0,0 +1,96 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtTest module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QBENCHMARKTIMEMEASURERS_P_H +#define QBENCHMARKTIMEMEASURERS_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QBenchmarkTimeMeasurer : public QBenchmarkMeasurerBase +{ +public: + void start(); + qint64 checkpoint(); + qint64 stop(); + bool isMeasurementAccepted(qint64 measurement); + int adjustIterationCount(int sugestion); + int adjustMedianCount(int suggestion); + bool needsWarmupIteration(); + QTest::QBenchmarkMetric metricType(); +private: + QElapsedTimer time; +}; + +#ifdef HAVE_TICK_COUNTER // defined in 3rdparty/cycle_p.h + +class QBenchmarkTickMeasurer : public QBenchmarkMeasurerBase +{ +public: + void start(); + qint64 checkpoint(); + qint64 stop(); + bool isMeasurementAccepted(qint64 measurement); + int adjustIterationCount(int); + int adjustMedianCount(int suggestion); + bool needsWarmupIteration(); + QTest::QBenchmarkMetric metricType(); +private: + CycleCounterTicks startTicks; +}; + +#endif // HAVE_TICK_COUNTER + +QT_END_NAMESPACE + +#endif // QBENCHMARKTIMEMEASURERS_P_H diff --git a/src/testlib/testlib.pro b/src/testlib/testlib.pro index d76dbb8c75..5b2205e875 100644 --- a/src/testlib/testlib.pro +++ b/src/testlib/testlib.pro @@ -14,6 +14,7 @@ QMAKE_DOCS = $$PWD/doc/qttestlib.qdocconf HEADERS = qbenchmark.h \ qbenchmark_p.h \ qbenchmarkmeasurement_p.h \ + qbenchmarktimemeasurers_p.h \ qbenchmarkvalgrind_p.h \ qbenchmarkevent_p.h \ qbenchmarkperfevents_p.h \ -- cgit v1.2.3 From a9835dfe5553545b532be9930364f71fba70c037 Mon Sep 17 00:00:00 2001 From: Anton Kudryavtsev Date: Tue, 18 Oct 2016 18:15:48 +0300 Subject: QJsonDocument: fix repetition of 'document' in doc Change-Id: I8909336274b2c72e526d63fe9e21368550de6678 Reviewed-by: Thiago Macieira --- src/corelib/json/qjsondocument.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src') diff --git a/src/corelib/json/qjsondocument.cpp b/src/corelib/json/qjsondocument.cpp index 7af7e4080c..1916730d6d 100644 --- a/src/corelib/json/qjsondocument.cpp +++ b/src/corelib/json/qjsondocument.cpp @@ -254,8 +254,7 @@ QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidati Creates a QJsonDocument from the QVariant \a variant. If the \a variant contains any other type than a QVariantMap, - QVariantList or QStringList, the returned document - document is invalid. + QVariantList or QStringList, the returned document is invalid. \sa toVariant() */ -- cgit v1.2.3 From 683c9bc4a8e656b2251871b9d8c9952e58681a52 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Tue, 18 Oct 2016 19:12:55 +0200 Subject: Windows: Fix regression in QFSFileEnginePrivate::nativeWrite() Change 0696566b1e19c8178e00c0d14f185935e17d9e8b caused the block size to be incorrect for data > 32MB. Since bytesToWrite changes within the do...while loop, then the block size can potentially change too each time. So it needs to be recalculated each time rather than just once. Task-number: QTBUG-56616 Change-Id: I9880d0985f2d0242c30e67230be7271eb806db95 Reviewed-by: Oliver Wolff Reviewed-by: Friedemann Kleint --- src/corelib/io/qfsfileengine_win.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/corelib/io/qfsfileengine_win.cpp b/src/corelib/io/qfsfileengine_win.cpp index 391fbcc519..4fe561d0cb 100644 --- a/src/corelib/io/qfsfileengine_win.cpp +++ b/src/corelib/io/qfsfileengine_win.cpp @@ -427,11 +427,11 @@ qint64 QFSFileEnginePrivate::nativeWrite(const char *data, qint64 len) // Writing on Windows fails with ERROR_NO_SYSTEM_RESOURCES when // the chunks are too large, so we limit the block size to 32MB. - const DWORD blockSize = DWORD(qMin(bytesToWrite, qint64(32 * 1024 * 1024))); qint64 totalWritten = 0; do { + const DWORD currentBlockSize = DWORD(qMin(bytesToWrite, qint64(32 * 1024 * 1024))); DWORD bytesWritten; - if (!WriteFile(fileHandle, data + totalWritten, blockSize, &bytesWritten, NULL)) { + if (!WriteFile(fileHandle, data + totalWritten, currentBlockSize, &bytesWritten, NULL)) { if (totalWritten == 0) { // Note: Only return error if the first WriteFile failed. q->setError(QFile::WriteError, qt_error_string()); -- cgit v1.2.3 From 8249f490ff82ee2a223d2c64661cfcb1c24bdeb4 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Mon, 17 Oct 2016 14:05:10 +0200 Subject: Document QClipboard::mimeData can be null The current wording (reference) seems like it's always a pointer to valid stuff Change-Id: I2a9f8bde7d2ba672e4e664ff731a3272a6deaaaa Reviewed-by: Edward Welbourne --- src/gui/kernel/qclipboard.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/gui/kernel/qclipboard.cpp b/src/gui/kernel/qclipboard.cpp index 1aac3d6021..325ba7d787 100644 --- a/src/gui/kernel/qclipboard.cpp +++ b/src/gui/kernel/qclipboard.cpp @@ -419,8 +419,9 @@ void QClipboard::setPixmap(const QPixmap &pixmap, Mode mode) /*! \fn QMimeData *QClipboard::mimeData(Mode mode) const - Returns a reference to a QMimeData representation of the current - clipboard data. + Returns a pointer to a QMimeData representation of the current + clipboard data (can be NULL if the given \a mode is not + supported by the platform). The \a mode argument is used to control which part of the system clipboard is used. If \a mode is QClipboard::Clipboard, the -- cgit v1.2.3 From 46078f33745659ec1770cb4a58f8e02b5a9f670b Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Fri, 14 Oct 2016 10:37:57 +0200 Subject: QOrderedMutexLocker: unlock in reverse order of locking This is an improvement for the following reasons: - Should mutex locking allocate any kind of resource, unlocking in reverse order will free those resources in inverse order, which helps typical allocators. - If the lock pair is contended, by unlocking in the same order as locking, we were allowing the waiting thread to wake up to take the first lock just to find that the second lock is still held by someone else. The order of unlocking has no influence on the correct- ness of the algorithm. Change-Id: Id16b0342aef325c14a7bd8836d3a75db68ef2588 Reviewed-by: David Faure --- src/corelib/thread/qorderedmutexlocker_p.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/corelib/thread/qorderedmutexlocker_p.h b/src/corelib/thread/qorderedmutexlocker_p.h index 6402be92bf..65c41d4f21 100644 --- a/src/corelib/thread/qorderedmutexlocker_p.h +++ b/src/corelib/thread/qorderedmutexlocker_p.h @@ -82,8 +82,8 @@ public: void unlock() { if (locked) { - if (mtx1) mtx1->unlock(); if (mtx2) mtx2->unlock(); + if (mtx1) mtx1->unlock(); locked = false; } } -- cgit v1.2.3 From ee22c6505a1f7cf52a862b1bd9219511db893417 Mon Sep 17 00:00:00 2001 From: Clinton Stimpson Date: Tue, 30 Aug 2016 07:52:17 -0600 Subject: xcb: fix passing of focus from child to its top level QWindow With the client message _NET_ACTIVE_WINDOW, not all window managers will pass focus from a child window to its root window, Detect this child-to-root case, and use xcb_set_input_focus() instead. Task-number: QTBUG-39362 Change-Id: Ib32193018e3b725b323f87d7306c9ae9493d78a7 Reviewed-by: Shawn Rutledge Reviewed-by: Edward Welbourne Reviewed-by: Frederik Gladhorn --- src/plugins/platforms/xcb/qxcbwindow.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index 5f402b6eca..25a8b41195 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -1698,9 +1698,11 @@ void QXcbWindow::requestActivateWindow() m_deferredActivation = false; updateNetWmUserTime(connection()->time()); + QWindow *focusWindow = QGuiApplication::focusWindow(); if (window()->isTopLevel() && !(window()->flags() & Qt::X11BypassWindowManagerHint) + && (!focusWindow || !window()->isAncestorOf(focusWindow)) && connection()->wmSupport()->isSupportedByWM(atom(QXcbAtom::_NET_ACTIVE_WINDOW))) { xcb_client_message_event_t event; @@ -1711,7 +1713,6 @@ void QXcbWindow::requestActivateWindow() event.type = atom(QXcbAtom::_NET_ACTIVE_WINDOW); event.data.data32[0] = 1; event.data.data32[1] = connection()->time(); - QWindow *focusWindow = QGuiApplication::focusWindow(); event.data.data32[2] = focusWindow ? focusWindow->winId() : XCB_NONE; event.data.data32[3] = 0; event.data.data32[4] = 0; -- cgit v1.2.3 From 6cfdfad7d41a7e452fa53495d9843c5d67e74946 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Martins?= Date: Mon, 17 Oct 2016 23:16:15 +0100 Subject: Don't crash while parsing malformed CSS Task-Id: QTBUG-53919 Change-Id: I31a0e218e4e41ee217f8f87164f115450d69d42c Reviewed-by: Olivier Goffart (Woboq GmbH) --- src/gui/text/qcssparser.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/gui/text/qcssparser.cpp b/src/gui/text/qcssparser.cpp index 65b468ece4..e96aecdf68 100644 --- a/src/gui/text/qcssparser.cpp +++ b/src/gui/text/qcssparser.cpp @@ -739,8 +739,9 @@ static ColorData parseColorValue(QCss::Value v) QVector colorDigits; if (!p.parseExpr(&colorDigits)) return ColorData(); + const int tokenCount = colorDigits.count(); - for (int i = 0; i < qMin(colorDigits.count(), 7); i += 2) { + for (int i = 0; i < qMin(tokenCount, 7); i += 2) { if (colorDigits.at(i).type == Value::Percentage) { colorDigits[i].variant = colorDigits.at(i).variant.toReal() * (255. / 100.); colorDigits[i].type = Value::Number; @@ -749,11 +750,15 @@ static ColorData parseColorValue(QCss::Value v) } } + + if (tokenCount < 5) + return ColorData(); + int v1 = colorDigits.at(0).variant.toInt(); int v2 = colorDigits.at(2).variant.toInt(); int v3 = colorDigits.at(4).variant.toInt(); int alpha = 255; - if (colorDigits.count() >= 7) { + if (tokenCount >= 7) { int alphaValue = colorDigits.at(6).variant.toInt(); if (rgba && alphaValue <= 1) alpha = colorDigits.at(6).variant.toReal() * 255.; -- cgit v1.2.3 From b38145a11d03c3e3fe8baf37800a017359283861 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Wed, 12 Oct 2016 09:03:39 +0200 Subject: PDF: Handle monochrome images correctly When an image is considered to be monochrome then it should not be making the white part of the image transparent, the colors should be kept as is. Task-number: QTBUG-56489 Change-Id: I3621ca7be2a0ebe6852363f860c0b3de28d28a31 Reviewed-by: Allan Sandfeld Jensen Reviewed-by: Lars Knoll --- src/gui/painting/qpdf.cpp | 13 +++++++++---- src/gui/painting/qpdf_p.h | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/gui/painting/qpdf.cpp b/src/gui/painting/qpdf.cpp index 0df5fd8b8a..77304fb87b 100644 --- a/src/gui/painting/qpdf.cpp +++ b/src/gui/painting/qpdf.cpp @@ -1919,7 +1919,7 @@ int QPdfEnginePrivate::writeCompressed(const char *src, int len) } int QPdfEnginePrivate::writeImage(const QByteArray &data, int width, int height, int depth, - int maskObject, int softMaskObject, bool dct) + int maskObject, int softMaskObject, bool dct, bool isMono) { int image = addXrefEntry(-1); xprintf("<<\n" @@ -1929,8 +1929,13 @@ int QPdfEnginePrivate::writeImage(const QByteArray &data, int width, int height, "/Height %d\n", width, height); if (depth == 1) { - xprintf("/ImageMask true\n" - "/Decode [1 0]\n"); + if (!isMono) { + xprintf("/ImageMask true\n" + "/Decode [1 0]\n"); + } else { + xprintf("/BitsPerComponent 1\n" + "/ColorSpace /DeviceGray\n"); + } } else { xprintf("/BitsPerComponent 8\n" "/ColorSpace %s\n", (depth == 32) ? "/DeviceRGB" : "/DeviceGray"); @@ -2445,7 +2450,7 @@ int QPdfEnginePrivate::addImage(const QImage &img, bool *bitmap, qint64 serial_n memcpy(rawdata, image.constScanLine(y), bytesPerLine); rawdata += bytesPerLine; } - object = writeImage(data, w, h, d, 0, 0); + object = writeImage(data, w, h, d, 0, 0, false, is_monochrome(img.colorTable())); } else { QByteArray softMaskData; bool dct = false; diff --git a/src/gui/painting/qpdf_p.h b/src/gui/painting/qpdf_p.h index de30744ca2..ab7a218d89 100644 --- a/src/gui/painting/qpdf_p.h +++ b/src/gui/painting/qpdf_p.h @@ -289,7 +289,7 @@ private: int streampos; int writeImage(const QByteArray &data, int width, int height, int depth, - int maskObject, int softMaskObject, bool dct = false); + int maskObject, int softMaskObject, bool dct = false, bool isMono = false); void writePage(); int addXrefEntry(int object, bool printostr = true); -- cgit v1.2.3 From cd081ca96a5387abe36f46a347363e07edcdcd67 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Mon, 19 Sep 2016 12:13:33 +0200 Subject: macOS: Only show menu and allow dragging on proxy when a file path is set If there is no file path set then it should not be possible to see a menu or to drag from a proxy icon in the titlebar. Task-number: QTBUG-56082 Change-Id: Ib8305bcab5717bc8cb7ddabbb079f152debbdded Reviewed-by: Jake Petroules --- src/plugins/platforms/cocoa/qcocoawindow.h | 1 + src/plugins/platforms/cocoa/qcocoawindow.mm | 2 ++ src/plugins/platforms/cocoa/qnswindowdelegate.h | 3 ++- src/plugins/platforms/cocoa/qnswindowdelegate.mm | 15 +++++++++++++++ 4 files changed, 20 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h index 9fcb221d37..9cf6328281 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.h +++ b/src/plugins/platforms/cocoa/qcocoawindow.h @@ -346,6 +346,7 @@ public: // for QNSView // This object is tracked by QCocoaWindowPointer, // preventing the use of dangling pointers. QObject sentinel; + bool m_hasWindowFilePath; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index c0d5904367..977a5ae657 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -379,6 +379,7 @@ QCocoaWindow::QCocoaWindow(QWindow *tlw) , m_topContentBorderThickness(0) , m_bottomContentBorderThickness(0) , m_normalGeometry(QRect(0,0,-1,-1)) + , m_hasWindowFilePath(false) { #ifdef QT_COCOA_ENABLE_WINDOW_DEBUG qDebug() << "QCocoaWindow::QCocoaWindow" << this; @@ -941,6 +942,7 @@ void QCocoaWindow::setWindowFilePath(const QString &filePath) QFileInfo fi(filePath); [m_nsWindow setRepresentedFilename: fi.exists() ? QCFString::toNSString(filePath) : @""]; + m_hasWindowFilePath = fi.exists(); } void QCocoaWindow::setWindowIcon(const QIcon &icon) diff --git a/src/plugins/platforms/cocoa/qnswindowdelegate.h b/src/plugins/platforms/cocoa/qnswindowdelegate.h index b8d344aa0e..a5f3dca68c 100644 --- a/src/plugins/platforms/cocoa/qnswindowdelegate.h +++ b/src/plugins/platforms/cocoa/qnswindowdelegate.h @@ -51,7 +51,8 @@ - (void)windowWillMove:(NSNotification *)notification; - (BOOL)windowShouldClose:(NSNotification *)notification; - (BOOL)windowShouldZoom:(NSWindow *)window toFrame:(NSRect)newFrame; - +- (BOOL)window:(NSWindow *)window shouldPopUpDocumentPathMenu:(NSMenu *)menu; +- (BOOL)window:(NSWindow *)window shouldDragDocumentWithEvent:(NSEvent *)event from:(NSPoint)dragImageLocation withPasteboard:(NSPasteboard *)pasteboard; @end QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSWindowDelegate); diff --git a/src/plugins/platforms/cocoa/qnswindowdelegate.mm b/src/plugins/platforms/cocoa/qnswindowdelegate.mm index 015274cac7..a26f381ddb 100644 --- a/src/plugins/platforms/cocoa/qnswindowdelegate.mm +++ b/src/plugins/platforms/cocoa/qnswindowdelegate.mm @@ -109,4 +109,19 @@ return YES; } +- (BOOL)window:(NSWindow *)window shouldPopUpDocumentPathMenu:(NSMenu *)menu +{ + Q_UNUSED(window); + Q_UNUSED(menu); + return m_cocoaWindow && m_cocoaWindow->m_hasWindowFilePath; +} + +- (BOOL)window:(NSWindow *)window shouldDragDocumentWithEvent:(NSEvent *)event from:(NSPoint)dragImageLocation withPasteboard:(NSPasteboard *)pasteboard +{ + Q_UNUSED(window); + Q_UNUSED(event); + Q_UNUSED(dragImageLocation); + Q_UNUSED(pasteboard); + return m_cocoaWindow && m_cocoaWindow->m_hasWindowFilePath; +} @end -- cgit v1.2.3 From 2c0033983bc53e906eab3f4b2fae836ff8472713 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Wed, 3 Aug 2016 14:06:32 +0200 Subject: macOS: Don't override the set tab text color with white Originally on macOS it would override any tab text color with white for the active tab as it would set it directly on the option palette inside the style code. This would cause it to ignore any changes done by the user in a changed option, via setTabTextColor or in a proxy style. Therefore the setting of the color should be done when the style option is initialized and only if the tab text color has not been set by the user. This has the added effect of making it easier to change the color for tabs via a stylesheet since it will not be overridden in the style but setup correctly in the option instead. Change-Id: Ic338e96470112cba71d422bce79e664df0cb188a Reviewed-by: Jake Petroules --- src/widgets/styles/qmacstyle_mac.mm | 4 ---- src/widgets/widgets/qtabbar.cpp | 7 ++++++- 2 files changed, 6 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/widgets/styles/qmacstyle_mac.mm b/src/widgets/styles/qmacstyle_mac.mm index 8f724df857..46918a2d5f 100644 --- a/src/widgets/styles/qmacstyle_mac.mm +++ b/src/widgets/styles/qmacstyle_mac.mm @@ -4286,10 +4286,6 @@ void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter bool verticalTabs = ttd == kThemeTabWest || ttd == kThemeTabEast; bool selected = (myTab.state & QStyle::State_Selected); - if (selected && !myTab.documentMode - && (!usingYosemiteOrLater || myTab.state & State_Active)) - myTab.palette.setColor(QPalette::WindowText, Qt::white); - // Check to see if we use have the same as the system font // (QComboMenuItem is internal and should never be seen by the // outside world, unless they read the source, in which case, it's diff --git a/src/widgets/widgets/qtabbar.cpp b/src/widgets/widgets/qtabbar.cpp index 2a163c18b5..b5ec91f59c 100644 --- a/src/widgets/widgets/qtabbar.cpp +++ b/src/widgets/widgets/qtabbar.cpp @@ -170,7 +170,12 @@ void QTabBarPrivate::initBasicStyleOption(QStyleOptionTab *option, int tabIndex) if (tab.textColor.isValid()) option->palette.setColor(q->foregroundRole(), tab.textColor); - +#ifdef Q_OS_MACOS + else if (isCurrent && !documentMode + && (QSysInfo::MacintoshVersion < QSysInfo::MV_10_10 || q->isActiveWindow())) { + option->palette.setColor(QPalette::WindowText, Qt::white); + } +#endif option->icon = tab.icon; option->iconSize = q->iconSize(); // Will get the default value then. -- cgit v1.2.3 From 0e61323c87490ea3991f7b6211034285ce5a932f Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Thu, 13 Oct 2016 13:59:44 +0200 Subject: winrt: Added timeout for cancellation of socket read operation As the function runs on the XAML thread it can make the app unresponsive/wait forever on a socket close. Thus we should not wait forever but have a timeout. If the timeout is hit the socket is not closed properly but hard reset. Change-Id: I82e9425c0f8195e3465027fdc2417a93f1c1ad91 Reviewed-by: Maurice Kalinowski --- src/network/socket/qnativesocketengine_winrt.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/network/socket/qnativesocketengine_winrt.cpp b/src/network/socket/qnativesocketengine_winrt.cpp index 58f0668854..b6a739d1b8 100644 --- a/src/network/socket/qnativesocketengine_winrt.cpp +++ b/src/network/socket/qnativesocketengine_winrt.cpp @@ -492,10 +492,12 @@ void QNativeSocketEngine::close() ComPtr action; hr = socket3->CancelIOAsync(&action); Q_ASSERT_SUCCEEDED(hr); - hr = QWinRTFunctions::await(action); + hr = QWinRTFunctions::await(action, QWinRTFunctions::YieldThread, 5000); // If there is no pending IO (no read established before) the function will fail with // "function was called at an unexpected time" which is fine. - if (hr != E_ILLEGAL_METHOD_CALL) + // Timeout is fine as well. The result will be the socket being hard reset instead of + // being closed gracefully + if (hr != E_ILLEGAL_METHOD_CALL && hr != ERROR_TIMEOUT) Q_ASSERT_SUCCEEDED(hr); return S_OK; }); -- cgit v1.2.3 From 0cccc23478432240f44cabfd853e60ff8c84c692 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Sun, 9 Oct 2016 18:08:14 +0200 Subject: QNetworkReplyHttpImpl: Fix UB (member call) in destruction sequence Found by UBSan: qnetworkreplyhttpimpl.cpp:457:29: runtime error: member call on address 0x602000009cf0 which does not point to an object of type 'QNetworkReplyHttpImpl' 0x602000009cf0: note: object is of type 'QObject' 1e 00 80 18 20 e0 bb 12 54 7f 00 00 00 f2 00 00 70 61 00 00 02 00 00 00 ff ff ff 06 08 00 00 00 ^~~~~~~~~~~~~~~~~~~~~~~ vptr for 'QObject' #0 0x7f541461b71b in QNetworkReplyHttpImplPrivate::~QNetworkReplyHttpImplPrivate() qnetworkreplyhttpimpl.cpp:457 #1 0x7f541461b7f0 in QNetworkReplyHttpImplPrivate::~QNetworkReplyHttpImplPrivate() qnetworkreplyhttpimpl.cpp:458 #2 0x7f540f26df1a in QScopedPointerDeleter::cleanup(QObjectData*) qscopedpointer.h:54 #3 0x7f540f26df1a in QScopedPointer >::~QScopedPointer() qscopedpointer.h:101 #4 0x7f540f26df1a in QObject::~QObject() qobject.cpp:940 #5 0x7f540e915f6e in QIODevice::~QIODevice() qiodevice.cpp:416 #6 0x7f5414599bae in QNetworkReply::~QNetworkReply() qnetworkreply.cpp:444 #7 0x7f54145e6f5e in QNetworkReplyHttpImpl::~QNetworkReplyHttpImpl() qnetworkreplyhttpimpl.cpp:239 #8 0x7f54145e6f5e in QNetworkReplyHttpImpl::~QNetworkReplyHttpImpl() qnetworkreplyhttpimpl.cpp:242 #9 0x7f54144b3539 in void qDeleteAll::const_iterator>(QList::const_iterator, QList::const_iterator) qalgorithms.h:317 #10 0x7f54144b3539 in void qDeleteAll >(QList const&) qalgorithms.h:325 #11 0x7f54144b3539 in QNetworkAccessManager::~QNetworkAccessManager() qnetworkaccessmanager.cpp:496 Fix by moving the emission of the QNetworkReplyHttpImpl::abortHttpRequest() signal from ~Private, when the public object is merely a QObject anymore, to ~QNetworkReplyHttpImpl(), when the public class is still itself. Change-Id: Ifb3b19f6d180452bdf3fc26f54629ef780a5d9d9 Reviewed-by: Timur Pocheptsov --- src/network/access/qnetworkreplyhttpimpl.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/network/access/qnetworkreplyhttpimpl.cpp b/src/network/access/qnetworkreplyhttpimpl.cpp index 94235a48dd..fe8277ba92 100644 --- a/src/network/access/qnetworkreplyhttpimpl.cpp +++ b/src/network/access/qnetworkreplyhttpimpl.cpp @@ -238,7 +238,8 @@ QNetworkReplyHttpImpl::QNetworkReplyHttpImpl(QNetworkAccessManager* const manage QNetworkReplyHttpImpl::~QNetworkReplyHttpImpl() { - // Most work is done in private destructor + // This will do nothing if the request was already finished or aborted + emit abortHttpRequest(); } void QNetworkReplyHttpImpl::close() @@ -452,9 +453,6 @@ QNetworkReplyHttpImplPrivate::QNetworkReplyHttpImplPrivate() QNetworkReplyHttpImplPrivate::~QNetworkReplyHttpImplPrivate() { - Q_Q(QNetworkReplyHttpImpl); - // This will do nothing if the request was already finished or aborted - emit q->abortHttpRequest(); } /* -- cgit v1.2.3 From 837781db52b59012fdebb357ccb3abbd2f9bf2f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Mon, 10 Oct 2016 13:44:52 +0200 Subject: Add Qt::ISODateWithMs date format, with support in QTime/Date/DateTime The Qt::ISODate format strips milliseconds, so a new format is introduced that keeps the milliseconds. A new format was chosen over fixing the existing format due to the behavioral change of suddenly having ms as part of Qt::ISODate. Change-Id: If8b852daed068cce8eee9b61a7cd4576bc763443 Reviewed-by: Thiago Macieira --- src/corelib/global/qnamespace.h | 3 ++- src/corelib/global/qnamespace.qdoc | 2 ++ src/corelib/tools/qdatetime.cpp | 25 ++++++++++++++++++------- 3 files changed, 22 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h index 5a66319164..e2b0d30db0 100644 --- a/src/corelib/global/qnamespace.h +++ b/src/corelib/global/qnamespace.h @@ -1197,7 +1197,8 @@ public: SystemLocaleLongDate, DefaultLocaleShortDate, DefaultLocaleLongDate, - RFC2822Date // RFC 2822 (+ 850 and 1036 during parsing) + RFC2822Date, // RFC 2822 (+ 850 and 1036 during parsing) + ISODateWithMs }; enum TimeSpec { diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc index 7768070e4f..250195a512 100644 --- a/src/corelib/global/qnamespace.qdoc +++ b/src/corelib/global/qnamespace.qdoc @@ -658,6 +658,8 @@ \c{YYYY-MM-DDTHH:mm:ss}, \c{YYYY-MM-DDTHH:mm:ssTZD} (e.g., 1997-07-16T19:20:30+01:00) for combined dates and times. + \value ISODateWithMs \l{ISO 8601} extended format, including milliseconds if applicable. + \value SystemLocaleShortDate The \l{QLocale::ShortFormat}{short format} used by the \l{QLocale::system()}{operating system}. diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp index 7819d2e207..3750b37580 100644 --- a/src/corelib/tools/qdatetime.cpp +++ b/src/corelib/tools/qdatetime.cpp @@ -873,6 +873,7 @@ QString QDate::toString(Qt::DateFormat format) const return toStringTextDate(*this); #endif case Qt::ISODate: + case Qt::ISODateWithMs: return toStringIsoDate(jd); } } @@ -1568,7 +1569,9 @@ int QTime::msec() const If \a format is Qt::ISODate, the string format corresponds to the ISO 8601 extended specification for representations of dates, - which is also HH:mm:ss. + represented by HH:mm:ss. To include milliseconds in the ISO 8601 + date, use the \a format Qt::ISODateWithMs, which corresponds to + HH:mm:ss.zzz. If the \a format is Qt::SystemLocaleShortDate or Qt::SystemLocaleLongDate, the string format depends on the locale @@ -1610,6 +1613,8 @@ QString QTime::toString(Qt::DateFormat format) const return QLocale().toString(*this, QLocale::ShortFormat); case Qt::DefaultLocaleLongDate: return QLocale().toString(*this, QLocale::LongFormat); + case Qt::ISODateWithMs: + return QString::asprintf("%02d:%02d:%02d.%03d", hour(), minute(), second(), msec()); case Qt::RFC2822Date: case Qt::ISODate: case Qt::TextDate: @@ -1916,7 +1921,8 @@ static QTime fromIsoTimeString(const QStringRef &string, Qt::DateFormat format, } } - if (format == Qt::ISODate && hour == 24 && minute == 0 && second == 0 && msec == 0) { + const bool isISODate = format == Qt::ISODate || format == Qt::ISODateWithMs; + if (isISODate && hour == 24 && minute == 0 && second == 0 && msec == 0) { if (isMidnight24) *isMidnight24 = true; hour = 0; @@ -1958,6 +1964,7 @@ QTime QTime::fromString(const QString& string, Qt::DateFormat format) case Qt::RFC2822Date: return rfcDateImpl(string).time; case Qt::ISODate: + case Qt::ISODateWithMs: case Qt::TextDate: default: return fromIsoTimeString(&string, format, 0); @@ -3713,7 +3720,9 @@ void QDateTime::setTime_t(uint secsSince1Jan1970UTC) depending on the timeSpec() of the QDateTime. If the timeSpec() is Qt::UTC, Z will be appended to the string; if the timeSpec() is Qt::OffsetFromUTC, the offset in hours and minutes from UTC will - be appended to the string. + be appended to the string. To include milliseconds in the ISO 8601 + date, use the \a format Qt::ISODateWithMs, which corresponds to + YYYY-MM-DDTHH:mm:ss.zzz[Z|[+|-]HH:mm]. If the \a format is Qt::SystemLocaleShortDate or Qt::SystemLocaleLongDate, the string format depends on the locale @@ -3784,7 +3793,8 @@ QString QDateTime::toString(Qt::DateFormat format) const return buf; } #endif - case Qt::ISODate: { + case Qt::ISODate: + case Qt::ISODateWithMs: { const QPair p = getDateTime(d); const QDate &dt = p.first; const QTime &tm = p.second; @@ -3792,7 +3802,7 @@ QString QDateTime::toString(Qt::DateFormat format) const if (buf.isEmpty()) return QString(); // failed to convert buf += QLatin1Char('T'); - buf += tm.toString(Qt::ISODate); + buf += tm.toString(format); switch (getSpec(d)) { case Qt::UTC: buf += QLatin1Char('Z'); @@ -4651,7 +4661,8 @@ QDateTime QDateTime::fromString(const QString& string, Qt::DateFormat format) dateTime.setOffsetFromUtc(rfc.utcOffset); return dateTime; } - case Qt::ISODate: { + case Qt::ISODate: + case Qt::ISODateWithMs: { const int size = string.size(); if (size < 10) return QDateTime(); @@ -4699,7 +4710,7 @@ QDateTime QDateTime::fromString(const QString& string, Qt::DateFormat format) // Might be end of day (24:00, including variants), which QTime considers invalid. // ISO 8601 (section 4.2.3) says that 24:00 is equivalent to 00:00 the next day. bool isMidnight24 = false; - QTime time = fromIsoTimeString(isoString, Qt::ISODate, &isMidnight24); + QTime time = fromIsoTimeString(isoString, format, &isMidnight24); if (!time.isValid()) return QDateTime(); if (isMidnight24) -- cgit v1.2.3 From b6df7257501b54521c25587c3c5e600b2c9393d1 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Thu, 20 Oct 2016 18:31:10 +0200 Subject: Fix UB (ininited pointer read) in qt_egl_device_integration() The m_integration member of DeviceIntegration, a naked pointer, was checked for nullptr in the DeviceIntegration ctor, but never set to nullptr. Fix by init'ing it to nullptr in the ctor-init-list. Coverity-Id: 172056 Change-Id: Ia1dc9b67b9d16a991bba82338eedb19de68f91d8 Reviewed-by: Thiago Macieira --- src/plugins/platforms/eglfs/qeglfshooks.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/plugins/platforms/eglfs/qeglfshooks.cpp b/src/plugins/platforms/eglfs/qeglfshooks.cpp index cf016d1b01..638960d998 100644 --- a/src/plugins/platforms/eglfs/qeglfshooks.cpp +++ b/src/plugins/platforms/eglfs/qeglfshooks.cpp @@ -61,6 +61,7 @@ private: Q_GLOBAL_STATIC(DeviceIntegration, deviceIntegration) DeviceIntegration::DeviceIntegration() + : m_integration(Q_NULLPTR) { QStringList pluginKeys = QEGLDeviceIntegrationFactory::keys(); if (!pluginKeys.isEmpty()) { -- cgit v1.2.3 From 294c870bedadc7823d61bc8df6fd37323589f0a2 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Thu, 20 Oct 2016 23:00:08 +0200 Subject: QImage: cache colortable size MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Coverity threw an error that in the else branch, the expression colorTableRGB16[tableSize - 1] accesses uninit'ed data. The working theory is that it fails to perform the implication isEmpty() → size() == 0 This patch, therefore, checks for size() == 0 instead of isEmpty(), which is hardly less readable and might help Coverity understand the code better. Then again, Coverity might not understand that the tableSize can never be negative. If that's the case, another patch will be needed, but let's try the simpler solution first. Coverity-Id: 11420 Change-Id: Ibfe2a798c55af95c8001fa909aa94a6c5bc7c647 Reviewed-by: Allan Sandfeld Jensen --- src/gui/image/qimage_conversions.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/gui/image/qimage_conversions.cpp b/src/gui/image/qimage_conversions.cpp index 7b8d88ba72..c25b4cf5c3 100644 --- a/src/gui/image/qimage_conversions.cpp +++ b/src/gui/image/qimage_conversions.cpp @@ -905,12 +905,12 @@ static bool convert_indexed8_to_RGB16_inplace(QImageData *data, Qt::ImageConvers const int dest_pad = (dst_bytes_per_line >> 1) - width; quint16 colorTableRGB16[256]; - if (data->colortable.isEmpty()) { + const int tableSize = data->colortable.size(); + if (tableSize == 0) { for (int i = 0; i < 256; ++i) colorTableRGB16[i] = qConvertRgb32To16(qRgb(i, i, i)); } else { // 1) convert the existing colors to RGB16 - const int tableSize = data->colortable.size(); for (int i = 0; i < tableSize; ++i) colorTableRGB16[i] = qConvertRgb32To16(data->colortable.at(i)); data->colortable = QVector(); -- cgit v1.2.3 From 557abfc3275f74d3dd537d7bca86e15860d072e9 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Thu, 20 Oct 2016 08:50:42 +0200 Subject: QUrl effective TLDs: update table There are more than 1000 new entries since the table has been generated the last time. The autotest needs to be tweaked because the rules for the .mz domains have changed; use the .ck domain instead. Change-Id: Ife692afd46ac41a66604e966e5e8cb57c7aa649c Reviewed-by: Thiago Macieira --- src/corelib/io/qurltlds_p.h | 24175 ++++++++++++++++++++----------------- src/corelib/io/qurltlds_p.h.INFO | 4 +- 2 files changed, 12863 insertions(+), 11316 deletions(-) (limited to 'src') diff --git a/src/corelib/io/qurltlds_p.h b/src/corelib/io/qurltlds_p.h index 69d0701faa..c823104b84 100644 --- a/src/corelib/io/qurltlds_p.h +++ b/src/corelib/io/qurltlds_p.h @@ -58,11678 +58,13225 @@ QT_BEGIN_NAMESPACE // this file should be updated before each release -> // for instructions see the program at // util/corelib/qurl-generateTLDs -static const quint16 tldCount = 7150; + +static const quint16 tldCount = 8101; static const quint32 tldIndices[] = { 0, -40, -40, -49, -49, -49, -71, -95, -95, -110, -123, -123, -151, -189, -189, -189, -189, -189, -189, -189, -189, -189, -202, -202, -202, -208, -219, -219, -219, -219, -219, -238, -249, -278, -294, -301, -312, -312, -317, -317, -317, -323, -330, -406, -406, -467, -467, -500, -500, -500, -512, -533, -533, -533, -533, -533, -542, -574, -580, -620, -620, -633, -645, -645, -659, -659, -659, -685, -685, -703, +15, +43, +55, +60, +70, +80, +101, +101, +154, +169, +169, +169, +184, +184, +195, +217, +217, +235, +255, +276, +296, +296, +314, +345, +350, +350, +358, +384, +400, +424, +424, +431, +452, +472, +508, +508, +508, +508, +525, +558, +581, +581, +594, +608, +608, +628, +628, +652, +680, +680, 703, -721, -721, -721, -737, -744, -744, -756, +722, +722, +760, 768, -774, -774, -774, -784, -784, -802, -841, -882, -882, -882, -882, -905, -924, -935, -950, -960, -960, -972, -983, -983, -983, -990, -997, -1017, -1037, -1045, -1045, -1045, -1063, -1069, -1085, -1085, -1085, -1085, -1085, -1085, -1085, -1136, -1145, -1183, -1183, -1225, -1225, -1241, -1241, -1259, -1282, -1305, -1305, -1358, -1358, -1370, -1370, -1383, -1383, -1430, -1430, -1430, -1457, -1466, -1472, -1472, -1472, -1472, -1486, -1518, -1564, -1593, -1614, -1661, -1675, -1675, -1691, -1719, -1730, -1750, -1750, -1755, -1759, -1773, -1797, -1823, -1841, -1848, +768, +788, +788, +814, +847, +847, +865, +895, +895, +930, +930, +936, +964, +991, +1025, +1042, +1061, +1061, +1082, +1098, +1098, +1098, +1111, +1135, +1141, +1141, +1141, +1160, +1192, +1192, +1192, +1192, +1192, +1192, +1207, +1207, +1214, +1219, +1219, +1219, +1242, +1255, +1255, +1255, +1272, +1291, +1291, +1291, +1309, +1334, +1372, +1376, +1376, +1385, +1419, +1419, +1419, +1427, +1442, +1442, +1450, +1450, +1469, +1508, +1533, +1533, +1574, +1582, +1582, +1592, +1625, +1643, +1643, +1653, +1653, +1664, +1664, +1687, +1687, +1731, +1742, +1760, +1760, +1760, +1775, +1788, +1815, +1815, +1815, +1815, +1827, +1842, +1850, +1850, +1874, +1874, +1887, 1887, -1894, -1911, -1918, -1923, -1929, -1966, -1966, -1973, -1973, -1973, -1990, -2041, -2059, -2075, -2093, -2093, -2093, -2127, -2136, -2152, -2159, -2178, -2201, +1887, +1917, +1931, +1962, +1962, +1962, +2002, +2017, +2073, +2073, +2103, +2103, +2120, +2160, +2168, +2168, +2176, +2193, +2199, +2199, +2205, 2212, -2219, -2219, -2219, -2233, -2240, -2247, -2247, -2273, -2298, +2212, +2226, +2226, +2226, +2226, +2261, +2282, 2298, -2305, -2330, -2377, -2410, -2461, -2468, -2511, -2511, -2524, -2524, -2530, -2547, -2560, -2576, -2583, -2599, -2599, -2599, -2599, -2599, -2628, -2671, -2692, -2697, -2726, -2726, -2756, -2756, -2775, -2775, -2787, -2814, -2814, -2839, -2853, -2869, -2901, -2949, -2949, -2972, -2972, -2979, -2997, -3003, -3014, -3014, -3014, -3014, -3014, -3014, -3043, -3043, -3070, -3070, +2316, +2316, +2316, +2316, +2316, +2373, +2373, +2390, +2390, +2397, +2412, +2428, +2435, +2435, +2443, +2443, +2451, +2458, +2504, +2504, +2510, +2510, +2510, +2517, +2544, +2555, +2573, +2612, +2627, +2627, +2650, +2657, +2664, +2674, +2691, +2698, +2706, +2713, +2713, +2729, +2743, +2750, +2781, +2781, +2796, +2796, +2809, +2816, +2836, +2866, +2887, +2894, +2943, +2950, +2950, +2950, +2950, +2970, +2970, +3002, +3002, +3015, +3022, +3032, +3059, +3069, +3084, 3091, 3091, -3097, -3108, -3108, -3108, +3098, +3098, +3107, 3125, -3182, -3232, -3283, -3283, -3292, -3312, -3319, -3359, -3379, -3406, -3433, -3441, -3448, -3459, -3466, -3466, -3466, -3466, -3466, -3473, -3491, -3498, -3524, -3524, -3568, -3605, -3605, -3618, -3618, -3618, -3632, -3632, -3632, -3632, -3645, -3645, -3652, -3662, -3662, -3701, -3708, +3132, +3140, +3172, +3189, +3205, +3218, +3224, +3231, +3255, +3261, +3261, +3261, +3261, +3279, +3285, +3296, +3310, +3317, +3317, +3333, +3352, +3362, +3362, +3362, +3362, +3404, +3404, +3404, +3404, +3404, +3404, +3415, +3428, +3428, +3483, +3503, +3503, +3530, +3555, +3562, +3562, +3578, +3593, +3600, +3622, +3629, +3644, +3663, +3663, +3685, +3685, +3685, +3685, 3713, -3729, -3742, -3767, -3799, -3799, -3806, -3806, -3824, -3824, -3839, -3839, -3854, -3876, -3883, -3883, -3890, -3896, -3939, -3939, -3953, -3953, -3953, -3953, -3988, +3730, +3757, +3775, +3775, +3775, +3800, +3815, +3815, +3815, +3815, +3815, +3900, +3900, +3950, +3950, +3959, +3959, +3959, +3974, 4005, -4019, -4039, -4039, -4058, -4069, -4094, -4101, -4139, -4146, -4174, -4206, -4221, -4221, -4237, -4237, -4254, -4270, -4277, -4301, -4301, -4301, -4301, -4327, -4327, -4334, -4341, -4361, -4361, -4368, -4391, -4403, -4403, -4416, -4416, -4423, -4448, -4448, -4448, -4500, -4534, -4543, -4543, -4562, -4569, -4576, -4613, -4632, -4639, -4646, -4670, -4670, -4670, -4677, -4695, -4695, -4695, -4702, -4720, -4734, -4734, -4734, -4734, -4741, -4741, -4741, -4748, -4748, -4762, -4785, -4792, -4823, -4823, -4861, -4886, -4886, -4886, -4922, -4922, -4932, -4939, -4939, -4939, -4946, -4953, -4953, -4977, -4977, -4977, -4984, -5009, -5028, -5080, -5080, -5080, -5080, -5110, -5117, -5132, -5143, -5167, -5184, -5184, -5184, -5209, -5209, -5230, -5230, -5238, -5260, -5289, -5289, -5298, -5315, -5315, -5315, +4070, +4141, +4141, +4160, +4177, +4177, +4207, +4235, +4263, +4274, +4280, +4280, +4290, +4321, +4338, +4381, +4396, +4402, +4446, +4461, +4461, +4461, +4485, +4496, +4512, +4528, +4580, +4580, +4624, +4650, +4650, +4650, +4672, +4714, +4714, +4721, +4728, +4751, +4769, +4769, +4769, +4783, +4783, +4783, +4807, +4814, +4821, +4821, +4839, +4892, +4908, +4908, +4908, +4915, +4952, +4952, +4959, +4966, +4973, +4973, +4980, +4999, +5032, +5039, +5057, +5095, +5112, +5127, +5127, +5144, +5151, +5172, +5172, +5186, +5200, +5215, +5236, +5263, +5294, +5294, +5294, +5310, +5310, +5320, +5320, +5350, 5350, -5356, -5356, -5356, -5356, 5370, 5392, -5413, -5430, -5437, -5471, -5502, -5514, -5514, -5534, -5552, -5559, -5559, -5616, -5651, -5657, -5657, -5657, -5674, -5681, -5681, -5681, -5702, -5709, -5745, -5764, -5776, -5776, -5812, -5827, -5849, -5875, -5892, -5913, -5913, -5920, -5935, -5980, -5987, -6024, -6024, -6041, -6058, +5392, +5419, +5419, +5419, +5426, +5426, +5426, +5433, +5449, +5449, +5455, +5468, +5481, +5487, +5487, +5521, +5581, +5581, +5604, +5604, +5617, +5624, +5631, +5631, +5666, +5666, +5692, +5705, +5719, +5726, +5746, +5761, +5777, +5789, +5795, +5802, +5815, +5833, +5839, +5846, +5846, +5846, +5868, +5868, +5887, +5899, +5910, +5927, +5937, +5937, +5974, +5996, +6019, +6019, +6027, +6027, +6033, +6066, 6066, -6103, -6103, -6103, -6127, -6127, -6137, -6157, -6223, -6248, -6297, -6297, -6297, -6325, -6332, -6355, -6355, -6382, -6408, -6423, -6423, -6423, -6440, -6452, -6462, -6482, -6482, -6482, -6500, -6500, -6518, -6518, -6518, -6526, -6535, -6535, -6542, +6088, +6095, +6109, +6123, +6130, +6130, +6168, +6176, +6176, +6176, +6176, +6183, +6183, +6190, +6207, +6235, +6254, +6254, +6266, +6293, +6293, +6308, +6329, +6341, +6360, +6367, +6407, +6413, +6431, +6460, +6467, +6467, +6488, +6510, +6510, +6538, 6560, -6570, -6585, -6604, -6604, -6604, -6604, -6617, -6626, -6626, -6626, -6654, -6654, -6680, -6695, -6695, -6695, -6706, -6706, -6736, -6736, -6766, -6766, -6766, -6766, -6766, -6775, -6775, -6775, -6786, -6825, -6825, -6834, -6854, -6854, -6854, -6897, -6915, -6915, -6960, -7002, +6575, +6589, +6589, +6589, +6589, +6606, +6606, +6614, +6629, +6629, +6635, +6647, +6667, +6696, +6696, +6703, +6712, +6712, +6752, +6759, +6759, +6791, +6815, +6815, +6822, +6859, +6859, +6875, +6900, +6906, +6913, +6942, +6981, +6996, +6996, +7015, +7015, 7015, -7077, -7155, -7207, -7222, -7250, -7284, -7284, -7297, -7334, -7357, -7357, -7373, -7373, -7373, -7398, -7411, -7424, -7458, -7470, -7508, -7508, -7531, -7538, -7554, +7022, +7044, +7044, +7062, +7062, +7062, +7089, +7102, +7102, +7150, +7159, +7186, +7194, +7204, +7204, +7226, +7256, +7264, +7277, +7302, +7316, +7316, +7351, +7387, +7410, +7410, +7410, +7421, +7463, +7463, +7463, +7463, +7463, +7499, +7521, +7521, +7550, 7566, -7580, -7612, -7612, -7612, -7619, -7629, -7636, -7648, -7682, -7682, -7701, -7712, -7712, -7712, -7719, -7719, -7746, -7746, -7746, -7770, -7770, -7770, -7770, -7770, -7795, -7847, -7847, -7847, -7868, -7868, -7877, -7893, -7910, -7942, -7976, -7976, -8015, -8020, -8031, -8031, -8040, -8040, -8059, -8071, -8092, -8123, -8136, -8136, -8136, -8141, -8141, -8141, -8148, -8148, -8193, -8193, -8210, -8230, -8247, -8247, -8264, -8296, -8317, -8332, -8332, -8332, -8364, -8392, -8403, -8421, -8421, -8441, -8441, -8441, -8441, -8441, -8460, -8474, -8487, -8508, -8508, -8508, -8526, -8540, -8540, -8540, -8540, -8572, -8596, -8641, -8641, -8641, -8686, -8686, -8686, -8695, -8695, -8714, -8735, -8744, -8775, -8780, +7600, +7627, +7627, +7627, +7641, +7652, +7665, +7677, +7677, +7677, +7693, +7709, +7709, +7725, +7725, +7757, +7757, +7811, +7817, +7874, +7886, +7905, +7905, +7905, +7905, +7929, +7929, +7958, +7972, +7988, +7988, +7988, +8007, +8038, +8078, +8078, +8084, +8084, +8111, +8111, +8111, +8118, +8118, +8118, +8118, +8118, +8118, +8128, +8147, +8159, +8166, +8166, +8191, +8191, +8229, +8229, +8229, +8229, +8229, +8251, +8258, +8258, +8258, +8258, +8258, +8263, +8263, +8272, +8290, +8301, +8301, +8333, +8333, +8350, +8357, +8408, +8408, +8408, +8425, +8469, +8469, +8504, +8545, +8552, +8552, +8552, +8552, +8552, +8552, +8552, +8552, +8552, +8552, +8552, +8552, +8552, +8552, +8552, +8552, +8575, +8608, +8608, +8608, +8634, +8652, +8652, +8673, +8673, +8673, +8673, +8688, +8688, +8717, +8717, +8762, +8762, +8762, +8779, 8802, -8802, -8802, -8802, -8835, -8842, -8894, -8894, -8908, -8908, -8908, -8942, -8967, -8967, -9008, -9008, -9023, -9035, -9035, -9035, -9052, -9079, -9087, -9087, -9127, -9139, -9139, -9173, -9173, -9199, -9208, -9235, -9235, -9249, -9249, -9259, -9259, -9267, -9285, -9300, -9300, -9322, -9337, -9342, -9342, -9348, -9407, -9418, -9434, -9434, -9455, -9455, -9455, -9469, -9489, -9489, -9527, -9527, -9527, -9568, -9568, -9568, -9578, -9603, -9610, -9610, -9610, -9621, -9621, -9625, -9641, -9649, -9649, -9649, -9667, -9667, -9667, -9680, -9709, -9709, -9739, -9739, -9766, -9775, -9783, -9790, -9810, -9810, -9828, -9828, -9853, -9867, -9867, -9867, -9867, -9884, -9884, -9900, -9900, -9936, -9954, -9954, -9977, -9987, -9987, -9994, -9994, -10009, -10009, -10009, -10029, -10047, -10047, -10062, -10076, -10076, -10100, -10106, -10106, -10113, -10129, -10143, -10166, -10166, -10198, -10208, -10208, -10229, -10251, -10251, -10275, -10275, -10281, -10314, -10333, -10333, -10333, -10357, -10357, -10378, -10386, -10398, -10420, -10443, -10461, -10480, -10488, -10498, -10498, -10498, -10498, -10528, -10528, -10534, -10534, -10534, -10534, -10534, -10534, -10534, -10558, -10579, -10595, -10595, -10595, -10595, -10611, -10611, +8812, +8844, +8844, +8850, +8862, +8887, +8893, +8928, +8946, +8978, +9010, +9010, +9010, +9010, +9041, +9047, +9047, +9047, +9054, +9054, +9054, +9054, +9054, +9061, +9061, +9098, +9117, +9129, +9162, +9179, +9179, +9185, +9221, +9221, +9244, +9258, +9288, +9295, +9307, +9307, +9307, +9314, +9356, +9356, +9372, +9372, +9403, +9425, +9430, +9430, +9447, +9447, +9454, +9496, +9528, +9535, +9543, +9570, +9577, +9577, +9619, +9619, +9626, +9640, +9647, +9672, +9687, +9694, +9705, +9770, +9820, +9827, +9843, +9861, +9874, +9886, +9893, +9916, +9931, +9931, +9941, +9968, +10012, +10030, +10045, +10045, +10052, +10068, +10104, +10104, +10111, +10111, +10126, +10136, +10144, +10144, +10151, +10157, +10164, +10176, +10197, +10197, +10197, +10222, +10222, +10222, +10245, +10276, +10292, +10298, +10318, +10318, +10346, +10353, +10353, +10360, +10360, +10371, +10395, +10395, +10405, +10413, +10413, +10413, +10440, +10440, +10448, +10481, +10481, +10481, +10495, +10495, +10495, +10509, +10516, +10525, +10543, +10550, +10550, +10594, +10594, 10634, -10659, -10659, -10659, -10659, -10659, -10659, -10698, -10716, -10741, -10749, -10768, -10801, -10813, -10842, -10842, -10860, -10860, -10879, -10917, -10939, -10958, -10964, -10964, -10986, -10994, -11000, -11005, -11005, -11005, -11021, -11031, -11031, -11031, -11050, -11077, -11077, -11091, -11091, -11110, -11110, -11120, -11139, -11187, -11187, -11187, -11187, +10634, +10641, +10641, +10648, +10648, +10648, +10660, +10687, +10718, +10718, +10746, +10785, +10794, +10812, +10820, +10832, +10849, +10863, +10863, +10870, +10887, +10897, +10897, +10897, +10944, +10970, +10970, +10970, +11003, +11019, +11074, +11074, +11081, +11081, +11111, +11131, +11150, +11164, 11187, -11219, -11249, -11260, -11283, -11299, -11330, -11330, -11330, -11330, -11340, -11340, -11340, -11340, -11346, -11391, -11391, -11397, -11397, -11397, -11408, -11408, -11431, -11452, -11452, +11207, +11228, +11243, +11243, +11243, +11243, +11258, +11273, +11279, +11310, +11310, +11310, +11322, +11361, +11361, +11389, +11417, +11430, +11436, +11436, +11436, +11453, +11461, +11475, +11482, 11489, -11505, -11526, -11526, -11526, -11526, -11543, -11563, -11580, -11599, -11599, -11599, -11599, -11636, -11636, -11636, +11528, +11545, +11575, +11616, +11632, +11668, +11668, 11675, -11675, -11675, -11675, -11695, -11695, -11695, -11703, -11712, -11725, -11734, -11743, -11771, -11812, -11838, +11689, +11696, +11714, +11714, +11714, +11714, +11714, +11714, +11721, +11721, +11739, +11739, +11758, +11799, +11817, +11824, +11824, +11831, 11848, 11870, +11870, 11888, -11903, -11903, -11910, -11938, -11938, -11938, -11956, -11956, -11986, -11986, -11994, -12007, -12017, -12017, -12053, -12066, -12066, -12066, -12066, -12066, -12066, -12076, -12088, -12099, -12099, -12117, -12117, -12127, -12146, -12146, -12146, -12165, -12165, -12165, +11888, +11895, +11902, +11927, +11934, +11941, +11971, +12005, +12012, +12069, +12087, +12087, +12106, +12126, +12126, +12140, +12140, +12140, +12147, +12153, 12165, -12172, -12176, -12176, -12176, -12191, -12191, -12201, -12217, -12217, -12241, -12241, -12241, -12255, -12255, -12269, -12269, -12310, -12310, -12333, -12351, -12366, -12366, -12377, -12412, -12435, -12453, -12453, -12453, -12457, -12489, -12489, -12489, -12501, -12523, -12523, -12547, -12569, -12628, -12628, -12628, -12628, -12628, -12638, -12687, -12705, -12705, -12715, -12732, -12732, -12750, -12750, -12750, -12750, -12750, -12750, -12763, -12763, -12772, -12772, -12827, -12863, -12870, -12880, -12886, -12902, -12916, -12944, -12944, +12186, +12194, +12199, +12207, +12207, +12207, +12213, +12229, +12236, +12243, +12243, +12243, +12250, +12259, +12270, +12270, +12277, +12284, +12284, +12291, +12300, +12309, +12345, +12373, +12385, +12385, +12404, +12404, +12424, +12431, +12475, +12494, +12494, +12494, +12494, +12515, +12522, +12532, +12540, +12578, +12597, +12636, +12636, +12636, +12636, +12636, +12651, +12651, +12693, +12693, +12711, +12720, +12720, +12720, +12720, +12739, +12766, +12787, +12794, +12794, +12826, +12833, +12862, +12869, +12890, +12890, +12910, +12917, +12934, +12934, +12949, 12956, 12956, -12977, -12983, -12993, -13011, -13022, -13059, -13066, -13066, -13113, -13113, -13120, -13120, -13132, -13143, -13154, -13154, -13154, -13160, -13160, -13164, -13164, -13164, -13203, -13222, -13222, -13244, -13250, -13267, -13272, -13301, -13319, -13319, -13319, -13319, -13319, -13338, -13350, -13350, -13350, -13355, -13362, -13362, -13374, -13396, -13408, -13408, -13408, -13433, -13454, -13454, -13454, -13511, -13522, -13541, -13550, -13550, -13563, -13580, -13585, -13585, -13585, -13585, -13585, -13598, -13628, -13634, -13634, -13654, -13679, -13684, -13693, -13723, -13740, -13740, -13747, -13791, +12963, +12989, +12997, +13021, +13021, +13021, +13028, +13028, +13035, +13054, +13070, +13077, +13107, +13119, +13119, +13126, +13140, +13163, +13163, +13216, +13228, +13251, +13275, +13329, +13329, +13386, +13404, +13410, +13410, +13416, +13429, +13445, +13445, +13445, +13473, +13480, +13480, +13487, +13487, +13500, +13555, +13568, +13574, +13607, +13627, +13627, +13644, +13658, +13665, +13685, +13691, +13691, +13691, +13706, +13719, +13726, +13738, +13776, +13795, +13795, 13805, -13805, -13834, -13868, -13893, -13910, -13920, +13813, +13813, +13813, +13813, +13827, +13827, +13833, +13833, +13840, +13892, +13901, 13920, -13940, -13940, -13960, -13977, -13977, -13988, -13988, -13999, -13999, -13999, -13999, -14025, -14025, -14025, -14044, -14059, -14059, -14059, -14096, +13933, +13966, +13966, +13966, +13998, +14033, +14046, +14060, +14060, +14075, +14075, +14075, 14112, -14143, -14156, -14156, -14169, -14173, -14193, -14193, -14193, -14197, -14197, -14197, -14222, -14222, -14231, -14231, +14129, +14129, +14129, +14129, +14129, +14129, +14139, +14167, +14167, +14211, +14220, +14220, 14231, 14231, -14251, -14251, -14251, -14256, -14260, -14287, -14287, -14309, -14309, -14309, -14309, -14361, -14361, -14380, -14380, -14396, -14440, -14448, -14448, -14448, -14461, -14486, -14486, -14486, -14500, -14500, -14500, -14500, -14500, -14500, -14525, -14531, -14538, -14556, -14578, -14578, -14601, -14601, -14601, -14601, -14615, -14615, -14615, -14626, -14626, -14637, -14654, -14688, -14688, -14719, -14735, -14744, -14749, -14749, -14749, -14749, -14749, -14786, -14808, -14808, -14822, -14867, -14882, -14887, -14899, -14899, +14248, +14248, +14266, +14288, +14307, +14352, +14397, +14404, +14404, +14423, +14455, +14480, +14480, +14509, +14509, +14535, +14541, +14541, +14541, +14541, +14541, +14554, +14554, +14561, +14600, +14618, +14618, +14618, +14618, +14634, +14649, +14649, +14649, +14662, +14662, +14667, +14686, +14720, +14753, +14774, +14806, +14806, +14826, +14826, +14848, +14848, +14848, +14866, +14879, +14879, +14879, +14879, +14879, +14888, 14906, -14916, -14958, -14958, -14958, -14968, -15000, -15031, -15051, -15056, -15060, -15079, -15079, -15096, -15116, -15133, -15133, -15133, -15133, -15133, -15145, -15145, -15182, -15209, -15218, -15218, -15239, -15282, -15282, -15282, -15282, -15304, -15318, -15338, -15364, -15383, -15402, -15426, -15480, -15491, -15491, -15491, -15507, -15530, -15543, -15543, -15543, -15571, -15571, -15571, -15578, -15595, -15612, -15621, -15621, -15621, -15634, -15662, -15662, -15666, +14929, +14949, +14949, +14981, +14996, +15019, +15019, +15037, +15070, +15092, +15092, +15092, +15113, +15128, +15128, +15163, +15163, +15187, +15223, +15223, +15223, +15241, +15241, +15241, +15278, +15299, +15309, +15331, +15331, +15331, +15342, +15342, +15342, +15352, +15352, +15368, +15368, +15374, +15386, +15386, +15386, +15386, +15386, +15392, +15421, +15434, +15434, +15434, +15434, +15472, +15489, +15489, +15500, +15500, +15506, +15539, +15560, +15560, +15560, +15560, +15582, +15587, +15602, +15610, +15624, +15650, +15656, +15672, 15681, -15705, -15705, -15705, 15711, 15711, -15716, -15716, -15716, -15728, -15728, -15758, -15782, -15791, -15791, -15801, -15823, -15833, -15851, -15871, -15871, -15889, -15897, -15897, -15914, -15914, -15926, -15947, -15968, -15974, -15974, -15998, -16015, -16028, -16052, -16063, -16063, -16069, -16075, -16087, -16087, -16093, -16131, -16131, -16142, -16142, -16153, +15711, +15711, +15711, +15718, +15730, +15752, +15752, +15759, +15759, +15772, +15778, +15788, +15788, +15798, +15807, +15807, +15829, +15829, +15829, +15843, +15843, +15843, +15888, +15931, +15980, +15993, +16020, +16025, +16056, +16074, +16081, +16146, +16146, 16173, -16205, -16205, -16205, -16228, -16251, -16251, -16251, -16291, -16291, -16298, -16312, -16327, -16327, -16336, -16346, -16346, -16366, -16391, -16406, -16406, -16406, -16449, -16449, -16449, -16473, +16197, +16210, +16210, +16210, +16225, +16265, +16280, +16290, +16308, +16321, +16321, +16321, +16321, +16332, +16341, +16353, +16389, +16389, +16399, +16427, +16439, +16450, 16473, -16491, -16501, -16510, -16510, -16510, -16510, -16516, -16516, -16535, -16535, -16552, -16573, -16588, -16588, -16588, -16597, -16635, -16700, -16738, -16743, -16743, -16754, -16765, -16765, -16774, -16783, -16783, -16783, -16783, -16812, -16812, -16827, -16833, -16833, -16874, -16906, +16505, +16505, +16518, +16554, +16554, +16554, +16565, +16577, +16595, +16614, +16622, +16622, +16622, +16654, +16654, +16685, +16697, +16697, +16697, +16697, +16719, +16719, +16752, +16766, +16798, +16798, +16798, +16820, +16828, +16847, +16847, +16854, +16860, +16870, +16877, +16877, +16901, 16919, -16928, -16942, -16955, -16982, -17004, -17020, -17020, -17020, -17020, -17020, -17028, -17041, -17053, -17053, -17058, -17072, -17072, -17092, -17138, -17138, -17155, -17155, -17155, -17155, -17168, -17168, -17182, -17205, -17214, -17214, -17214, -17220, -17238, -17238, -17245, -17291, -17313, -17313, -17322, -17361, -17398, -17435, -17435, -17450, -17450, -17450, -17486, -17493, -17493, -17493, -17497, -17497, -17497, -17497, -17497, -17497, -17497, -17527, -17531, -17551, -17551, -17568, -17586, -17603, -17603, -17603, -17616, -17622, -17622, -17622, -17622, -17647, -17677, -17717, -17727, -17749, -17781, -17813, -17813, -17830, -17879, -17879, -17906, -17932, -17932, -17932, -17932, -17932, +16952, +16972, +16972, +16986, +16986, +17029, +17055, +17067, +17080, +17099, +17124, +17124, +17124, +17124, +17144, +17151, +17158, +17163, +17163, +17178, +17195, +17195, +17210, +17244, +17244, +17244, +17262, +17272, +17290, +17308, +17308, +17321, +17321, +17333, +17351, +17364, +17364, +17379, +17406, +17406, +17424, +17443, +17500, +17500, +17507, +17520, +17538, +17545, +17560, +17597, +17597, +17597, +17597, +17608, +17641, +17652, +17673, +17673, +17689, +17689, +17707, +17732, +17748, +17748, +17790, +17790, +17790, +17820, +17820, +17820, +17820, +17820, +17836, +17855, +17866, +17866, +17866, +17904, 17947, -17981, -17988, -18011, -18011, -18011, -18011, -18011, -18011, -18011, -18019, -18026, -18026, -18039, -18039, -18039, -18039, -18047, -18079, -18079, -18084, -18125, -18138, -18138, -18138, -18138, -18147, -18147, -18147, -18147, -18147, -18147, -18163, -18182, -18182, -18193, -18193, -18193, -18204, -18204, -18204, -18204, -18204, -18204, -18213, -18235, -18257, -18283, -18283, -18304, -18334, -18352, -18367, -18367, -18367, -18387, -18396, -18403, -18403, -18413, -18413, -18444, -18444, -18468, -18478, -18499, -18506, -18517, -18526, -18526, -18544, -18563, -18563, -18563, -18563, -18579, -18603, -18603, -18621, +17958, +17979, +17993, +18009, +18021, +18021, +18033, +18033, +18043, +18067, +18103, +18140, +18150, +18164, +18188, +18188, +18196, +18211, +18236, +18236, +18255, +18255, +18255, +18255, +18255, +18255, +18285, +18300, +18300, +18324, +18333, +18360, +18388, +18425, +18443, +18457, +18466, +18466, +18466, +18482, +18482, +18482, +18515, +18538, +18538, +18555, +18565, +18631, +18631, +18631, +18631, 18631, 18631, 18631, 18631, -18638, -18638, -18638, -18638, -18662, -18703, -18703, -18703, -18703, -18715, -18723, -18741, -18759, -18798, -18814, -18834, -18853, -18853, -18871, -18881, -18935, -18935, -18962, -18962, -18962, -18962, -18978, -18987, -18987, -18987, -19014, -19027, -19037, -19060, -19060, -19060, -19060, -19109, -19134, -19149, -19170, -19170, -19188, -19195, -19211, +18644, +18644, +18669, +18669, +18686, +18686, +18706, +18718, +18751, +18769, +18776, +18783, +18783, +18783, +18783, +18783, +18783, +18803, +18836, +18845, +18845, +18856, +18856, +18864, +18864, +18878, +18878, +18878, +18878, +18885, +18891, +18901, +18926, +18926, +18937, +18961, +18981, +18981, +18981, +18981, +18988, +19002, +19028, +19078, +19078, +19078, +19098, +19104, +19151, +19151, +19158, +19182, +19198, +19198, +19198, +19213, 19233, -19248, -19257, -19275, -19278, -19323, -19326, -19366, -19378, -19378, -19381, -19381, -19394, -19414, -19417, -19420, -19433, -19456, -19462, -19468, -19494, -19497, -19503, -19539, -19561, -19567, -19570, -19576, -19576, -19576, -19599, -19599, -19633, -19633, -19643, -19651, -19662, -19695, -19711, -19740, -19758, -19783, -19789, -19792, -19802, -19825, -19838, -19841, -19870, -19900, -19900, -19930, -19930, -19974, -20013, -20052, -20059, -20079, -20085, -20101, -20113, -20126, -20129, -20169, -20180, +19233, +19233, +19243, +19243, +19300, +19350, +19350, +19368, +19368, +19393, +19423, +19434, +19434, +19451, +19466, +19477, +19477, +19498, +19498, +19519, +19543, +19550, +19550, +19557, +19557, +19557, +19557, +19590, +19590, +19595, +19595, +19595, +19626, +19626, +19636, +19678, +19678, +19697, +19703, +19703, +19703, +19722, +19735, +19761, +19782, +19782, +19782, +19782, +19808, +19808, +19814, +19814, +19814, +19830, +19830, +19830, +19830, +19840, +19840, +19852, +19875, +19894, +19894, +19894, +19915, +19915, +19922, +19922, +19922, +19953, +19968, +19984, +19997, +20012, +20028, +20068, +20099, +20099, +20117, +20148, +20148, +20155, +20155, +20165, +20195, 20220, 20220, -20230, -20264, -20264, -20289, -20296, -20299, -20299, -20299, -20308, -20308, -20358, -20374, -20374, -20388, -20396, -20402, -20402, -20428, -20468, -20493, -20493, +20250, +20250, +20275, +20287, +20287, +20321, +20321, +20321, +20355, +20370, +20395, +20410, +20432, +20435, +20463, +20466, +20466, +20479, +20499, +20499, +20502, 20517, -20524, -20534, -20551, -20593, -20608, -20611, -20611, -20618, -20632, -20635, -20657, -20657, -20677, -20704, -20707, -20734, -20751, -20754, -20774, -20794, -20813, -20816, -20819, -20830, -20839, -20842, -20855, -20865, -20868, -20868, -20868, -20881, -20888, -20891, -20891, -20933, -20933, -20936, -20939, -20939, -20963, -20963, -20998, -21005, -21063, -21111, -21118, -21118, -21141, -21147, -21164, -21164, -21171, -21209, -21230, -21253, -21273, -21283, -21300, -21332, -21347, -21379, -21386, -21397, -21404, -21412, -21419, -21419, -21419, -21434, -21434, -21451, -21494, -21501, -21508, -21526, +20554, +20613, +20613, +20658, +20672, +20716, +20741, +20769, +20772, +20795, +20801, +20836, +20852, +20852, +20873, +20876, +20930, +20949, +20970, +20987, +20990, +21010, +21016, +21016, +21022, +21035, +21038, +21044, +21047, +21062, +21065, +21094, +21114, +21126, +21126, +21145, +21166, +21166, +21173, +21226, +21291, +21313, +21331, +21331, +21337, +21340, +21340, +21359, +21378, +21387, +21421, +21439, +21452, +21460, +21460, +21463, +21485, +21520, +21537, +21537, +21540, +21540, 21540, -21549, -21549, -21565, -21565, -21575, +21540, +21558, +21586, +21586, +21607, 21607, -21625, -21663, -21703, -21713, +21621, +21634, +21654, +21654, +21671, +21671, +21674, +21674, +21674, +21674, +21677, +21683, +21686, +21698, +21716, 21746, -21797, -21811, -21817, -21833, +21764, +21767, +21789, +21813, +21816, +21819, +21822, 21839, -21846, -21865, -21865, -21872, -21943, -21954, -21957, -21995, -22002, -22019, -22026, -22044, -22057, -22060, -22073, -22090, -22103, -22106, -22116, -22126, -22129, +21854, +21873, +21886, +21889, +21902, +21905, +21908, +21947, +21965, +21994, +21994, +22001, +22004, +22020, +22023, +22023, +22034, +22034, +22037, +22059, +22059, +22065, +22065, +22068, +22091, +22130, 22136, -22139, -22163, -22187, -22190, -22203, -22206, -22224, -22249, -22255, -22282, -22293, -22319, -22325, -22349, -22365, -22365, -22386, -22408, -22408, -22408, -22420, -22420, -22420, -22447, -22472, -22493, -22548, -22564, -22581, -22601, -22608, -22611, -22622, -22622, -22625, -22632, -22649, -22675, +22164, +22205, +22205, +22205, +22227, +22235, +22238, +22241, +22263, +22266, +22272, +22317, +22320, +22328, +22344, +22353, +22359, +22368, +22380, +22405, +22427, +22427, +22427, +22441, +22489, +22512, +22531, +22552, +22575, +22591, +22591, +22629, +22629, +22658, +22677, 22691, -22698, -22720, -22736, -22739, -22742, -22756, -22785, -22811, -22864, -22881, -22921, -22924, -22950, -22950, +22691, +22721, +22721, +22730, +22733, +22741, +22757, +22760, +22775, +22788, +22795, +22804, +22809, +22809, +22847, +22894, +22916, 22966, -22969, -22986, -23024, -23043, -23063, -23063, -23079, -23113, -23124, +22966, +22993, +23007, +23044, +23066, +23100, +23110, 23124, 23135, -23175, -23175, -23190, -23190, -23224, -23238, -23245, -23252, -23259, -23274, -23283, -23310, -23310, -23310, -23310, -23310, -23310, -23336, -23349, -23359, -23359, -23380, -23421, -23447, -23457, -23471, -23471, -23484, -23516, -23551, -23569, -23572, -23575, -23599, -23609, -23612, -23635, -23651, -23680, -23690, +23156, +23159, +23182, +23185, +23188, +23188, +23201, +23204, +23219, +23222, +23232, +23241, +23253, +23276, +23306, +23323, +23329, +23341, +23367, +23383, +23386, +23402, +23416, +23452, +23459, +23478, +23481, +23481, +23488, +23504, +23518, +23518, +23521, +23540, +23561, +23570, +23570, +23573, +23587, +23620, +23633, +23659, +23671, +23671, +23681, +23681, +23687, +23694, 23714, -23753, -23777, -23789, -23849, -23859, -23872, -23882, -23892, -23911, -23931, -23934, -23937, -23960, -23970, -23982, -23998, -24016, -24053, -24066, -24090, +23767, +23767, +23770, +23786, +23823, +23826, +23845, +23856, +23876, +23876, +23876, +23896, +23923, +23944, +23955, +23979, +23990, +23993, +24000, +24003, +24021, +24021, +24021, +24021, +24029, +24035, +24035, +24035, +24035, +24046, +24046, +24049, +24077, 24097, -24100, -24110, -24146, -24165, -24179, +24106, +24150, +24150, +24150, +24169, +24186, 24186, -24193, -24196, -24240, -24253, -24270, -24280, -24312, -24329, -24329, -24342, -24345, -24354, -24354, +24216, +24226, +24229, +24232, +24248, +24271, +24286, +24301, +24307, +24332, 24370, -24373, +24391, 24394, -24394, -24405, -24430, -24440, -24462, -24465, -24488, -24502, -24502, -24526, -24533, -24542, -24542, -24559, -24578, -24585, -24617, -24617, -24634, -24648, -24664, -24690, -24690, -24690, -24715, -24715, -24732, -24757, -24764, +24406, +24409, +24412, +24415, +24425, +24425, +24428, +24438, +24444, +24447, +24481, +24505, +24547, +24556, +24562, +24565, +24568, +24594, +24614, +24632, +24632, +24635, +24676, +24705, +24738, +24765, +24773, 24779, -24786, -24786, -24786, -24793, -24830, -24852, -24872, -24872, -24890, -24903, -24903, -24910, -24914, -24921, -24939, -24946, -24977, -24986, -25008, -25022, -25022, -25032, -25035, -25047, -25047, -25073, +24810, +24842, +24881, +24896, +24904, +24919, +24919, +24944, +24944, +24947, +24969, +24994, +25013, +25028, +25034, +25037, +25037, +25060, +25063, +25063, +25063, +25075, +25078, +25078, 25084, -25111, -25111, -25137, -25137, +25084, +25116, +25116, +25116, 25137, -25142, -25142, -25149, -25156, -25163, -25177, -25184, -25197, -25197, -25235, -25261, -25267, -25313, -25333, -25362, -25362, +25140, +25183, +25183, +25214, +25214, +25214, +25214, +25272, +25288, +25315, +25315, +25325, +25351, +25394, 25409, 25409, 25409, -25409, -25427, -25427, -25447, -25447, -25477, -25483, -25490, -25504, -25529, -25536, -25543, -25550, -25573, -25580, -25593, -25612, -25619, -25637, -25651, -25651, -25682, -25703, -25712, -25712, -25712, -25719, -25725, -25725, -25725, -25745, -25763, -25783, -25789, -25809, -25809, -25823, -25829, -25829, -25835, -25847, -25847, -25867, -25886, -25886, -25914, -25914, -25914, -25914, -25914, -25920, -25920, -25927, -25927, -25953, -25961, -25961, -25973, -25994, -25994, -26009, -26009, -26015, -26015, -26015, -26037, -26053, -26089, +25417, +25433, +25433, +25463, +25463, +25463, +25463, +25508, +25508, +25508, +25517, +25541, +25586, +25604, +25622, +25634, +25634, +25644, +25677, +25688, +25723, +25723, +25735, +25750, +25750, +25750, +25785, +25785, +25803, +25830, +25850, +25850, +25850, +25863, +25863, +25913, +25921, +25921, +25930, +25950, +25974, +25974, +25999, +25999, +26023, +26048, +26092, 26098, -26104, -26113, -26118, -26133, -26133, -26133, -26146, -26155, -26155, -26185, -26185, -26202, -26246, -26246, -26246, -26261, -26298, -26298, -26298, -26298, -26316, -26331, -26358, -26367, -26411, -26411, -26411, -26444, -26451, -26458, -26464, -26464, -26464, -26464, -26482, -26482, -26482, -26512, -26512, -26512, -26555, -26555, -26555, -26555, -26587, -26587, -26587, -26587, -26610, -26610, -26620, -26639, -26657, -26673, -26688, -26688, -26723, -26740, -26749, -26765, -26807, -26807, -26877, -26904, -26904, -26945, -26962, -26962, -26982, -26992, -27013, -27030, -27060, -27065, -27104, +26109, +26122, +26190, +26201, +26207, +26216, +26234, +26234, +26248, +26248, +26269, +26269, +26275, +26291, +26346, +26365, +26365, +26365, +26414, +26432, +26438, +26438, +26438, +26438, +26438, +26459, +26469, +26469, +26509, +26532, +26581, +26608, +26615, +26615, +26615, +26615, +26615, +26615, +26615, +26615, +26615, +26645, +26666, +26694, +26694, +26694, +26694, +26694, +26694, +26714, +26714, +26730, +26743, +26796, +26796, +26824, +26844, +26872, +26872, +26878, +26887, +26892, +26912, +26931, +26931, +26949, +26949, +26949, +26949, +26949, +26958, +26994, +27010, +27031, +27053, +27071, +27110, 27110, -27119, -27125, -27125, -27125, +27139, +27139, +27139, +27139, +27139, +27139, +27139, +27144, 27150, -27166, -27166, -27185, -27185, -27207, +27150, +27165, +27184, +27184, +27184, +27202, +27214, +27230, +27246, 27246, -27265, -27265, -27286, -27294, -27311, -27331, -27331, -27331, -27331, -27331, -27353, -27353, -27360, -27378, -27402, -27419, -27431, -27431, -27431, -27437, -27506, -27514, -27514, -27514, -27514, -27514, -27514, -27530, -27542, -27550, -27550, -27550, -27550, -27550, -27550, -27585, -27603, -27603, -27635, -27635, -27635, -27642, -27650, -27686, -27686, -27686, -27697, -27717, -27723, -27766, -27808, -27815, -27831, -27831, -27831, -27850, -27866, -27866, -27866, -27866, -27871, -27871, -27877, -27899, -27923, -27948, -27955, -27955, -27964, -27990, -27999, -28015, -28023, -28027, -28052, -28052, -28052, -28059, -28059, -28096, -28096, -28112, -28112, -28124, -28124, -28180, -28180, -28203, -28203, -28212, -28212, -28244, -28279, -28286, -28298, -28298, -28317, -28340, -28340, -28340, -28385, -28406, -28438, -28445, -28462, -28462, -28462, -28462, -28462, -28462, -28488, -28504, -28520, -28558, -28558, -28558, -28563, -28578, -28578, -28578, -28584, -28584, -28584, -28584, -28584, -28600, -28600, -28600, -28600, -28606, -28611, -28611, -28631, -28631, -28655, -28655, -28664, -28664, -28668, -28672, -28672, -28672, -28672, -28700, -28708, -28708, -28730, -28746, -28758, -28758, -28776, +27255, +27255, +27266, +27266, +27266, +27279, +27279, +27279, +27288, +27296, +27358, +27367, +27367, +27367, +27367, +27367, +27367, +27367, +27395, +27427, +27427, +27451, +27451, +27462, +27462, +27462, +27497, +27508, +27512, +27512, +27538, +27538, +27564, +27564, +27587, +27611, +27626, +27626, +27648, +27648, +27667, +27667, +27691, +27706, +27720, +27734, +27764, +27791, +27791, +27823, +27847, +27847, +27847, +27857, +27863, +27874, +27878, +27878, +27878, +27884, +27891, +27891, +27907, +27929, +27935, +27935, +27935, +27942, +27966, +27966, +27966, +27993, +27993, +27993, +27993, +28009, +28020, +28020, +28020, +28025, +28045, +28066, +28087, +28104, +28117, +28148, +28158, +28167, +28208, +28225, +28254, +28305, +28305, +28310, +28319, +28319, +28319, +28328, +28328, +28359, +28405, +28409, +28409, +28409, +28409, +28440, +28440, +28440, +28440, +28486, +28486, +28486, +28501, +28530, +28530, +28546, +28546, +28569, +28569, +28587, +28650, +28650, +28650, +28650, +28673, +28686, +28686, +28697, +28697, +28732, +28737, +28737, +28749, +28760, +28760, +28772, +28779, 28794, -28801, -28801, -28801, -28811, -28811, -28827, -28834, -28860, -28872, -28887, -28917, -28930, +28841, +28841, +28865, +28865, +28865, +28897, +28920, +28920, +28927, +28934, 28965, -28983, -28983, -29018, -29038, -29051, -29051, -29082, -29082, -29136, -29152, -29172, -29182, -29198, -29198, -29205, -29205, -29219, -29219, -29219, +29022, +29022, +29047, +29065, +29083, +29089, +29125, +29125, +29125, +29125, +29130, +29186, +29186, +29194, +29247, +29257, +29257, 29285, -29299, -29305, -29323, -29323, -29332, -29355, -29390, -29396, -29447, -29447, +29285, +29285, +29368, +29375, +29402, +29409, +29414, +29421, +29428, +29434, 29447, -29460, -29460, -29472, -29472, -29484, -29484, -29484, -29484, -29502, -29502, -29529, -29538, -29538, +29464, +29473, +29494, +29509, +29509, +29521, +29521, +29533, 29538, -29538, -29577, -29589, -29589, -29605, -29624, -29624, -29624, -29624, -29624, -29624, -29632, -29641, -29641, -29650, -29695, -29702, -29702, -29714, +29544, +29561, +29571, +29578, +29578, +29578, +29588, +29598, +29609, +29609, +29616, +29634, +29640, +29651, +29651, +29663, +29679, +29694, +29694, +29694, +29694, +29727, 29727, 29737, -29737, -29737, -29788, -29802, -29825, -29825, -29825, -29832, -29859, -29876, -29894, -29894, -29904, -29904, -29904, -29904, -29904, -29919, -29929, -29940, -29940, -29947, -29967, -29991, -29991, -29991, -29998, -30006, -30006, -30006, -30026, +29746, +29752, +29759, +29778, +29778, +29778, +29784, +29784, +29792, +29792, +29792, +29792, +29826, +29843, +29854, +29877, +29903, +29903, +29903, +29903, +29903, +29903, +29910, +29910, +29910, +29910, +29933, +29961, +29979, +30013, +30013, +30024, +30028, +30028, 30042, 30042, -30059, -30067, -30067, -30090, -30096, -30115, -30133, -30133, -30138, -30144, -30152, -30152, -30164, -30164, -30164, -30164, -30164, -30178, +30042, +30048, +30062, +30062, +30080, +30086, +30093, +30113, +30113, +30130, +30130, +30130, +30130, 30178, -30211, -30215, -30255, -30259, -30267, -30277, -30283, -30289, -30289, -30307, -30327, -30334, -30334, -30334, -30353, -30359, -30375, -30387, -30387, -30387, -30413, -30413, -30422, -30422, -30422, -30459, -30477, -30492, +30183, +30183, +30183, +30204, +30208, +30217, +30238, +30250, +30250, +30250, +30270, +30276, +30282, +30298, +30336, +30336, +30370, +30415, +30415, +30415, +30415, +30415, +30419, +30423, +30423, +30436, +30436, +30436, +30436, +30436, +30436, +30475, +30475, 30519, -30519, -30567, -30567, -30575, -30581, -30618, -30618, -30618, -30618, -30635, -30657, -30665, -30665, -30685, -30695, -30717, -30738, -30757, -30757, -30780, -30786, -30786, -30796, -30834, -30834, -30834, -30838, -30864, -30894, -30913, -30913, -30913, -30935, -30935, -30935, -30965, -30965, -30993, -31002, -31002, -31002, -31014, -31014, -31040, -31065, -31075, -31075, -31109, -31121, -31121, -31121, +30536, +30536, +30536, +30542, +30542, +30562, +30602, +30608, +30617, +30641, +30701, +30701, +30701, +30730, +30730, +30730, +30743, +30751, +30765, +30779, +30807, +30814, +30814, +30814, +30850, +30850, +30850, +30850, +30879, +30886, +30893, +30893, +30907, +30923, +30930, +30930, +30930, +30930, +30940, +31010, +31023, +31023, +31032, +31032, +31032, +31032, +31049, +31049, +31059, +31059, +31071, +31090, +31113, +31120, 31136, -31164, -31164, -31164, -31179, -31189, -31189, -31189, -31189, -31189, -31202, -31202, -31202, -31202, -31219, -31219, -31225, -31243, -31259, -31259, -31282, -31282, -31282, +31162, +31168, +31235, +31249, +31249, +31254, +31260, +31260, +31290, 31290, -31298, -31313, -31330, -31338, -31338, -31338, -31338, -31338, -31338, -31338, -31338, -31353, -31353, -31353, -31382, -31390, -31429, -31437, -31447, -31447, +31299, +31311, +31348, +31348, +31357, +31357, +31380, +31430, +31469, 31475, -31499, -31499, -31521, -31562, -31562, -31562, -31595, -31614, -31631, -31683, -31707, -31735, -31735, -31762, -31776, -31817, -31828, -31828, -31838, -31852, -31870, -31870, -31870, -31870, -31879, -31879, -31879, -31879, -31895, -31895, -31895, -31925, -31925, -31925, -31925, -31944, -31944, -31944, -31944, -31968, -31968, -31985, -32000, -32021, -32032, -32054, -32065, -32065, -32076, -32099, -32099, -32118, -32126, -32152, -32152, -32152, -32169, -32169, +31493, +31531, +31542, +31563, +31579, +31625, +31636, +31651, +31661, +31684, +31688, +31698, +31698, +31704, +31730, +31785, +31798, +31798, +31798, +31798, +31808, +31808, +31808, +31808, +31822, +31840, +31840, +31854, +31874, +31874, +31885, +31896, +31896, +31903, +31903, +31942, +31942, +31942, +31946, +31951, +31972, +31999, +31999, +32016, +32030, +32030, +32030, +32037, +32037, +32067, +32105, +32105, +32148, +32170, 32176, -32235, -32240, -32240, -32257, -32257, -32257, -32288, -32288, -32288, -32301, -32301, -32301, -32301, -32331, -32331, -32331, -32331, -32331, -32331, -32359, -32359, -32424, -32440, -32440, -32468, -32468, +32188, +32188, +32188, +32188, +32208, +32234, +32234, +32251, +32295, +32295, +32295, +32295, +32295, +32295, +32295, +32295, +32308, +32308, +32323, +32336, +32336, +32341, +32367, +32411, +32411, +32429, +32461, +32461, +32461, +32467, +32478, 32488, -32488, -32509, -32536, -32558, -32573, -32573, -32577, -32597, -32597, -32609, -32620, -32634, -32640, -32640, -32668, -32679, -32679, -32687, -32718, -32718, -32718, -32718, -32718, -32738, -32745, -32760, -32784, -32848, +32525, +32563, +32586, +32598, +32598, +32598, +32613, +32629, +32629, +32660, +32676, +32708, +32720, +32736, +32743, +32743, +32752, +32752, +32762, +32766, +32778, +32778, +32797, +32801, +32813, +32820, +32820, +32838, 32862, -32894, -32901, -32901, -32901, -32908, -32908, -32915, -32915, -32919, -32961, -32993, -33005, -33005, -33037, -33044, -33044, -33051, -33090, -33097, -33097, -33116, -33123, -33123, -33130, -33138, -33142, -33168, -33186, -33193, -33193, +32868, +32881, +32881, +32892, +32906, +32920, +32920, +32920, +32942, +32942, +32942, +32955, +32970, +32970, +32979, +32979, +32983, +32990, +33013, +33045, +33057, +33067, +33073, +33099, +33099, +33099, +33099, +33103, +33103, +33141, +33141, +33173, +33190, +33190, +33190, +33190, +33212, 33216, -33223, -33223, -33240, -33268, -33272, -33272, -33304, -33311, -33343, -33343, -33343, -33362, -33362, -33372, -33389, -33389, -33396, -33396, -33404, -33404, -33420, -33420, +33234, +33234, +33245, +33245, +33263, +33263, +33263, +33271, +33312, +33337, +33359, +33398, 33427, -33435, -33456, +33432, 33456, -33467, -33536, -33543, -33547, -33554, -33576, -33583, -33606, -33606, -33613, -33629, -33657, -33664, -33664, -33664, -33690, -33699, -33699, -33730, -33750, -33762, -33783, -33826, -33844, -33844, -33868, -33868, -33903, -33911, -33911, -33927, -33945, +33460, +33490, +33500, +33500, +33508, +33508, +33508, +33508, +33508, +33532, +33570, +33593, +33597, +33597, +33597, +33597, +33597, +33601, +33638, +33638, +33638, +33638, +33638, +33660, +33693, +33729, +33739, +33787, +33787, +33787, +33798, +33798, +33808, +33808, +33808, +33808, +33840, +33840, +33840, +33854, +33854, +33854, +33884, +33884, +33884, +33914, +33955, +33961, +33965, +33974, +33974, +33974, 33990, -34010, -34025, -34025, -34032, -34051, -34075, -34095, -34129, -34129, +33998, +34006, +34030, +34030, +34030, +34064, +34074, +34094, +34108, +34108, 34129, -34129, -34129, -34136, -34149, -34173, -34173, -34186, -34199, -34206, -34218, -34218, -34227, -34227, -34227, -34227, -34234, -34234, -34234, -34241, -34268, -34275, +34174, +34198, +34225, +34246, +34261, +34277, +34277, +34281, +34305, +34305, 34305, -34326, -34360, -34367, -34386, -34397, -34407, -34407, -34407, -34407, -34407, -34461, -34468, -34496, -34496, -34505, -34512, -34566, -34594, -34594, -34601, -34606, -34634, -34634, -34634, -34634, -34634, -34634, -34634, -34653, -34660, -34660, -34666, -34686, -34696, -34703, -34720, -34720, -34727, +34305, +34305, +34305, +34338, +34355, +34355, +34355, +34355, +34380, +34380, +34395, +34422, +34443, +34443, +34448, +34448, +34459, +34472, +34488, +34495, +34504, +34515, +34515, +34533, +34533, +34533, +34563, +34622, +34622, +34639, +34656, +34706, 34744, -34751, -34758, -34773, -34794, -34801, -34808, -34808, -34828, -34835, -34852, -34859, -34876, -34876, +34752, +34752, +34767, +34788, +34793, +34793, +34793, +34793, +34793, +34793, +34837, +34837, +34837, 34885, -34893, -34905, -34934, -34941, -34988, -34988, -34988, -35033, -35033, -35033, -35040, -35058, -35065, +34908, +34908, +34926, +34933, +34953, +34963, +34963, +34963, +34990, +34990, +35013, +35013, +35017, +35017, +35024, +35024, +35041, +35041, +35059, +35059, +35059, +35073, 35073, -35093, -35119, -35137, -35144, -35171, -35199, +35073, +35084, +35108, +35120, +35130, +35184, +35184, +35184, +35191, 35206, -35213, -35253, -35266, -35273, -35273, -35312, -35329, -35336, -35365, -35381, -35399, -35413, -35420, -35427, -35427, -35432, -35442, -35448, -35455, -35467, -35517, -35531, -35538, +35216, +35216, +35216, +35226, +35244, +35260, +35260, +35290, +35296, +35296, +35296, +35313, +35334, +35334, +35343, +35382, +35414, +35414, +35447, +35447, +35457, +35457, +35475, +35475, +35484, +35491, +35491, +35503, +35503, +35509, +35529, +35537, +35558, 35558, -35571, -35581, -35606, -35619, -35645, -35659, -35666, -35666, -35681, -35688, -35719, -35729, -35736, -35743, -35761, -35769, -35828, -35835, -35859, -35859, -35866, -35866, -35866, -35873, -35921, -35950, +35567, +35567, +35585, +35595, +35610, +35624, +35654, +35654, +35661, +35661, +35680, +35696, +35701, +35701, +35726, +35752, +35768, +35768, +35838, +35870, +35870, +35894, +35894, +35894, +35905, +35922, 35965, -35976, -35976, -35983, -36007, -36014, -36021, -36021, -36021, -36021, -36021, -36038, -36038, -36038, -36053, -36067, -36082, -36082, -36082, -36119, -36155, -36171, -36171, -36171, -36184, -36199, -36206, -36206, -36220, -36234, -36242, -36272, -36282, -36296, -36296, -36314, -36321, -36352, -36359, -36383, -36391, -36412, -36419, -36419, -36434, -36442, -36449, -36462, -36469, -36476, -36492, -36492, -36512, -36512, -36567, -36567, -36588, -36588, -36588, -36608, -36650, -36660, -36670, -36687, -36694, -36701, -36714, -36725, -36732, -36762, -36777, -36804, -36804, -36838, -36855, -36855, -36903, -36922, -36943, -36943, -36949, -36949, -36969, +35984, +35989, +36011, +36025, +36040, +36057, +36057, +36057, +36074, +36086, +36096, +36108, +36140, +36163, +36191, +36216, +36248, +36248, +36275, +36284, +36284, +36298, +36298, +36328, +36335, +36344, +36348, +36406, +36413, +36433, +36457, +36470, +36470, +36478, +36485, +36485, +36485, +36523, +36541, +36550, +36550, +36550, +36550, +36550, +36565, +36565, +36565, +36569, +36569, +36576, +36576, +36576, +36595, +36595, +36610, +36620, +36620, +36639, +36639, +36639, +36653, +36653, +36682, +36722, +36722, +36722, +36722, +36722, +36728, +36745, +36745, +36759, +36759, +36759, +36759, +36768, +36785, +36803, +36834, +36834, +36834, +36865, +36887, +36887, +36887, +36907, +36926, +36967, 36977, -36977, -36993, -36993, -37000, -37023, -37023, -37030, -37121, -37137, -37137, -37153, -37176, -37183, -37192, +36981, +36981, +37005, +37005, +37054, +37086, +37096, +37103, +37116, +37116, +37116, +37143, +37143, +37149, +37149, +37181, +37181, +37181, +37205, +37209, 37209, -37217, -37248, -37248, -37248, -37266, +37236, +37259, +37259, 37286, -37292, -37292, -37300, -37339, -37339, -37355, -37362, -37379, -37387, -37403, -37403, -37403, -37432, -37432, -37450, -37450, -37466, -37481, -37481, -37481, -37500, +37302, +37302, +37319, +37336, +37348, +37361, +37361, +37361, +37361, +37361, +37371, +37371, +37382, +37396, +37396, +37396, +37420, +37433, +37449, +37449, +37449, +37449, +37471, +37471, +37499, +37519, +37519, 37540, -37540, -37540, -37552, -37569, -37594, -37594, -37609, -37628, -37628, -37661, -37677, -37677, -37677, -37717, -37717, -37717, -37723, -37754, -37754, -37799, -37799, -37810, -37810, -37825, -37825, -37825, -37825, -37845, -37867, -37867, -37877, -37892, -37909, -37909, -37919, -37919, -37938, -37959, -37967, -37972, -37992, -37992, -38026, +37550, +37555, +37555, +37572, +37576, +37576, +37576, +37583, +37583, +37599, +37615, +37615, +37634, +37634, +37647, +37672, +37672, +37690, +37705, +37710, +37728, +37728, +37728, +37728, +37745, +37755, +37755, +37761, +37771, +37771, +37788, +37813, +37813, +37832, +37832, +37832, +37832, +37856, +37856, +37872, +37872, +37872, +37872, +37872, +37872, +37872, +37902, +37913, +37913, +37925, +37943, +37952, +37952, +37952, +37982, +38011, +38011, +38011, +38011, +38019, +38019, +38019, +38019, +38019, 38035, -38061, -38061, -38072, -38083, -38083, -38099, -38123, -38146, -38146, -38158, -38158, -38182, -38234, -38255, -38255, -38310, -38331, -38331, -38346, -38346, -38346, -38353, -38353, -38353, -38378, -38378, -38388, -38408, -38428, -38428, -38428, -38428, -38445, -38453, -38460, -38460, -38460, -38493, -38503, -38525, -38525, -38532, -38532, -38546, -38546, -38569, -38599, -38618, -38618, -38618, -38643, -38643, -38643, -38691, -38699, -38717, +38035, +38057, +38057, +38068, +38080, +38091, +38110, +38128, +38149, +38164, +38189, +38199, +38199, +38199, +38207, +38207, +38224, +38224, +38235, +38251, +38251, +38251, +38251, +38251, +38260, +38260, +38260, +38260, +38260, +38279, +38279, +38290, +38290, +38297, +38345, +38351, +38351, +38389, +38398, +38402, +38402, +38450, +38450, +38466, +38490, +38490, +38494, +38517, +38544, +38544, +38557, +38568, +38574, +38574, +38574, +38574, +38574, +38574, +38595, +38616, +38642, +38672, +38672, +38672, +38672, +38672, +38686, +38693, 38717, -38729, -38729, -38733, -38760, -38760, -38773, -38801, -38817, -38824, +38735, +38751, +38751, +38758, +38794, +38808, +38829, 38836, 38843, -38843, -38843, -38870, -38880, -38880, -38887, -38900, -38907, -38919, -38919, -38919, -38949, -38967, -38984, -38984, -38984, -38989, -38989, -39029, -39036, -39054, -39080, -39086, -39103, -39110, -39130, -39130, -39130, -39154, -39154, -39176, -39176, -39213, -39213, -39213, -39225, -39230, -39249, -39264, -39264, -39264, -39284, -39284, -39293, -39293, -39311, -39311, -39311, -39320, +38858, +38883, +38893, +38915, +38915, +38915, +38922, +38933, +38940, +38940, +38950, +38957, +38991, +39009, +39009, +39014, +39021, +39021, +39028, +39042, +39048, +39055, +39077, +39102, +39116, +39129, +39136, +39155, +39155, +39161, +39179, +39205, +39219, +39239, +39283, +39283, +39304, 39339, -39345, -39355, -39369, -39388, -39399, -39399, -39399, -39418, -39418, -39433, -39451, -39451, -39458, -39476, -39481, -39519, -39519, -39519, -39519, -39529, -39567, -39609, -39624, -39637, -39637, -39644, -39644, -39651, -39679, -39679, -39679, -39697, -39709, -39751, -39751, -39777, -39791, -39817, -39817, -39835, -39835, -39844, -39844, -39851, -39874, -39878, -39878, -39888, -39905, -39905, -39928, -39928, +39365, +39387, +39413, +39413, +39413, +39430, +39437, +39437, +39450, +39462, +39469, +39484, +39502, +39509, +39509, +39548, +39548, +39548, +39560, +39573, +39582, +39582, +39582, +39596, +39616, +39639, +39639, +39646, +39668, +39677, +39694, +39705, +39721, +39731, +39731, +39750, +39750, +39760, +39760, +39769, +39796, +39796, +39815, +39822, +39847, +39867, +39881, +39881, +39900, +39907, +39907, +39920, +39934, +39945, 39945, 39952, -39978, -39978, -39985, -40029, -40043, -40043, -40043, -40053, -40066, -40094, -40106, -40129, -40129, -40151, -40151, -40151, -40158, -40182, -40199, -40232, -40232, -40232, -40281, -40288, -40302, -40302, -40302, -40302, -40317, -40317, -40324, -40324, -40356, -40356, -40369, -40384, -40392, -40392, -40392, -40413, -40413, -40455, -40462, -40469, -40483, +39952, +39952, +39961, +39989, +40030, +40045, +40058, +40085, +40101, +40138, +40178, +40188, +40210, +40221, +40228, +40228, +40241, +40248, +40279, +40292, +40292, +40301, +40308, +40322, +40322, +40329, +40336, +40352, +40359, +40366, +40373, +40380, +40380, +40435, +40435, +40435, +40473, 40483, 40483, -40511, -40511, -40524, -40524, -40528, -40546, -40546, -40568, -40575, -40582, -40610, -40629, -40656, -40656, -40656, -40679, -40679, -40679, -40693, -40713, -40732, -40754, -40795, -40795, -40809, -40816, -40823, -40851, -40889, -40908, -40956, -40970, -41026, -41040, -41056, -41063, -41070, -41077, -41100, -41108, -41141, -41148, -41181, -41197, -41220, -41241, -41275, -41291, -41307, -41307, -41327, -41334, -41355, -41369, -41394, -41401, -41414, -41430, -41444, -41494, +40488, +40488, +40488, +40513, +40537, +40537, +40564, +40569, +40612, +40637, +40637, +40651, +40651, +40658, +40665, +40665, +40672, +40686, +40717, +40741, +40766, +40789, +40815, +40830, +40830, +40840, +40840, +40840, +40840, +40860, +40886, +40893, +40933, +40933, +40946, +40968, +41002, +41017, +41024, +41057, +41080, +41087, +41094, +41137, +41150, +41157, +41157, +41164, +41171, +41177, +41184, +41198, +41198, +41198, +41216, +41240, +41251, +41293, +41300, +41330, +41346, +41383, +41405, +41405, +41417, +41448, +41466, +41466, +41466, +41466, +41473, +41485, 41513, -41513, -41520, -41529, -41575, -41589, -41612, +41528, +41537, +41564, +41564, +41594, +41627, +41627, +41627, 41634, 41634, +41639, +41639, 41652, -41652, -41664, -41696, -41703, -41750, -41772, -41772, -41793, -41819, -41826, -41848, -41855, -41872, -41884, -41892, -41892, -41947, -41947, -41947, -41971, -41971, -41971, -41971, -41977, -41977, -41984, -42033, -42051, -42051, +41671, +41680, +41690, +41690, +41690, +41690, +41712, +41712, +41722, +41746, +41778, +41784, +41816, +41825, +41825, +41832, +41856, +41868, +41916, +41922, +41935, +41944, +41956, +41970, +41982, +41982, +41982, +41989, +41996, +42018, +42018, +42018, +42025, +42032, +42040, +42040, +42047, +42047, +42055, +42055, 42066, -42066, -42066, -42066, -42087, -42102, -42127, -42134, -42134, -42155, -42167, -42186, -42186, -42186, -42193, -42215, -42224, -42242, -42249, -42262, -42286, -42303, -42316, -42340, -42360, -42392, -42392, -42399, -42406, -42433, -42449, -42449, -42459, -42485, -42513, -42530, -42537, -42537, -42544, -42576, -42576, -42583, -42583, -42590, -42599, -42628, -42649, -42649, -42656, -42697, -42704, +42086, +42086, +42086, +42103, +42103, +42122, +42129, +42136, +42157, +42164, +42179, +42179, +42212, +42226, +42233, +42240, +42240, +42247, +42274, +42308, +42315, +42343, +42343, +42385, +42408, +42415, +42415, +42415, +42415, +42436, +42443, +42450, +42450, +42457, +42464, +42471, +42484, +42508, +42529, +42548, +42548, +42596, +42596, +42596, +42603, +42624, +42645, +42661, +42684, +42684, +42694, +42694, +42701, +42701, +42720, 42720, -42739, -42739, -42815, -42815, -42834, -42834, -42870, -42892, -42899, -42899, -42919, -42939, -42969, -42969, -42979, -42979, -42979, -42990, -43030, -43030, -43052, -43052, -43074, -43102, -43102, -43102, -43130, -43147, -43154, +42754, +42776, +42795, +42795, +42808, +42808, +42846, +42855, +42864, +42882, +42888, +42909, +42909, +42929, +42964, +42985, +43001, +43017, +43043, +43050, +43050, +43060, +43073, +43091, +43111, +43134, 43172, -43179, -43199, -43211, -43215, -43222, -43222, +43172, +43172, +43204, +43250, +43250, 43257, -43284, -43302, -43352, -43368, -43368, -43368, -43381, -43393, -43423, -43444, -43487, -43494, -43523, -43547, -43567, -43595, -43612, -43612, -43619, -43619, -43640, -43646, -43664, -43697, -43717, -43724, -43724, -43744, -43767, -43776, -43781, -43801, -43801, -43808, -43808, -43815, -43822, -43836, -43850, -43869, +43286, +43325, +43345, +43362, +43362, +43362, +43362, +43362, +43430, +43430, +43430, +43437, +43437, +43455, +43455, +43464, +43464, +43471, +43471, +43471, +43471, +43484, +43484, +43490, +43490, +43513, +43526, +43546, +43546, +43553, +43571, +43584, +43584, +43631, +43642, +43642, +43642, +43682, +43702, +43702, +43722, +43729, +43729, +43756, +43783, +43783, +43795, +43814, +43818, +43824, +43854, +43854, +43861, +43861, +43868, 43888, -43895, -43911, -43943, -43963, -43963, -43998, -43998, -44033, -44033, -44047, -44064, -44077, -44077, -44101, -44112, -44112, -44112, -44130, -44130, -44130, -44155, -44166, -44166, -44166, -44184, -44184, -44268, -44268, -44291, -44317, -44326, -44353, -44353, -44392, -44408, -44444, -44444, -44444, -44444, -44444, -44451, -44483, +43888, +43893, +43900, +43917, +43939, +43939, +43939, +43946, +43980, +43980, +43996, +44024, +44030, +44036, +44036, +44043, +44043, +44055, +44071, +44087, +44087, +44097, +44097, +44097, +44110, +44158, +44164, +44171, +44208, +44208, +44235, +44241, +44241, +44241, +44241, +44241, +44251, +44251, +44275, +44275, +44300, +44307, +44307, +44314, +44321, +44332, +44377, +44400, +44426, +44432, +44446, +44446, +44476, +44476, +44486, +44486, +44486, +44486, 44502, -44525, -44525, -44570, -44606, -44606, -44658, -44677, -44677, -44711, -44711, -44711, -44711, -44711, -44742, -44742, -44742, -44749, -44763, -44804, +44512, +44522, +44535, +44550, +44574, +44597, +44605, +44616, +44616, +44622, +44622, +44628, +44636, +44636, +44636, +44643, +44643, +44662, +44669, +44701, +44720, +44720, +44727, +44750, +44754, +44772, +44772, 44804, -44854, -44866, -44866, -44884, -44884, -44894, -44909, -44916, -44916, -44923, -44938, -44958, -44965, -45004, -45016, -45030, -45050, -45060, -45060, -45066, -45073, -45077, -45084, -45105, -45105, -45105, -45105, -45105, -45112, -45112, -45130, -45139, -45159, -45166, -45208, -45223, -45251, +44819, +44835, +44859, +44859, +44883, +44887, +44898, +44910, +44922, +44939, +44939, +44939, +44945, +44945, +44945, +44952, +44952, +44952, +44991, +45023, +45054, +45071, +45071, +45071, +45080, +45102, +45102, +45102, +45128, +45132, +45162, +45175, +45193, +45199, +45199, +45206, +45221, +45228, +45243, 45258, -45275, -45291, +45276, +45280, 45291, 45310, -45323, -45351, -45358, -45368, -45399, -45413, -45437, -45437, -45446, -45473, -45481, -45488, -45488, -45488, -45488, -45501, -45526, -45544, -45589, -45612, -45632, -45632, -45658, -45672, -45715, -45721, -45721, -45727, -45734, -45759, -45810, -45838, -45903, -45915, -45952, -45959, -45978, -45991, -45997, -45997, -45997, -45997, -46020, -46020, -46038, -46070, -46076, -46076, -46076, -46093, -46112, -46135, -46152, -46152, -46182, -46182, -46182, -46182, -46182, -46182, -46182, -46182, -46198, -46222, -46222, -46229, -46229, -46240, -46261, -46273, -46273, -46288, -46288, -46288, -46314, -46314, -46314, -46327, -46327, -46327, -46362, -46377, -46377, -46383, -46383, -46383, +45331, +45338, +45346, +45346, +45383, +45383, +45390, +45416, +45442, +45449, +45477, +45484, +45503, +45503, +45503, +45510, +45547, +45561, +45571, +45578, +45585, +45617, +45617, +45617, +45617, +45676, +45700, +45730, +45745, +45745, +45765, +45796, +45803, +45829, +45833, +45843, +45851, +45886, +45886, +45909, +45916, +45916, +45916, +45923, +45963, +45984, +45984, +46004, +46022, +46052, +46090, +46113, +46119, +46138, +46166, +46166, +46179, +46196, +46224, +46224, +46224, +46224, +46224, +46234, +46234, +46289, +46309, +46328, +46334, +46357, +46369, 46383, -46391, -46391, -46400, -46400, -46400, -46404, -46433, -46450, -46475, -46493, -46515, -46521, -46521, -46521, -46546, -46567, -46567, -46567, +46390, +46398, +46398, +46412, +46443, +46457, +46476, +46476, +46484, +46484, +46484, +46504, +46522, +46522, +46522, +46522, +46538, +46538, +46544, +46544, 46582, 46582, 46582, -46603, -46603, -46603, -46620, -46653, -46653, -46659, -46690, -46700, -46700, -46719, -46736, -46736, -46763, -46763, -46763, -46785, -46785, +46596, +46596, +46613, +46621, +46628, +46643, +46657, +46665, +46699, +46707, +46716, +46720, +46747, +46762, +46762, +46770, 46796, -46811, -46811, -46819, -46819, -46819, -46855, -46855, -46874, -46874, -46893, +46806, +46816, +46827, +46827, +46827, +46844, +46857, +46867, +46881, +46896, +46903, +46903, +46903, 46911, -46931, -46931, -46931, -46941, -46954, -46961, -46967, -46996, -47009, -47009, -47046, -47046, -47046, -47046, -47046, -47074, +46932, +46947, +46964, +46964, +46984, +47006, +47013, +47013, +47013, +47027, +47027, +47069, +47077, +47077, +47077, +47083, 47093, -47100, -47121, -47130, -47168, -47168, -47168, -47168, -47168, -47168, -47209, -47243, -47282, +47093, +47106, +47181, +47195, +47195, +47195, +47237, +47273, 47295, 47295, -47302, -47336, -47346, -47346, -47353, -47353, -47359, -47366, -47373, -47380, -47419, -47434, -47441, -47458, -47486, -47486, -47486, -47493, -47512, -47519, -47519, -47519, -47519, -47536, -47550, -47575, -47601, -47601, -47612, -47619, -47643, -47655, -47655, -47670, -47670, -47683, -47690, -47690, -47727, -47740, -47747, -47755, -47771, -47771, -47806, -47806, -47813, -47819, -47819, -47819, -47826, -47851, -47858, -47865, -47890, -47912, +47301, +47343, +47349, +47369, +47393, +47409, +47414, +47428, +47428, +47454, +47499, +47511, +47529, +47535, +47535, +47535, +47535, +47535, +47547, +47572, +47587, +47587, +47587, +47625, +47625, +47645, +47664, +47664, +47696, +47704, +47731, +47769, +47790, +47799, +47799, +47816, +47816, +47833, +47833, +47833, +47839, +47856, +47877, +47877, 47918, -47939, -47955, -47996, -48029, -48029, -48029, -48050, -48050, -48068, -48092, -48106, -48106, -48117, -48117, -48134, -48134, -48134, -48134, -48134, -48134, -48134, -48134, -48143, -48158, -48192, -48199, -48199, -48206, -48234, -48270, -48277, -48322, -48337, -48337, -48337, -48344, -48351, -48364, -48371, -48371, -48378, -48395, -48402, -48402, -48402, -48412, -48421, -48421, -48445, -48452, +47948, +47956, +47978, +47978, +47991, +47991, +47991, +48008, +48008, +48019, +48031, +48045, +48045, +48045, +48045, +48066, +48066, +48070, +48090, +48119, +48136, +48142, +48149, +48149, +48160, +48160, +48160, +48160, +48172, +48172, +48185, +48196, +48196, +48218, +48218, +48225, +48225, +48225, +48225, +48235, +48249, +48249, +48258, +48258, +48284, +48284, +48308, +48326, +48341, +48370, +48370, +48394, +48429, +48429, +48437, +48442, 48452, 48452, -48482, -48500, -48542, -48542, -48559, -48579, -48611, -48611, -48628, -48651, -48657, -48657, -48676, -48676, -48676, -48676, -48683, -48689, -48722, -48729, -48729, -48736, -48749, -48765, +48456, +48479, +48479, +48485, +48492, +48498, +48498, +48498, +48523, +48560, +48581, +48597, +48597, +48597, +48624, +48624, +48652, +48665, +48705, +48705, +48712, +48726, +48726, +48726, +48760, +48760, +48770, +48770, +48770, +48770, +48770, +48770, +48770, +48770, +48770, +48770, +48779, +48786, +48786, 48786, -48802, -48802, -48802, -48832, -48853, -48869, -48888, -48888, -48895, -48922, -48922, -48922, -48922, -48943, -48943, -48956, -48973, -48973, -48986, -48992, -49006, -49045, -49064, +48797, +48811, +48820, +48820, +48820, +48836, +48836, +48842, +48871, +48894, +48894, +48894, +48894, +48894, +48911, +48935, +48935, +48935, +48968, +48979, +48994, +49007, +49019, +49040, +49051, 49071, -49080, -49116, -49123, -49130, -49137, -49172, -49193, -49193, -49193, -49193, -49210, -49217, -49224, -49261, -49261, -49285, -49310, -49327, -49343, -49350, -49371, -49371, +49079, +49079, +49096, +49106, +49106, +49128, +49138, +49138, +49138, +49150, +49150, +49159, +49219, +49262, +49262, +49300, +49300, +49300, +49331, +49337, +49347, +49347, +49347, +49368, +49368, +49368, +49368, +49368, 49378, -49385, -49392, -49392, -49428, -49448, -49464, -49512, -49542, -49549, -49556, -49562, -49594, -49623, -49630, -49674, -49674, -49699, +49378, +49378, +49387, +49403, +49412, +49412, +49422, +49441, +49474, +49498, +49498, +49498, +49514, +49514, +49524, +49524, +49535, +49535, +49546, +49546, +49551, +49602, +49602, +49609, +49613, +49624, +49624, +49624, +49624, +49641, +49648, +49648, +49648, +49675, +49692, +49692, +49709, +49724, 49739, -49752, -49775, -49775, -49775, -49793, -49803, -49819, -49819, -49819, -49828, -49846, +49770, +49770, +49770, +49770, +49770, +49786, +49825, +49825, +49825, +49834, +49853, +49853, 49860, -49860, -49867, -49888, -49895, -49909, -49941, -49947, -49947, -50014, -50030, -50036, -50036, -50036, -50049, -50071, -50097, -50136, -50143, -50158, -50158, -50165, -50165, -50183, -50196, +49875, +49891, +49914, +49924, +49924, +49939, +49949, +49960, +49970, +49970, +49980, +49994, +50001, +50013, +50039, +50039, +50039, +50065, +50081, +50114, +50142, +50169, +50180, +50180, 50203, 50203, -50210, -50237, -50248, +50220, +50220, +50229, +50236, +50236, 50266, -50280, -50293, -50307, +50275, +50295, 50307, -50307, -50307, -50346, +50340, 50359, -50390, -50412, -50440, -50440, -50440, -50446, -50462, -50462, -50478, -50486, -50486, -50494, -50498, -50552, -50569, -50569, -50569, -50569, -50569, -50569, -50591, -50604, -50604, -50611, -50618, -50642, -50684, -50720, -50720, -50750, -50754, -50754, -50784, -50784, -50817, -50832, -50858, -50874, -50874, -50919, -50955, -50955, -50962, -50962, -50992, -51013, -51013, -51020, -51046, -51056, -51115, -51122, -51152, -51189, -51189, -51196, -51203, -51203, -51217, -51217, -51217, -51265, -51304, -51327, -51347, -51360, -51371, -51386, -51386, -51411, -51452, -51452, -51452, -51459, -51484, -51491, -51491, -51491, -51491, -51510, -51510, +50359, +50374, +50374, +50387, +50387, +50387, +50387, +50387, +50387, +50409, +50414, +50423, +50423, +50449, +50449, +50449, +50459, +50482, +50499, +50499, +50514, +50522, +50522, +50522, +50540, +50558, +50565, +50574, +50574, +50620, +50620, +50620, +50624, +50633, +50633, +50653, +50665, +50673, +50673, +50700, +50700, +50700, +50713, +50713, +50713, +50740, +50748, +50767, +50767, +50767, +50775, +50781, +50789, +50803, +50803, +50803, +50803, +50803, +50810, +50810, +50821, +50827, +50839, +50876, +50893, +50893, +50910, +50942, +50960, +50960, +50984, +50984, +50991, +50991, +51025, +51043, +51058, +51073, +51077, +51077, +51092, +51092, +51113, +51144, +51160, +51172, +51188, +51198, +51198, +51208, +51221, +51231, +51235, +51235, +51255, +51271, +51288, +51288, +51288, +51307, +51307, +51318, +51318, +51318, +51338, +51338, +51349, +51349, +51364, +51375, +51375, +51416, +51416, +51416, +51416, +51416, +51437, +51437, +51457, +51470, +51470, +51470, +51486, +51501, 51521, -51565, -51581, -51588, -51601, -51620, -51620, -51635, -51666, -51683, -51690, -51718, -51718, -51718, -51757, -51779, -51779, -51779, -51779, -51779, -51779, -51809, -51814, -51820, -51842, -51886, -51900, -51900, -51900, -51900, -51900, -51910, -51927, -51927, -51945, -51962, -51968, -51974, -51974, -51980, -51980, -51980, -51980, -52001, -52011, -52011, -52025, -52025, -52025, -52039, -52071, -52096, -52096, -52096, -52096, -52102, -52119, -52119, -52119, -52119, -52125, -52153, -52164, -52164, -52164, -52195, -52207, -52223, -52255, +51531, +51548, +51548, +51558, +51576, +51611, +51611, +51611, +51632, +51670, +51682, +51695, +51717, +51717, +51717, +51717, +51732, +51743, +51743, +51758, +51765, +51765, +51782, +51812, +51812, +51812, +51812, +51828, +51828, +51828, +51845, +51845, +51851, +51851, +51908, +51923, +51923, +51923, +51932, +51953, +51953, +51969, +52002, +52002, +52056, +52072, +52072, +52072, +52092, +52137, +52145, +52145, +52145, +52163, +52183, +52219, +52219, +52227, +52256, +52267, +52267, +52276, 52276, 52276, -52299, -52305, -52305, -52320, -52320, -52359, -52373, -52389, -52389, -52396, -52401, -52401, +52295, +52363, +52375, +52375, +52395, +52395, 52414, 52414, -52420, -52432, -52432, -52432, -52449, -52449, -52456, -52466, -52466, +52414, +52429, +52429, +52429, +52445, +52471, 52471, 52471, -52478, -52478, -52478, -52507, -52507, -52507, -52519, -52537, -52537, -52537, -52537, -52556, -52569, -52569, -52569, -52585, -52594, -52594, -52631, -52652, -52680, -52695, -52710, -52745, -52745, -52745, -52758, -52764, +52471, +52492, +52492, +52510, +52530, +52530, +52530, +52538, +52555, +52555, +52579, +52587, +52587, +52587, +52644, +52644, +52644, +52644, +52644, +52654, +52654, +52667, +52690, +52690, +52702, +52727, +52727, +52755, +52773, +52778, 52778, -52789, -52805, -52805, -52821, -52842, -52855, -52855, -52896, -52896, -52928, -52928, -52941, -52947, -52947, -52960, -52960, -52990, -53004, +52790, +52810, +52826, +52826, +52826, +52826, +52834, +52848, +52848, +52848, +52856, +52875, +52885, +52895, +52895, +52895, +52895, +52908, +52908, +52959, +52963, +52963, +52988, +52993, 53014, -53020, -53020, -53020, -53020, -53034, -53073, -53084, -53084, -53100, -53100, -53100, -53115, -53123, -53148, -53178, -53188, -53202, -53202, -53218, -53218, -53228, -53251, -53256, -53262, -53262, -53262, -53282, -53299, +53014, +53056, +53080, +53111, +53111, +53118, +53118, +53134, +53161, +53161, +53161, +53172, +53172, +53194, +53208, +53208, +53208, +53233, +53233, +53233, +53240, +53240, +53247, +53274, +53296, +53321, +53321, +53338, 53338, -53358, -53358, -53431, -53436, -53436, -53456, -53504, -53504, -53517, -53531, -53574, -53583, -53619, -53631, -53631, -53631, -53631, -53640, -53670, -53670, -53718, -53718, +53355, +53362, +53369, +53376, +53393, +53393, +53393, +53393, +53400, +53412, +53426, +53437, +53460, +53467, +53509, +53509, +53509, +53532, +53532, +53542, +53588, +53593, +53600, +53600, +53615, +53615, +53615, +53630, +53637, +53637, +53653, +53667, +53674, +53674, +53681, +53681, +53681, 53728, -53733, -53749, -53774, -53774, -53811, -53811, +53735, +53740, +53748, +53772, +53783, +53791, +53791, +53791, +53791, +53791, +53804, 53822, -53835, -53842, -53882, +53831, +53861, +53861, +53861, +53879, +53893, +53899, +53899, +53899, 53903, -53919, -53932, -53942, -53942, -53951, -53978, -54001, -54015, -54015, -54015, -54015, -54024, -54024, -54031, -54067, -54081, -54081, -54081, -54086, -54086, -54105, -54132, -54132, -54132, +53903, +53914, +53924, +53924, +53924, +53924, +53946, +53975, +53988, +53988, +54008, +54008, +54016, +54033, +54054, +54094, +54123, 54140, 54140, -54178, -54178, -54178, -54192, -54192, -54209, -54231, -54258, +54147, +54147, +54180, +54180, +54198, +54198, +54217, +54217, +54234, +54241, +54251, 54258, -54280, -54287, -54293, -54308, -54308, -54315, +54300, +54300, +54307, +54307, 54332, 54332, -54346, -54379, -54379, -54421, -54444, -54467, -54481, -54481, -54497, -54529, -54555, -54555, -54597, -54614, -54620, -54635, -54635, -54635, -54652, -54664, -54664, -54724, -54752, -54752, -54762, -54778, -54788, -54788, -54796, -54835, -54848, -54848, -54864, -54914, -54940, -54940, -54945, -54957, -54966, -54966, -54966, -54966, -54988, -54988, -54988, -55008, -55008, -55008, -55014, -55014, -55030, -55044, +54339, +54356, +54370, +54380, +54380, +54380, +54380, +54380, +54380, +54384, +54405, +54438, +54459, +54480, +54480, +54487, +54494, +54528, +54538, +54552, +54552, +54552, +54552, +54568, +54585, +54595, +54624, +54624, +54637, +54644, +54644, +54644, +54644, +54657, +54657, +54677, +54677, +54684, +54684, +54697, +54697, +54712, +54739, +54749, +54773, +54793, +54802, +54827, +54834, +54841, +54841, +54873, +54882, +54901, +54941, +54948, +54963, +54970, +54986, +54986, +55001, +55029, +55035, +55065, 55072, -55072, -55102, -55102, -55102, -55130, -55137, -55137, -55137, -55137, -55137, -55156, -55168, -55168, -55181, -55226, -55226, -55233, -55246, -55246, -55256, -55256, -55261, -55261, -55261, -55282, -55298, -55314, -55321, -55330, -55339, +55089, +55111, +55124, +55143, +55143, +55143, +55150, +55150, +55189, +55196, +55216, +55245, +55252, +55252, +55272, +55272, +55332, 55339, -55350, -55368, -55381, -55401, -55412, -55412, -55412, -55412, -55412, -55430, -55440, -55461, -55461, -55474, -55518, -55537, -55537, -55553, -55571, -55571, -55615, -55622, -55622, -55622, -55634, -55650, -55650, -55685, -55691, -55691, -55691, -55697, -55734, -55734, +55363, +55396, +55410, +55433, +55447, +55454, +55458, +55458, +55487, +55487, +55497, +55497, +55497, +55544, +55544, +55548, +55562, +55568, +55568, +55568, +55568, +55585, +55585, +55585, +55604, +55604, +55619, +55625, +55632, +55632, +55671, +55671, +55684, +55684, +55684, +55709, +55717, +55727, 55734, +55769, 55801, -55813, -55844, -55857, -55863, -55876, -55890, -55924, +55815, +55837, +55848, +55855, +55871, +55885, +55905, +55926, +55926, 55942, -55949, -55970, -55970, -55970, -55970, -55990, -56006, -56006, -56029, -56038, -56050, -56057, -56057, -56073, -56073, -56073, -56073, -56073, -56085, -56085, -56108, -56108, -56108, -56141, -56155, -56168, +55942, +55973, +55973, +55973, +55973, +55979, +56020, +56033, +56033, +56047, +56054, +56072, +56089, +56096, +56103, +56130, +56146, +56146, +56153, 56179, -56186, -56204, -56245, -56257, -56257, -56257, -56274, -56304, -56341, -56341, -56341, -56367, -56405, -56405, -56405, -56405, -56443, -56443, -56463, -56482, -56492, -56522, -56539, -56539, -56539, -56546, -56553, -56586, -56605, -56612, -56631, -56631, -56631, -56649, -56649, -56670, -56684, -56684, -56733, -56769, -56769, -56779, -56807, -56823, -56839, -56870, -56870, -56870, -56870, -56886, -56886, -56886, -56886, -56886, -56908, -56908, -56964, -56964, -56970, -56982, -57001, -57001, -57001, -57010, -57032, -57039, -57039, -57070, -57080, -57088, -57095, -57095, -57112, -57112, -57131, -57141, -57161, -57193, -57193, -57204, -57221, -57221, -57221, -57221, -57221, -57231, -57241, -57271, -57298, -57310, -57321, -57321, -57321, -57336, -57336, -57342, -57349, -57349, -57349, -57349, -57349, -57349, -57366, -57397, -57406, -57437, -57437, -57456, -57511, -57527, -57548, -57564, -57564, -57564, -57586, -57586, -57611, -57627, -57649, -57656, -57708, -57708, -57708, -57708, -57728, -57728, -57747, -57747, -57747, -57756, -57772, -57784, -57784, -57784, -57806, -57854, -57861, -57876, -57882, -57882, -57882, -57890, -57911, -57911, -57911, -57918, -57918, -57936, -57936, -57936, -57936, -57942, -57942, -57942, -57942, -57947, -57947, -57947, -57954, +56183, +56202, +56216, +56226, +56260, +56287, +56300, +56307, +56345, +56359, +56376, +56390, +56410, +56417, +56435, +56442, +56462, +56462, +56480, +56514, +56521, +56521, +56521, +56528, +56558, +56565, +56626, +56646, +56685, +56692, +56718, +56741, +56741, +56768, +56804, +56821, +56821, +56851, +56904, +56911, +56918, +56925, +56940, +56962, +56977, +56984, +56999, +57019, +57019, +57019, +57037, +57049, +57049, +57083, +57083, +57115, +57115, +57152, +57178, +57178, +57209, +57223, +57244, +57244, +57244, +57244, +57273, +57280, +57287, +57287, +57332, +57368, +57368, +57375, +57375, +57375, +57412, +57412, +57418, +57433, +57433, +57452, +57462, +57462, +57469, +57476, +57485, +57499, +57544, +57551, +57551, +57561, +57568, +57577, +57593, +57593, +57606, +57606, +57633, +57633, +57644, +57644, +57659, +57659, +57689, +57710, +57718, +57725, +57725, +57725, +57732, +57732, +57732, +57732, +57745, +57767, +57774, +57809, +57809, +57809, +57829, +57880, +57915, +57927, 57954, -57978, -57978, -58000, -58006, -58013, -58013, -58013, -58027, -58076, -58093, -58093, -58093, -58099, -58099, -58107, -58118, -58158, -58158, -58173, -58181, -58187, -58194, -58194, -58215, -58240, -58240, -58240, -58240, -58256, -58256, -58256, -58263, -58282, -58290, -58290, +58002, +58009, +58009, +58021, +58035, +58042, +58049, +58069, +58084, +58105, +58105, +58122, +58122, +58140, +58177, +58195, +58199, +58220, +58239, +58252, +58252, +58252, +58291, 58312, 58312, -58312, -58317, -58317, -58317, 58333, -58345, -58345, -58361, -58361, -58387, -58414, -58438, +58351, +58398, +58409, +58409, +58409, +58409, +58416, +58446, 58446, -58467, -58467, -58482, -58482, -58512, -58512, -58512, -58520, -58542, -58569, -58598, -58607, -58626, -58647, -58666, -58688, -58688, -58688, -58697, -58703, -58703, -58703, -58703, -58721, -58742, -58794, +58453, +58469, +58476, +58509, +58509, +58509, +58509, +58509, +58529, +58555, +58571, +58587, +58587, +58587, +58587, +58594, +58594, +58628, +58635, +58668, +58668, +58693, +58700, +58707, +58761, +58789, +58789, 58829, -58847, -58866, -58866, -58874, -58880, -58880, -58887, -58887, -58900, -58900, -58900, -58928, +58854, +58854, +58871, +58878, +58886, +58893, +58931, +58938, 58945, -58945, -58963, -58963, -58963, -58985, -58985, -58991, -59011, -59062, -59062, -59062, -59062, -59062, -59062, -59095, -59115, -59138, -59138, -59138, -59155, +58952, +58970, +58984, +59013, +59038, +59045, +59068, +59077, +59077, +59086, +59086, +59086, +59086, +59112, +59151, +59151, 59166, 59166, -59202, -59202, -59202, -59211, -59218, -59224, +59166, +59166, +59166, +59194, 59224, 59224, -59242, -59242, -59268, -59268, -59308, -59314, -59326, -59326, -59340, -59340, -59345, -59368, -59373, -59373, -59412, -59412, -59435, -59435, -59435, -59435, -59455, -59466, +59247, +59247, +59247, +59259, +59283, +59283, +59283, +59283, +59290, +59297, +59330, +59349, +59362, +59374, +59437, +59449, +59459, 59466, -59466, -59481, -59481, -59481, -59481, -59500, -59517, -59517, -59549, -59555, -59555, -59555, -59568, -59595, -59615, -59631, -59631, -59631, -59631, +59488, +59494, +59511, +59537, +59560, +59574, +59598, +59611, +59634, +59634, 59641, 59641, -59654, -59678, -59678, -59694, -59700, -59700, -59700, -59700, -59700, -59714, -59721, +59641, +59641, +59652, +59663, +59663, +59679, +59679, +59685, 59721, -59740, -59749, -59765, -59765, -59784, -59784, +59727, +59727, +59727, +59741, +59760, +59771, +59810, 59822, -59822, -59867, -59878, -59890, -59890, -59925, -59925, -59925, -59925, -59925, -59942, -59942, -59964, -59964, -59964, -59978, -59985, -59997, -60010, -60010, -60055, -60091, -60101, -60101, -60108, -60114, -60139, -60139, -60139, -60156, -60156, -60156, -60163, -60163, -60169, -60175, -60181, -60181, -60181, -60187, -60195, -60215, -60215, -60215, -60215, -60234, -60234, -60234, -60244, -60284, -60290, -60305, -60305, -60317, -60380, -60388, -60388, -60393, -60400, -60400, -60400, -60400, -60407, -60407, -60407, -60407, -60431, -60450, -60460, -60512, -60522, -60532, -60532, -60552, -60560, -60560, -60560, -60594, -60594, -60607, -60615, -60615, -60615, -60628, -60628, -60649, -60655, -60663, -60675, +59831, +59850, +59856, +59880, +59923, +59966, +59973, +59987, +60006, +60041, +60041, +60070, +60103, +60119, +60131, +60136, +60152, +60184, +60191, +60220, +60228, +60253, +60253, +60280, +60303, +60303, +60310, +60345, +60345, +60372, +60395, +60406, +60430, +60454, +60461, +60486, +60497, +60504, +60511, +60528, +60535, +60535, +60535, +60556, +60556, +60563, +60581, +60599, +60599, +60616, +60636, +60636, +60668, +60690, +60690, 60697, -60713, -60731, +60716, +60723, 60747, -60754, -60761, -60761, -60778, -60778, -60778, -60778, -60782, -60793, -60811, -60811, -60848, -60874, -60904, -60904, -60910, +60759, +60771, +60785, +60792, +60792, +60792, +60815, +60829, +60849, +60849, +60849, +60849, +60859, +60870, +60911, 60929, -60944, -60959, -60977, -60984, -60992, -60992, -61013, -61019, -61045, -61045, -61049, -61061, -61061, -61061, -61061, -61069, -61089, -61115, -61138, -61148, -61165, -61182, -61203, -61241, -61295, -61295, -61295, -61295, -61308, -61335, -61335, -61335, -61335, -61358, -61406, -61410, +60929, +60947, +60947, +60947, +60947, +60947, +60947, +60947, +60974, +60974, +60974, +60991, +61014, +61025, +61025, +61025, +61062, +61074, +61074, +61074, +61080, +61096, +61112, +61112, +61136, +61136, +61136, +61147, +61154, +61154, +61176, +61176, +61199, +61209, +61224, +61224, +61231, +61246, +61246, +61246, +61266, +61266, +61273, +61294, +61312, +61312, +61332, +61332, +61354, +61371, +61378, +61378, +61378, 61410, -61418, -61418, -61418, -61418, -61424, -61424, -61424, -61424, -61438, -61452, -61497, -61505, -61505, -61529, -61554, -61575, -61581, -61581, -61615, -61623, +61417, +61433, +61433, +61455, +61489, +61489, +61501, +61501, +61513, +61513, +61547, +61547, +61547, +61558, +61558, +61578, +61584, +61598, +61598, +61598, +61598, +61598, +61598, +61627, +61635, +61635, +61635, 61663, 61663, -61677, -61677, -61686, -61686, -61698, -61698, -61698, -61705, -61705, -61705, -61705, -61714, -61714, -61745, -61755, -61761, -61779, -61807, -61807, -61817, -61817, -61855, -61872, -61872, -61872, -61872, -61872, -61872, -61878, -61905, -61905, -61905, -61905, -61930, -61943, -61943, -61949, +61669, +61687, +61687, +61687, +61706, +61723, +61803, +61803, +61803, +61813, +61823, +61842, +61842, +61870, +61870, +61926, +61926, +61926, +61944, 61970, -61982, -61982, -61982, -61982, -61993, -61993, -62005, -62036, -62036, -62055, -62076, -62076, -62091, +61980, +61980, +61980, +61985, +62001, +62007, +62007, +62035, +62052, +62067, +62081, +62081, +62081, +62081, +62087, +62118, +62118, 62124, -62134, -62134, -62140, -62161, +62142, +62149, +62149, 62181, -62193, -62236, -62243, -62261, -62261, -62297, -62297, -62308, -62317, -62317, -62331, -62356, -62356, -62417, -62452, -62452, -62452, -62467, -62467, -62467, -62477, -62477, -62486, -62486, -62510, -62510, -62518, -62548, -62548, -62567, -62567, -62567, -62580, -62580, -62580, -62586, -62593, -62613, -62613, -62628, -62669, -62697, -62697, -62697, +62209, +62209, +62209, +62209, +62225, +62225, +62225, +62232, +62268, +62286, +62320, +62320, +62320, +62320, +62320, +62320, +62320, +62335, +62335, +62343, +62379, +62425, +62425, +62442, +62442, +62474, +62484, +62530, +62555, +62555, +62582, +62582, +62608, +62608, +62621, +62621, +62631, +62681, +62681, 62697, 62697, -62718, -62718, -62718, -62718, -62718, -62741, -62771, -62797, -62827, -62847, -62847, -62847, -62847, -62901, -62901, -62901, -62901, -62901, -62915, -62915, -62926, -62940, -62940, -62940, -62948, -62954, -62954, -62960, -62975, -62975, +62723, +62753, +62774, +62774, +62774, +62774, +62774, +62820, +62829, +62829, +62837, +62841, +62841, +62849, +62849, +62857, +62857, +62925, +62931, +62931, +62937, +62966, +62978, 62987, -63007, -63007, -63044, -63044, -63065, -63065, -63081, -63081, -63100, -63120, -63133, -63150, -63150, -63167, -63167, -63187, -63227, -63227, -63227, -63227, -63227, -63227, -63256, -63273, -63277, -63291, -63297, -63297, -63297, -63297, -63315, -63351, -63368, -63397, -63397, -63397, -63397, -63409, -63437, -63437, -63437, -63444, -63444, -63444, -63489, -63522, -63522, -63522, -63538, -63554, -63554, -63554, -63569, -63576, -63576, -63606, -63615, -63626, -63646, -63670, -63670, -63670, -63696, -63710, -63730, -63742, -63757, -63766, -63792, -63807, -63807, -63828, +62993, +63002, +63016, +63052, +63097, +63101, +63123, +63152, +63175, +63202, +63208, +63214, +63214, +63214, +63214, +63231, +63231, +63239, +63286, +63321, +63333, +63333, +63348, +63348, +63348, +63355, +63355, +63359, +63372, +63394, +63394, +63394, +63410, +63410, +63417, +63417, +63417, +63452, +63469, +63501, +63501, +63511, +63520, +63530, +63530, +63530, +63530, +63543, +63558, +63558, +63574, +63574, +63591, +63613, +63625, +63645, +63645, +63663, +63663, +63675, +63687, +63687, +63687, +63687, +63715, +63731, +63737, +63737, +63737, +63741, +63759, +63759, +63759, +63769, +63769, +63769, +63769, +63769, +63794, +63810, +63841, 63849, 63849, -63856, -63876, -63910, +63849, +63849, +63849, +63862, +63862, +63862, +63880, +63886, +63901, +63914, +63928, 63928, -63945, -63961, -63961, -63982, -64042, -64050, -64066, -64071, -64089, -64099, -64099, -64129, -64150, -64150, -64168, -64168, -64168, -64168, -64168, -64214, -64231, +63955, +63962, +63969, +63981, +63981, +63981, +63981, +63981, +63999, +64014, +64014, +64033, +64048, +64048, +64059, +64059, +64059, +64059, +64108, +64108, +64108, +64108, +64117, +64127, +64158, +64158, +64158, +64178, +64190, +64215, 64241, 64241, -64250, -64294, -64294, -64294, -64326, -64355, -64366, -64386, -64386, -64386, -64408, -64408, -64426, -64458, -64458, -64492, -64492, -64498, -64537, -64555, -64573, -64573, -64622, -64642, -64651, -64651, -64659, -64659, -64683, -64683, -64683, -64718, -64718, -64735, -64735, -64741, -64741, -64745, -64745, -64771, -64771, -64771, -64771, -64792, -64800, -64825, -64825, -64825, -64850, -64868, -64868, -64886, -64886, -64897, -64897, -64904, -64909, -64945, -64945, -64965, -64982, -65005, -65005, -65044, -65068, -65082, -65090, -65090, -65113, -65125, -65134, -65151, -65172, -65184, -65211, -65211, -65221, -65277, -65284, -65290, -65290, -65290, +64241, +64241, +64263, +64291, +64295, +64295, +64307, +64307, +64307, +64307, +64307, +64307, +64311, +64352, +64352, +64352, +64368, +64368, +64368, +64412, +64412, +64434, +64443, +64443, +64456, +64456, +64456, +64469, +64514, +64514, +64514, +64514, +64514, +64522, +64522, +64522, +64544, +64578, +64608, +64633, +64644, +64672, +64700, +64716, +64742, +64755, +64755, +64765, +64793, +64846, +64856, +64856, +64879, +64885, +64896, +64896, +64924, +64928, +64928, +64938, +64971, +64971, +64977, +65007, +65019, +65019, +65034, +65073, +65073, +65091, +65091, +65091, +65101, +65101, +65101, +65112, +65146, +65167, +65178, +65178, +65192, +65208, +65227, +65227, +65227, +65227, +65227, +65227, +65227, +65227, +65227, +65271, +65286, 65290, -65301, -65362, -65380, -65380, -65400, -65411, -65437, -65437, -65437, -65450, -65458, -65458, -65458, -65458, -65483, -65483, -65496, +65324, +65348, +65358, +65412, +65412, +65412, +65419, +65423, +65459, +65466, +65489, 65496, -65528, -65542, -65568, -65568, -65578, -65578, -65578, -65610, -65610, -65618, -65641, -65664, -65664, -65664, -65664, -65693, -65693, -65693, -65716, -65743, -65760, -65760, -65760, -65767, -65771, -65781, -65811, -65816, -65836, -65836, -65857, -65868, -65880, -65880, -65880, -65886, -65904, -65904, -65919, -65919, -65947, -65951, -65958, -65962, -65972, -65989, -65989, -65989, -65993, -66011, -66011, +65502, +65512, +65538, +65547, +65551, +65585, +65601, +65601, +65612, +65632, +65651, +65657, +65657, +65669, +65669, +65675, +65679, +65701, +65701, +65730, +65756, +65756, +65770, +65789, +65789, +65789, +65818, +65818, +65851, +65851, +65865, +65869, +65879, +65879, +65911, +65911, +65917, +65917, +65936, +65959, +65965, +65965, +65965, +65965, +65990, +66019, 66036, -66073, -66073, -66079, -66095, -66095, -66124, -66136, -66136, -66154, -66172, -66176, -66176, -66185, -66185, -66185, -66198, -66198, -66236, -66250, -66255, -66277, -66277, -66277, -66291, -66313, -66332, -66352, -66352, -66356, -66378, -66384, -66384, -66399, -66399, -66434, -66444, -66444, -66444, -66486, -66501, -66546, -66556, -66589, -66589, -66589, -66596, -66596, -66607, -66618, -66644, -66672, -66672, -66672, -66686, -66686, -66705, -66705, -66705, -66723, -66733, -66733, -66741, -66764, -66785, -66810, -66810, -66841, -66841, -66841, -66849, -66857, -66857, -66857, -66867, -66885, -66885, +66068, +66076, +66090, +66108, +66130, +66130, +66166, +66184, +66204, +66204, +66217, +66217, +66228, +66228, +66228, +66247, +66247, +66278, +66311, +66316, +66335, +66350, +66368, +66382, +66382, +66382, +66382, +66382, +66382, +66386, +66402, +66408, +66408, +66418, +66422, +66470, +66470, +66491, +66521, +66548, +66548, +66555, +66574, +66581, +66581, +66593, +66593, +66600, +66610, +66636, +66657, +66675, +66675, +66675, +66687, +66721, +66751, +66760, +66781, +66798, +66798, +66811, +66811, +66811, +66819, +66819, +66830, +66830, +66853, +66869, 66893, -66899, -66919, -66927, -66944, -66954, -66954, -66961, -66993, -66993, -67008, -67022, -67064, -67068, -67089, -67089, -67093, -67106, +66893, +66893, +66893, +66900, +66918, +66940, +66950, +66959, +66959, +66965, +67016, +67023, +67047, +67047, +67062, +67069, 67106, -67121, -67121, -67125, 67136, -67145, -67145, -67161, -67161, -67161, -67191, -67191, -67191, -67200, -67200, -67209, -67209, -67209, -67209, -67223, -67223, -67223, -67223, -67223, -67223, -67223, -67237, -67237, -67287, -67287, -67294, -67294, -67294, -67294, -67294, +67167, +67177, +67212, +67230, +67230, +67249, +67279, +67285, 67312, -67338, -67338, -67338, -67354, -67376, -67387, -67392, -67407, -67407, -67432, -67472, -67483, -67526, -67526, +67330, +67351, +67358, +67374, +67394, +67441, +67473, +67513, +67524, +67524, +67545, +67565, +67573, 67584, -67605, -67625, -67633, -67649, -67659, -67659, -67659, -67659, -67675, -67712, -67746, -67764, -67764, -67795, -67795, -67799, -67808, -67808, -67817, -67829, -67829, -67836, -67856, -67874, -67874, -67884, -67907, -67907, -67912, -67912, -67936, -67936, -67951, -67969, -67975, -67984, -67984, -67984, -67984, -67984, -68010, -68010, -68016, -68037, -68044, -68044, -68053, -68072, -68078, -68078, -68078, -68078, -68078, -68078, -68091, -68091, -68091, +67619, +67637, +67637, +67657, +67684, +67684, +67684, +67684, +67684, +67713, +67721, +67733, +67733, +67733, +67739, +67745, +67745, +67750, +67750, +67787, +67787, +67806, +67827, +67837, +67872, +67872, +67872, +67898, +67916, +67922, +67922, +67944, +67953, +67996, +67996, +68023, +68023, +68038, +68038, +68038, +68074, 68100, 68100, -68110, -68117, 68125, 68125, -68125, -68157, +68141, 68157, 68157, -68173, -68173, -68218, -68218, -68248, -68288, -68288, -68288, -68310, -68310, -68343, -68343, -68382, -68402, -68402, -68427, -68450, -68461, -68468, -68493, -68542, -68542, -68573, -68591, -68591, -68591, -68598, -68616, -68634, -68634, -68634, -68634, -68634, -68663, -68682, -68695, -68711, -68733, -68769, -68769, -68804, -68804, -68815, -68821, -68842, -68842, -68868, -68868, -68868, -68868, -68868, -68868, -68868, -68884, -68884, -68884, -68888, -68888, -68888, -68888, -68926, -68926, -68940, -68962, -68962, -68979, -68998, -69014, -69020, -69020, -69039, -69039, -69045, -69073, -69073, -69073, -69073, -69077, -69077, -69077, -69093, -69099, -69099, -69099, -69107, -69138, -69138, -69146, -69146, -69180, -69180, -69213, -69222, -69222, -69245, +68177, +68216, +68221, +68256, +68256, +68262, +68285, +68285, +68301, +68301, +68301, +68312, +68312, +68332, +68332, +68381, +68403, +68409, +68432, +68432, +68445, +68465, +68471, +68471, +68488, +68515, +68515, +68539, +68539, +68552, +68569, +68594, +68594, +68609, +68648, +68704, +68710, +68730, +68737, +68737, +68750, +68760, +68766, +68794, +68794, +68794, +68794, +68794, +68810, +68810, +68825, +68839, +68839, +68860, +68893, +68893, +68893, +68922, +68922, +68922, +68927, +68927, +68927, +68944, +68944, +68944, +68944, +68944, +68944, +68960, +68970, +68985, +69001, +69001, +69007, +69028, +69028, +69042, +69042, +69048, +69076, +69076, +69095, +69124, +69131, +69155, +69162, +69162, +69176, +69184, +69184, +69184, +69184, +69230, 69254, -69276, -69286, -69286, -69286, -69326, -69344, -69378, -69396, -69396, -69408, -69408, -69445, -69445, -69456, -69469, -69469, -69477, +69261, +69267, +69267, +69273, +69292, +69298, +69335, +69356, +69356, +69361, +69367, +69367, +69367, +69367, +69382, +69402, +69421, +69434, +69455, +69467, +69479, 69485, -69513, -69526, -69526, -69536, -69569, -69569, -69614, -69632, +69493, +69505, +69511, +69556, +69586, +69595, +69605, +69605, +69605, +69621, +69634, +69634, +69648, +69648, +69652, +69652, 69658, -69668, -69668, -69693, -69732, -69740, -69756, -69772, -69772, -69779, -69779, -69779, -69779, -69779, -69800, -69815, -69819, -69819, -69846, -69852, -69941, -69962, -69962, -69962, -69962, -69962, -69962, -69962, -69962, -69982, -70001, -70012, -70031, -70038, -70038, -70046, -70069, -70069, -70094, -70128, -70128, -70128, -70128, -70128, -70128, -70128, +69678, +69706, +69717, +69717, +69731, +69731, +69731, +69731, +69752, +69766, +69775, +69807, +69814, +69814, +69855, +69859, +69868, +69868, +69874, +69874, +69874, +69874, +69874, +69883, +69900, +69900, +69917, +69934, +69949, +69969, +69969, +69996, +69996, +70014, +70056, +70075, +70097, 70145, -70177, -70177, -70189, -70189, -70189, -70189, -70189, -70219, -70219, -70219, -70219, -70226, -70226, -70245, -70245, -70245, -70245, -70253, -70253, -70253, -70279, -70279, -70279, -70279, -70279, -70279, -70311, -70349, -70356, -70386, -70386, -70424, -70424, -70466, -70466, -70494, -70523, -70541, -70550, -70568, -70583, -70592, -70592, -70592, -70592, -70631, -70656, -70676, -70676, -70696, -70696, -70703, +70145, +70168, +70182, +70193, +70209, +70209, +70233, +70233, +70240, +70240, +70240, +70247, +70280, +70295, +70295, +70321, +70351, +70357, +70364, +70384, +70397, +70409, +70413, +70413, +70421, +70430, +70446, +70446, +70446, +70461, +70461, +70461, +70478, +70478, +70484, +70490, +70490, +70490, +70504, +70509, +70509, +70522, +70522, +70522, +70532, +70532, +70532, +70539, +70546, +70574, +70604, +70634, +70649, +70649, +70663, +70669, +70669, +70681, +70681, +70681, +70698, +70698, +70710, +70710, +70710, 70710, 70710, -70716, -70730, -70730, -70769, -70769, -70769, -70786, -70804, -70804, -70821, -70832, -70832, -70844, -70844, -70891, -70891, +70710, +70731, +70744, +70761, +70783, +70783, +70783, +70783, +70790, +70790, +70800, +70835, +70835, +70835, +70851, +70851, +70851, +70856, +70856, +70864, +70864, +70864, +70864, +70879, +70879, +70879, +70898, +70904, 70904, -70944, -70951, -70951, -70961, -70961, -70990, -71009, -71025, -71032, -71045, -71045, -71052, -71052, -71052, -71052, -71052, -71063, -71073, -71080, -71080, -71119, -71119, -71119, -71155, -71155, -71155, -71155, -71191, -71207, -71207, -71214, -71214, -71214, -71225, -71242, -71248, -71252, -71274, -71307, +70904, +70910, +70910, +70930, +70930, +70941, +70957, +70978, +70988, +71002, +71006, +71020, +71030, +71035, +71056, +71094, +71116, +71116, +71135, +71135, +71147, +71164, +71175, +71195, +71195, +71239, +71257, +71277, +71277, +71291, +71311, +71311, +71311, 71320, -71356, -71356, -71356, -71374, -71374, -71404, -71428, -71459, -71467, -71478, -71478, -71489, -71495, -71505, -71543, -71543, -71565, -71565, -71578, -71638, -71666, -71673, -71688, -71688, -71688, -71700, -71700, -71730, -71742, -71742, -71742, -71754, -71771, +71324, +71331, +71331, +71331, +71337, +71337, +71349, +71362, +71362, +71362, +71362, +71385, +71400, +71409, +71416, +71416, +71416, +71416, +71434, +71454, +71454, +71466, +71466, +71466, +71466, +71493, +71511, +71511, +71547, +71547, +71581, +71581, +71590, +71590, +71590, +71597, +71613, +71613, +71620, +71641, +71645, +71645, +71659, +71659, +71668, +71675, +71681, +71687, +71687, +71704, +71704, +71704, +71704, +71722, +71722, +71765, 71789, -71836, -71841, -71852, -71852, -71885, -71896, -71913, -71913, -71971, -71991, -71991, -72030, -72054, -72054, -72101, -72130, -72130, -72148, +71789, +71814, +71825, +71838, +71855, +71855, +71861, +71891, +71891, +71907, +71928, +71928, +71936, +71983, +71983, +71993, +71998, +71998, +71998, +72033, +72052, +72077, +72089, +72098, +72137, +72137, +72144, +72144, 72148, -72158, -72158, -72158, -72158, -72158, -72158, -72158, -72167, -72184, -72203, -72209, -72209, -72214, -72228, +72166, +72191, +72221, 72238, -72248, -72248, -72248, -72257, -72289, -72289, -72289, -72289, -72295, -72295, -72295, -72295, -72356, -72369, -72369, -72369, -72377, -72414, -72434, -72441, -72459, -72459, -72470, -72477, -72477, -72477, -72477, -72477, +72293, +72326, +72350, +72350, +72375, +72375, +72387, +72400, +72432, +72432, +72456, +72482, 72482, -72486, -72504, -72504, -72527, -72527, -72548, -72548, -72548, -72558, -72564, -72564, -72581, -72581, -72587, -72587, -72612, -72627, -72633, -72633, -72633, -72644, -72660, -72660, -72681, -72702, -72712, -72712, -72732, -72775, -72775, -72775, -72775, -72775, -72775, -72775, -72830, -72839, -72861, -72877, -72894, -72894, -72894, -72894, -72900, -72900, -72931, -72931, -72931, +72502, +72502, +72506, +72506, +72525, +72578, +72585, +72618, +72618, +72632, +72674, +72674, +72683, +72726, +72743, +72743, +72743, +72753, +72761, +72767, +72798, +72832, +72832, +72872, +72886, +72913, +72913, 72943, +72965, 72980, -72991, -73019, -73034, -73056, -73056, -73073, -73086, -73086, -73086, -73086, -73109, -73129, -73139, -73157, -73167, -73167, -73192, -73192, -73209, -73231, -73231, -73247, -73268, -73288, +73003, +73025, +73025, +73025, +73058, +73104, +73119, +73126, +73146, +73146, +73158, +73170, +73186, +73186, +73205, +73218, +73222, +73234, +73251, +73261, +73261, +73261, +73299, +73299, +73299, +73299, 73303, -73324, -73324, -73324, -73331, -73331, -73331, -73367, -73393, -73398, -73429, -73452, -73463, -73463, -73463, -73492, -73492, -73492, -73492, -73515, -73530, -73553, -73563, -73563, -73576, -73576, -73592, -73611, -73645, -73687, -73700, -73700, -73700, -73716, -73758, -73790, -73790, -73804, -73804, -73822, -73822, -73845, +73322, +73343, +73352, +73352, +73357, +73357, +73374, +73382, +73382, +73396, +73402, +73402, +73414, +73441, +73459, +73459, +73488, +73494, +73508, +73508, +73584, +73610, +73610, +73630, +73647, +73647, +73647, +73665, +73703, +73715, +73715, +73715, +73736, +73750, +73762, +73782, +73796, +73824, +73824, +73838, +73838, +73838, +73850, 73862, 73862, -73875, -73919, -73919, -73938, -73938, -73938, -73968, -73968, -73981, -73992, -73992, -73992, -73992, -73992, -74000, -74000, -74005, -74024, -74058, -74074, -74074, -74096, -74144, -74161, -74161, -74161, -74161, -74161, -74169, -74179, -74191, -74204, -74204, -74214, -74225, -74225, -74238, -74279, -74289, -74296, -74320, -74320, -74325, -74325, -74325, -74378, -74426, -74426, -74426, -74473, -74488, -74498, -74498, -74531, -74531, -74531, +73882, +73882, +73882, +73882, +73897, +73918, +73951, +73951, +73951, +73951, +73963, +73973, +73973, +73973, +73983, +73993, +74021, +74021, +74021, +74021, +74021, +74068, +74091, +74104, +74104, +74104, +74104, +74116, +74147, +74147, +74147, +74147, +74159, +74183, +74197, +74209, +74229, +74243, +74243, +74254, +74254, +74254, +74260, +74267, +74267, +74288, +74333, +74350, +74350, +74360, +74365, +74365, +74381, +74393, +74408, +74414, +74414, +74414, +74414, +74464, +74469, +74486, +74515, +74515, +74515, 74531, +74540, +74562, 74572, -74597, -74597, -74597, -74611, +74572, +74572, +74595, +74595, +74601, 74611, -74631, -74645, +74643, 74663, -74674, -74701, -74701, -74707, -74712, -74712, -74712, -74727, -74737, -74746, -74770, -74790, +74716, +74716, +74732, +74732, +74745, +74745, +74760, +74775, +74775, +74792, +74792, +74792, 74803, -74808, -74843, -74854, -74897, -74901, -74901, -74907, -74945, -74945, -74945, -74958, -74978, -74978, -74998, -74998, -75015, -75015, -75015, -75023, -75023, -75023, -75032, -75077, -75077, -75115, -75127, -75127, -75127, -75160, -75166, -75166, -75172, -75172, -75186, -75224, -75224, -75241, -75241, -75241, -75251, -75251, -75257, -75263, -75278, +74803, +74826, +74865, +74870, +74870, +74870, +74870, +74886, +74886, +74890, +74890, +74926, +74926, +74940, +74940, +74954, +74954, +74964, +74976, +74976, +74976, +75000, +75010, +75019, +75044, +75044, +75050, +75059, +75088, +75088, +75128, +75128, +75141, +75153, +75153, +75153, +75153, +75185, +75209, +75221, +75221, +75221, +75233, +75233, +75237, +75237, +75267, 75291, -75335, -75372, -75382, -75398, -75404, -75423, -75438, -75438, -75444, -75444, -75452, -75452, -75458, -75481, -75481, -75481, -75494, -75504, -75510, -75524, -75540, -75540, -75540, -75546, -75552, -75574, -75574, -75614, -75630, -75646, -75652, -75652, -75652, -75692, -75708, -75708, -75724, -75724, -75724, -75724, -75724, -75724, -75729, -75737, -75754, -75754, -75754, -75772, -75772, -75795, -75795, -75820, -75858, -75858, -75875, -75881, -75890, -75890, +75296, +75308, +75328, +75346, +75357, +75369, +75390, +75390, +75462, +75475, +75475, +75475, +75496, +75523, +75523, +75542, +75562, +75580, +75590, +75604, +75604, +75660, +75678, +75678, +75678, +75678, +75690, +75702, +75728, +75751, +75764, +75792, +75805, +75805, +75805, +75805, +75815, +75824, +75824, +75824, +75824, +75833, +75833, +75833, +75833, +75833, +75841, +75851, +75851, +75851, +75851, +75851, +75863, +75863, +75885, +75885, 75900, -75916, -75916, -75925, -75941, -75941, -75960, -75960, -75960, -75960, -75983, -75983, -75983, -75983, -75993, -75993, -75993, -76007, -76028, -76028, -76056, -76056, -76067, -76067, +75912, +75943, +75943, +75962, +75991, +75991, +76016, +76045, +76052, +76052, +76052, +76052, +76065, +76080, 76080, -76100, -76100, -76107, -76107, -76107, -76107, -76107, -76107, -76107, -76116, -76136, -76136, -76136, -76149, -76177, -76193, -76193, -76199, +76080, +76087, +76087, +76108, +76108, +76108, +76108, +76108, +76118, +76129, +76129, +76129, +76169, +76169, +76188, +76188, +76197, +76206, +76216, +76227, +76227, +76227, +76232, +76253, 76253, +76253, +76259, 76259, -76281, -76299, -76349, -76349, -76357, -76362, -76382, -76399, -76405, -76421, +76274, +76295, +76310, +76310, +76326, +76326, +76326, +76344, +76374, +76406, +76406, +76406, 76437, -76442, -76442, -76457, -76480, -76480, -76497, -76514, -76520, -76525, -76535, -76535, -76597, -76597, -76603, -76625, -76625, +76472, +76486, +76493, +76499, +76509, +76530, +76537, +76558, +76568, +76587, +76587, +76587, +76587, +76587, +76617, +76617, +76617, +76617, +76617, +76617, 76625, +76640, 76659, -76679, -76698, -76698, -76698, -76726, -76757, -76780, -76786, -76792, -76792, -76806, -76826, -76846, -76862, -76871, +76678, +76678, +76678, +76693, +76693, +76702, +76734, +76734, +76734, +76734, +76771, +76794, +76808, +76830, +76830, +76830, +76837, +76837, +76837, +76843, +76843, +76861, +76890, +76898, 76906, -76906, -76921, -76921, -76921, -76921, -76921, -76955, -76955, -76968, -76994, -77032, +76913, +76913, +76927, +76927, +76934, +76943, +76943, +76943, +76943, +76959, +76959, +76969, +76969, +76976, +76976, +77017, +77017, +77048, 77048, -77068, -77068, 77073, -77094, -77094, -77094, -77103, -77120, -77120, -77120, -77136, -77136, -77148, -77166, -77185, -77185, -77191, -77191, -77233, -77252, -77252, -77252, -77252, +77073, +77088, +77118, +77118, +77139, +77153, +77153, +77153, +77153, +77178, +77214, +77214, +77214, +77231, +77249, +77258, +77258, +77265, +77284, +77301, +77301, +77301, 77307, -77318, -77318, -77318, -77318, -77324, -77343, -77357, -77357, -77373, -77383, -77389, -77416, -77427, -77444, -77475, -77514, -77514, -77514, -77520, -77520, -77538, -77563, -77572, -77572, -77572, -77572, -77613, -77613, -77633, -77643, -77651, -77667, -77673, -77690, -77690, -77690, -77705, -77723, -77723, -77723, -77744, -77744, -77763, -77801, -77816, -77838, -77838, +77316, +77316, +77316, +77316, +77322, +77322, +77340, +77340, +77346, +77364, +77364, +77371, +77371, +77371, +77371, +77388, +77394, +77394, +77394, +77409, +77409, +77429, +77459, +77459, +77477, +77491, +77491, +77529, +77529, +77546, +77577, +77599, +77604, +77625, +77625, +77631, +77640, +77662, +77675, +77675, +77675, +77688, +77698, +77708, +77708, +77708, +77715, +77731, +77749, +77749, +77753, +77785, +77785, +77785, +77805, +77818, +77818, +77844, 77844, -77856, 77862, -77877, -77889, -77919, -77935, -77940, -77981, -77986, -78016, -78029, -78029, -78029, -78049, -78049, -78049, -78061, -78061, -78080, -78080, -78080, -78080, -78080, -78080, -78089, -78089, -78101, -78101, -78101, -78101, -78121, -78125, -78155, -78155, -78185, -78185, -78209, -78224, -78254, -78282, -78282, -78296, -78314, -78337, -78342, -78371, -78371, -78383, -78393, -78426, -78440, -78440, -78455, -78477, -78486, -78499, -78499, -78507, -78507, -78578, -78584, -78596, -78617, -78659, -78665, -78665, -78705, -78705, -78741, -78778, -78792, -78805, -78805, -78812, -78831, -78831, -78848, -78866, -78911, -78911, -78916, -78935, -78952, -78964, -78979, -78979, -78985, -79017, -79039, -79039, -79066, -79066, -79085, +77886, +77886, +77904, +77915, +77930, +77945, +77945, +77945, +77945, +77961, +77984, +77997, +78011, +78041, +78041, +78058, +78065, +78065, +78072, +78098, +78113, +78127, +78141, +78153, +78183, +78183, +78202, +78202, +78202, +78202, +78202, +78202, +78202, +78202, +78202, +78202, +78231, +78231, +78231, +78273, +78273, +78283, +78341, +78341, +78341, +78341, +78341, +78363, +78363, +78363, +78396, +78413, +78413, +78424, +78445, +78445, +78472, +78522, +78522, +78522, +78539, +78539, +78543, +78558, +78558, +78588, +78592, +78592, +78609, +78609, +78633, +78633, +78646, +78646, +78646, +78654, +78654, +78694, +78694, +78712, +78721, +78742, +78774, +78774, +78774, +78790, +78810, +78828, +78891, +78891, +78903, +78903, +78903, +78903, +78978, +78978, +78993, +78999, +79016, +79048, +79056, +79056, +79086, 79091, -79091, -79110, -79128, -79147, -79147, -79168, -79168, -79224, -79224, -79242, -79242, -79252, -79252, -79252, -79252, -79271, -79291, -79309, -79327, -79327, -79327, -79346, -79375, -79393, +79119, +79125, +79141, +79141, +79150, +79166, +79212, +79232, +79266, +79266, +79266, +79302, +79319, +79335, +79376, 79400, 79400, -79407, -79407, -79417, -79432, -79432, -79432, -79464, -79476, -79476, -79501, -79511, -79518, -79518, -79539, -79547, +79418, +79418, +79418, +79418, +79455, +79455, +79455, +79474, +79503, +79503, +79515, 79569, 79569, -79600, -79610, -79642, -79676, -79713, -79713, -79736, -79736, -79755, -79755, -79755, +79578, +79589, +79589, +79589, +79601, +79601, +79601, +79601, +79625, +79625, +79625, +79646, +79659, +79659, +79665, +79665, +79665, +79688, +79694, +79704, +79716, +79716, +79737, +79737, +79737, +79744, 79755, -79771, -79801, -79801, -79821, -79837, -79848, -79860, -79860, -79867, -79867, -79867, -79867, -79867, -79906, -79933, -79943, -79977, -79993, -80011, -80042, -80060, -80060, -80082, -80101, -80113, -80119, -80155, -80159, -80174, -80174, -80174, -80174, -80174, -80183, -80202, -80214, +79806, +79833, +79843, +79856, +79870, +79887, +79887, +79917, +79917, +79917, +79925, +79925, +79932, +79932, +79950, +79975, +80002, +80002, +80027, +80044, +80044, +80044, +80044, +80044, +80044, +80044, +80044, +80044, +80055, +80074, +80089, +80089, +80089, +80098, +80118, +80126, +80150, +80150, +80198, +80198, +80207, +80207, 80218, -80247, -80259, -80259, -80295, -80295, -80300, -80342, -80342, -80342, -80359, -80359, -80375, -80375, -80402, -80413, -80446, -80446, -80480, -80485, -80504, -80504, -80525, -80529, +80235, +80246, +80246, +80246, +80255, +80276, +80276, +80280, +80306, +80329, +80350, +80360, +80376, +80376, +80396, +80396, +80396, +80396, +80406, +80406, +80415, +80424, +80437, +80461, +80461, +80476, +80503, +80515, +80515, 80533, -80548, -80553, -80565, -80569, -80569, -80605, -80623, -80623, -80623, -80623, -80643, -80684, -80684, -80695, -80695, -80712, -80730, -80737, -80737, -80776, -80776, -80776, -80776, -80776, -80776, -80795, -80795, -80816, -80867, -80881, -80881, -80881, -80896, -80896, -80913, -80913, -80937, -80937, -80947, -80952, -80952, -80952, -80958, -80992, -80992, -81015, -81048, -81063, -81063, -81082, -81089, -81121, -81121, -81121, -81151, -81196, -81201, -81215, -81215, -81244, -81244, -81244, +80559, +80567, +80567, +80567, +80567, +80595, +80595, +80600, +80618, +80618, +80624, +80624, +80624, +80624, +80661, +80661, +80697, +80697, +80697, +80697, +80697, +80714, +80718, +80718, +80725, +80772, +80786, +80805, +80805, +80833, +80882, +80886, +80907, +80907, +80907, +80955, +80955, +80963, +80986, +80986, +81002, +81002, +81025, +81025, +81043, +81066, +81066, +81076, +81081, +81101, +81117, +81146, +81146, +81162, +81188, +81188, +81195, +81204, +81227, +81227, +81227, +81227, +81264, +81264, 81273, -81273, -81307, -81333, -81338, -81400, -81400, -81400, -81400, -81418, -81418, -81418, -81430, -81455, +81283, +81299, +81311, +81339, +81339, +81350, +81372, +81397, +81425, +81425, +81425, +81425, 81455, -81493, -81499, -81527, -81527, -81539, -81554, +81467, +81467, +81467, +81483, +81497, +81513, +81513, +81513, 81560, -81584, -81584, -81601, -81601, -81601, -81601, -81601, -81601, -81601, -81619, -81631, -81643, -81643, -81643, -81654, -81666, -81716, -81740, -81740, -81757, -81769, -81797, -81797, -81848, -81873, -81873, -81873, -81873, -81885, -81885, -81898, -81911, -81916, -81940, -81940, -81940, -81940, -81956, -81956, -81961, -81977, -81994, -81994, -82025, -82025, +81578, +81595, +81595, +81605, +81605, +81616, +81616, +81623, +81623, +81623, +81632, +81640, +81640, +81640, +81640, +81640, +81640, +81640, +81659, +81676, +81690, +81690, +81690, +81690, +81690, +81690, +81694, +81694, +81709, +81725, +81730, +81730, +81746, +81746, +81765, +81765, +81765, +81801, +81815, +81815, +81826, +81826, +81830, +81830, +81830, +81849, +81863, +81874, +81884, +81884, +81884, +81909, +81953, +81971, +82024, +82024, +82024, +82024, 82031, -82047, -82047, -82086, -82105, -82124, -82124, -82143, -82143, -82143, -82143, -82163, -82163, -82163, -82163, -82163, -82188, -82193, -82207, -82207, -82207, -82234, -82246, -82265, -82314, -82314, -82314, -82323, -82323, -82323, -82323, -82337, -82337, -82343, -82349, -82349, -82375, -82385, -82402, -82402, -82452, -82462, -82462, -82462, -82469, -82481, -82481, -82481, -82540, -82550, -82567, -82576, -82576, -82576, -82585, -82591, -82620, -82634, -82668, +82054, +82068, +82088, +82104, +82132, +82192, +82221, +82221, +82262, +82281, +82287, +82300, +82300, +82300, +82300, +82300, +82300, +82300, +82306, +82306, +82328, +82328, +82338, +82338, +82365, +82365, +82365, +82365, +82365, +82365, +82365, +82372, +82372, +82403, +82403, +82403, +82403, +82403, +82420, +82453, +82453, +82467, +82467, +82467, +82479, +82484, +82493, +82502, +82518, +82559, +82582, +82618, +82618, +82618, +82667, +82667, 82687, -82714, -82724, -82724, -82750, -82750, -82750, -82764, -82777, -82811, -82849, -82849, +82703, +82726, +82726, +82726, +82738, +82799, +82799, +82806, +82827, +82843, +82843, +82848, +82848, +82848, +82848, +82848, 82864, -82877, -82888, -82917, -82917, +82864, +82870, +82878, +82891, +82895, 82917, -82923, -82944, -82958, -82958, -82958, -82958, -82958, -82971, -82985, -82985, -83004, -83004, -83025, +82933, +82960, +82983, +82983, +83005, 83025, -83107, -83126, -83126, -83126, -83126, -83126, -83126, -83126, -83132, -83132, -83147, -83153, -83153, -83153, -83164, -83164, -83176, -83183, -83212, -83233, -83294, -83315, -83336, -83355, -83355, -83355, -83367, -83403, -83430, -83448, -83448, +83058, +83068, +83085, +83090, +83094, +83094, +83094, +83094, +83136, +83169, +83169, +83169, +83169, +83187, +83201, +83201, +83201, +83209, +83225, +83252, +83252, +83275, +83297, +83304, +83304, +83312, +83312, +83316, +83343, +83365, +83370, +83370, +83370, +83390, +83431, +83431, +83436, +83436, 83448, -83448, -83488, -83488, -83488, -83488, -83488, -83488, -83506, -83506, -83506, -83510, -83551, -83567, -83575, -83575, -83591, -83591, -83599, -83681, -83681, -83703, -83703, +83454, +83487, +83504, +83504, +83515, +83519, +83519, +83519, +83529, +83529, +83562, +83562, +83569, +83587, +83592, +83606, +83615, +83615, +83642, +83690, 83709, -83732, -83742, -83742, -83752, -83752, -83805, -83805, -83805, -83845, -83864, -83864, -83875, -83907, -83933, -83950, -83976, -83985, -83992, -83992, -84001, -84040, -84040, -84057, -84070, -84096, -84124, +83714, +83714, +83721, +83721, +83721, +83741, +83741, +83755, +83773, +83797, +83812, +83812, +83827, +83837, +83865, +83865, +83865, +83865, +83865, +83877, +83877, +83877, +83884, +83884, +83905, +83910, +83922, +83922, +83934, +83946, +83946, +83968, +83968, +83988, +83988, +84023, +84023, +84023, +84034, +84034, +84034, +84048, +84061, +84085, +84085, +84085, +84125, +84125, +84125, +84125, +84125, +84134, +84134, +84134, +84155, +84155, +84170, +84179, 84179, -84187, -84232, -84232, -84286, -84308, -84308, -84322, -84322, -84322, -84322, -84338, -84357, -84373, -84373, -84373, -84394, -84394, -84402, -84402, -84402, -84424, -84445, -84466, -84485, -84501, -84501, -84522, -84529, -84547, -84592, -84592, -84621, -84633, -84651, -84651, -84662, -84689, +84179, +84212, +84212, +84224, +84242, +84247, +84256, +84256, +84276, +84303, +84303, +84310, +84310, +84317, +84324, +84324, +84324, +84328, +84328, +84346, +84346, +84353, +84364, +84397, +84407, +84407, +84433, +84433, +84433, +84447, +84447, +84463, +84463, +84463, +84488, +84488, +84499, +84523, +84523, +84523, +84540, +84540, +84540, +84556, +84556, +84556, +84556, +84588, +84619, +84666, +84666, +84666, +84666, 84696, -84704, -84704, -84704}; +84730, +84751, +84756, +84756, +84790, +84800, +84832, +84832, +84837, +84853, +84853, +84879, +84879, +84901, +84907, +84920, +84947, +84965, +84997, +85035, +85045, +85045, +85045, +85045, +85086, +85118, +85135, +85172, +85192, +85192, +85192, +85202, +85202, +85215, +85228, +85241, +85268, +85268, +85268, +85287, +85287, +85287, +85287, +85300, +85300, +85305, +85305, +85305, +85353, +85353, +85353, +85368, +85405, +85405, +85432, +85432, +85438, +85443, +85443, +85452, +85459, +85477, +85477, +85490, +85490, +85519, +85519, +85524, +85542, +85552, +85557, +85557, +85557, +85577, +85622, +85640, +85651, +85658, +85663, +85668, +85668, +85680, +85688, +85695, +85695, +85695, +85731, +85731, +85738, +85742, +85742, +85758, +85758, +85758, +85796, +85796, +85796, +85796, +85818, +85840, +85872, +85872, +85872, +85872, +85893, +85898, +85898, +85898, +85907, +85907, +85914, +85933, +85933, +85955, +85955, +85981, +85981, +85996, +86009, +86009, +86019, +86019, +86019, +86029, +86033, +86033, +86033, +86048, +86053, +86053, +86068, +86068, +86088, +86138, +86153, +86178, +86178, +86199, +86218, +86231, +86231, +86231, +86231, +86231, +86247, +86252, +86252, +86277, +86292, +86313, +86342, +86370, +86378, +86430, +86470, +86504, +86509, +86509, +86527, +86536, +86536, +86544, +86555, +86555, +86555, +86580, +86597, +86597, +86618, +86623, +86633, +86648, +86671, +86671, +86698, +86698, +86698, +86705, +86714, +86727, +86732, +86732, +86754, +86754, +86776, +86776, +86810, +86810, +86810, +86817, +86817, +86849, +86870, +86875, +86896, +86941, +86947, +86952, +86973, +86980, +86980, +87006, +87022, +87030, +87037, +87043, +87051, +87051, +87085, +87085, +87101, +87101, +87123, +87160, +87160, +87173, +87188, +87188, +87207, +87207, +87223, +87241, +87258, +87305, +87312, +87312, +87328, +87328, +87348, +87357, +87357, +87375, +87375, +87375, +87375, +87394, +87394, +87425, +87445, +87453, +87471, +87480, +87480, +87501, +87510, +87528, +87528, +87545, +87545, +87560, +87593, +87600, +87600, +87600, +87600, +87600, +87600, +87676, +87676, +87676, +87689, +87709, +87744, +87744, +87778, +87778, +87819, +87819, +87819, +87835, +87835, +87842, +87853, +87853, +87868, +87880, +87893, +87912, +87912, +87943, +87953, +87953, +87953, +87953, +87958, +87958, +87969, +88010, +88010, +88029, +88029, +88029, +88040, +88040, +88040, +88040, +88055, +88060, +88066, +88072, +88072, +88085, +88085, +88104, +88104, +88132, +88138, +88138, +88138, +88138, +88142, +88161, +88171, +88171, +88180, +88180, +88180, +88180, +88200, +88206, +88206, +88206, +88240, +88266, +88282, +88282, +88301, +88312, +88325, +88343, +88354, +88354, +88385, +88385, +88385, +88401, +88415, +88415, +88424, +88424, +88435, +88458, +88458, +88502, +88514, +88520, +88520, +88536, +88536, +88536, +88558, +88576, +88576, +88576, +88576, +88588, +88612, +88655, +88662, +88672, +88683, +88699, +88707, +88725, +88732, +88772, +88772, +88778, +88807, +88814, +88824, +88824, +88845, +88877, +88877, +88882, +88888, +88921, +88921, +88921, +88927, +88934, +88934, +88958, +88958, +88958, +88988, +89030, +89044, +89044, +89073, +89087, +89117, +89132, +89142, +89142, +89147, +89164, +89171, +89185, +89206, +89206, +89206, +89206, +89206, +89206, +89206, +89227, +89233, +89233, +89259, +89281, +89281, +89281, +89312, +89321, +89328, +89342, +89360, +89360, +89369, +89378, +89378, +89398, +89398, +89417, +89429, +89429, +89442, +89442, +89442, +89442, +89460, +89476, +89476, +89476, +89493, +89551, +89551, +89570, +89583, +89583, +89600, +89609, +89609, +89619, +89636, +89636, +89658, +89681, +89688, +89714, +89733, +89744, +89744, +89753, +89753, +89753, +89766, +89766, +89778, +89778, +89799, +89820, +89832, +89866, +89907, +89907, +89907, +89947, +89947, +89975, +89995, +90004, +90004, +90004, +90015, +90023, +90023, +90040, +90047, +90065, +90065, +90074, +90088, +90088, +90088, +90094, +90109, +90109, +90139, +90139, +90139, +90139, +90145, +90151, +90156, +90156, +90187, +90187, +90198, +90204, +90204, +90204, +90204, +90226, +90238, +90245, +90245, +90250, +90281, +90281, +90281, +90329, +90334, +90349, +90370, +90392, +90392, +90412, +90412, +90437, +90437, +90464, +90470, +90483, +90483, +90495, +90495, +90495, +90495, +90506, +90506, +90506, +90506, +90522, +90529, +90547, +90596, +90614, +90614, +90614, +90614, +90636, +90636, +90636, +90654, +90654, +90654, +90654, +90654, +90661, +90661, +90693, +90713, +90713, +90719, +90744, +90744, +90744, +90756, +90776, +90782, +90782, +90807, +90865, +90865, +90865, +90865, +90865, +90892, +90892, +90892, +90892, +90938, +90974, +90974, +90980, +90980, +90997, +90997, +91011, +91031, +91061, +91074, +91106, +91111, +91123, +91123, +91150, +91159, +91159, +91159, +91190, +91195, +91208, +91208, +91216, +91228, +91228, +91228, +91228, +91238, +91258, +91258, +91258, +91275, +91297, +91335, +91335, +91351, +91382, +91382, +91389, +91389, +91397, +91397, +91425, +91425, +91425, +91425, +91425, +91425, +91440, +91469, +91476, +91476, +91500, +91534, +91553, +91553, +91580, +91587, +91607, +91617, +91639, +91639, +91656, +91671, +91677, +91710, +91710, +91719, +91719, +91743, +91743, +91743, +91743, +91748, +91768, +91781, +91781, +91803, +91826, +91826, +91836, +91856, +91856, +91872, +91872, +91872, +91878, +91878, +91878, +91878, +91878, +91901, +91901, +91915, +91931, +91931, +91931, +91942, +91942, +91952, +91967, +91982, +91982, +92000, +92000, +92000, +92000, +92000, +92023, +92023, +92048, +92070, +92085, +92104, +92104, +92116, +92116, +92150, +92163, +92163, +92179, +92179, +92179, +92193, +92221, +92221, +92228, +92228, +92265, +92289, +92303, +92303, +92303, +92303, +92311, +92311, +92328, +92365, +92365, +92365, +92365, +92365, +92365, +92365, +92365, +92365, +92365, +92401, +92401, +92401, +92401, +92401, +92401, +92420, +92434, +92448, +92498, +92556, +92561, +92561, +92576, +92576, +92576, +92576, +92582, +92599, +92614, +92638, +92654, +92654, +92665, +92665, +92665, +92665, +92665, +92699, +92699, +92718, +92718, +92741, +92746, +92765, +92783, +92783, +92820, +92850, +92850, +92896, +92918, +92955, +92955, +92955, +92955, +92955, +92967, +92967, +92982, +92998, +93004, +93004, +93026, +93026, +93026, +93026, +93032, +93073, +93073, +93079, +93093, +93093, +93105, +93123, +93123, +93145, +93145, +93145, +93145, +93150, +93150, +93179, +93201, +93227, +93245, +93267, +93276, +93276, +93287, +93292, +93292, +93292, +93292, +93292, +93305, +93305, +93319, +93323, +93341, +93349, +93349, +93361, +93361, +93361, +93372, +93389, +93389, +93389, +93432, +93464, +93477, +93477, +93484, +93484, +93484, +93484, +93484, +93503, +93503, +93519, +93519, +93544, +93553, +93553, +93562, +93606, +93621, +93621, +93631, +93654, +93670, +93693, +93699, +93705, +93715, +93734, +93745, +93745, +93745, +93745, +93745, +93761}; static const char *tldData[] = { -"trentinosudtirol.it\0ashikaga.tochigi.jp\0" -"radio.br\0" -"lib.il.us\0photography\0" -"miki.hyogo.jp\0edunet.tn\0" -"aisai.aichi.jp\0" -"isa-geek.org\0" -"educator.aero\0mining.museum\0" -"tsu.mie.jp\0yakumo.shimane.jp\0turek.pl\0" -"*.sch.uk\0ifm\0" -"an.it\0" -"consulting\0" -"tsuyama.okayama.jp\0" -"kommune.no\0" -"hl.cn\0mamurogawa.yamagata.jp\0" -"michigan.museum\0" -"\xe6\x89\x8b\xe6\x9c\xba\0" -"sand\xc3\xb8y.no\0" -"jprs\0" -"ne.jp\0" -"rnd.ru\0" -"ogaki.gifu.jp\0chitose.hokkaido.jp\0chigasaki.kanagawa.jp\0kasukabe.saitama.jp\0" -"kawaguchi.saitama.jp\0takashima.shiga.jp\0chuo.tokyo.jp\0expert\0" -"ueno.gunma.jp\0bifuka.hokkaido.jp\0" -"oster\xc3\xb8y.no\0" -"nishigo.fukushima.jp\0" -"gs.sf.no\0" -"higashichichibu.saitama.jp\0qpon\0" -"ns.ca\0" -"oishida.yamagata.jp\0ne.kr\0kobierzyce.pl\0" -"for-some.biz\0" -"satx.museum\0" -"sydney.museum\0" -"fujishiro.ibaraki.jp\0gift\0" -"akaiwa.okayama.jp\0" -"azumino.nagano.jp\0" -"divtasvuodna.no\0" -"slg.br\0" -"creditunion\0" -"ralingen.no\0" -"trust\0" -"lib.tn.us\0" -"h\xc3\xa1mm\xc3\xa1rfeasta.no\0" -"trentinosud-tirol.it\0unazuki.toyama.jp\0" -"naturhistorisches.museum\0war.museum\0nico\0" -"nedre-eiker.no\0odda.no\0" -"zentsuji.kagawa.jp\0" -"finn\xc3\xb8y.no\0" -"ikeda.osaka.jp\0" -"lerdal.no\0" -"mill.museum\0" -"wolomin.pl\0" -"vrn.ru\0" -"g12.br\0" -"artanddesign.museum\0" -"fujimino.saitama.jp\0" -"arts.co\0" -"shiroishi.saga.jp\0" -"honda\0" -"otaki.nagano.jp\0" -"harvestcelebration.museum\0bremanger.no\0nikolaev.ua\0" -"ilawa.pl\0" -"brandywinevalley.museum\0portal.museum\0" -"indianapolis.museum\0\xc3\xb8vre-eiker.no\0ski.no\0" -"catering\0condos\0" -"vlaanderen.museum\0" -"higashiyamato.tokyo.jp\0" -"alesund.no\0ternopil.ua\0" -"living.museum\0tysvar.no\0norilsk.ru\0osaka\0from-wi.com\0" -"bill.museum\0" -"is-saved.org\0" -"accident-investigation.aero\0palmsprings.museum\0" -"aeroport.fr\0tamba.hyogo.jp\0" -"sorum.no\0" -"ts.it\0" -"nose.osaka.jp\0" -"miners.museum\0ne.pw\0mari.ru\0ing\0" -"saikai.nagasaki.jp\0iheya.okinawa.jp\0miasta.pl\0" -"scientist.aero\0ovre-eiker.no\0" -"hirogawa.wakayama.jp\0" -"gs.oslo.no\0mn.us\0ink\0blogdns.com\0is-a-chef.org\0" -"miyama.mie.jp\0" -"starachowice.pl\0" -"settlement.museum\0k12.nh.us\0" -"sassari.it\0" -"lib.vi.us\0directory\0" -"b.bg\0" -"int\0" -"veg\xc3\xa5rshei.no\0" -"tsurugashima.saitama.jp\0" -"net.ac\0here-for-more.info\0" -"kamijima.ehime.jp\0" -"net.ae\0" -"net.af\0hakodate.hokkaido.jp\0opoczno.pl\0" -"net.ag\0" -"date.hokkaido.jp\0" -"net.ai\0" -"b.br\0" -"te.ua\0" -"net.al\0bl.it\0shichikashuku.miyagi.jp\0" -"net.an\0" -"net.ba\0tyumen.ru\0" -"net.ar\0net.bb\0friuli-v-giulia.it\0yawara.ibaraki.jp\0" -"nl.no\0dnsdojo.com\0" -"monzabrianza.it\0" -"net.au\0granvin.no\0" -"net.bh\0tadotsu.kagawa.jp\0olawa.pl\0" -"airforce\0" -"net.az\0konin.pl\0" -"fin.ec\0" -"shonai.yamagata.jp\0" -"net.bm\0vestre-toten.no\0" -"webhop.net\0" -"net.bo\0" -"net.br\0gen.in\0" -"net.bs\0" -"net.bt\0" -"shinjuku.tokyo.jp\0lincoln\0" -"geology.museum\0lahppi.no\0" -"net.ci\0" -"net.bz\0campidanomedio.it\0" -"gs.st.no\0naustdal.no\0omasvuotna.no\0from-il.com\0" -"aomori.aomori.jp\0tanabe.kyoto.jp\0" -"net.cm\0beeldengeluid.museum\0openair.museum\0tana.no\0" -"net.cn\0" -"net.co\0arboretum.museum\0ivano-frankivsk.ua\0" -"stavropol.ru\0" -"ne.ug\0" -"koganei.tokyo.jp\0" -"net.cu\0hl.no\0" -"ne.tz\0goldpoint\0" -"net.cw\0" -"haga.tochigi.jp\0" -"services.aero\0net.dm\0whoswho\0" -"sodegaura.chiba.jp\0toyoura.hokkaido.jp\0jcb\0" -"net.do\0ne.us\0courses\0" -"best\0" -"baseball.museum\0paleo.museum\0" -"net.ec\0k12.ne.us\0isa-geek.com\0" -"gemological.museum\0" -"i.bg\0net.eg\0" -"toga.toyama.jp\0williamhill\0" -"net.dz\0matsue.shimane.jp\0" -"mytis.ru\0auto\0" -"toho.fukuoka.jp\0" -"saintlouis.museum\0is-a-chef.com\0" -"chikujo.fukuoka.jp\0okagaki.fukuoka.jp\0wegrow.pl\0" -"ogliastra.it\0hs.kr\0ist\0" -"atm.pl\0" -"ballangen.no\0date\0" -"bs.it\0" -"gotdns.com\0" -"pharmacy.museum\0blogsite.org\0" -"natuurwetenschappen.museum\0" -"tysfjord.no\0vagan.no\0" -"gu.us\0" -"vlaanderen\0" -"net.ge\0k12.gu.us\0" -"joso.ibaraki.jp\0shimotsuma.ibaraki.jp\0kawagoe.saitama.jp\0" -"net.gg\0iraq.museum\0holtalen.no\0za.com\0from-or.com\0" -"isehara.kanagawa.jp\0itoman.okinawa.jp\0zgorzelec.pl\0" -"slask.pl\0" -"est-a-la-maison.com\0" -"design\0" -"s3-website-ap-northeast-1.amazonaws.com\0" -"net.gn\0benevento.it\0" -"\xe7\xbb\x84\xe7\xb9\x94.hk\0botanical.museum\0" -"net.gp\0hanawa.fukushima.jp\0" -"arts.ve\0" -"net.gr\0" -"works.aero\0" -"net.gt\0" -"net.gy\0" -"seihi.nagasaki.jp\0" -"net.hk\0" -"koza.wakayama.jp\0hotel.tz\0" -"cq.cn\0net.hn\0va.it\0masuda.shimane.jp\0gen.nz\0" -"britishcolumbia.museum\0orkdal.no\0iwc\0" -"dynalias.org\0" -"net.ht\0net.id\0" -"ono.hyogo.jp\0" -"\xe5\x8f\xb0\xe6\xb9\xbe\0" -"k12.nv.us\0" -"net.im\0newmexico.museum\0chelyabinsk.ru\0" -"net.in\0" -"p.bg\0" -"yasuda.kochi.jp\0" -"net.iq\0cc.na\0" -"net.ir\0hofu.yamaguchi.jp\0" -"net.is\0r\xc3\xb8ros.no\0dyn-o-saur.com\0" -"net.je\0" -"video.hu\0graphics\0" +"sakae.chiba.jp\0" +"equipment.aero\0bjerkreim.no\0" +"gyeonggi.kr\0" +"jeep\0" +"chieti.it\0" +"landrover\0" +"genoa.it\0ugim.gov.pl\0" +"rishirifuji.hokkaido.jp\0tomiya.miyagi.jp\0foodnetwork\0" +"bananarepublic\0" +"kr\xc3\xb8""dsherad.no\0" +"swiftcover\0" +"wtc\0unusualperson.com\0" +"unazuki.toyama.jp\0" +"wtf\0forgot.his.name\0" +"dyndns.org\0ma.leg.br\0" +"cci.fr\0\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb1\xd8\xaf\xd9\x86\0" +"hiroo.hokkaido.jp\0" +"showa.gunma.jp\0yawata.kyoto.jp\0" +"help\0" +"name.vn\0" +"cagliari.it\0game-host.org\0" +"\xe5\x9f\xbc\xe7\x8e\x89.jp\0trust\0" +"dagestan.ru\0pokrovsk.su\0" +"cmw.ru\0" +"tokamachi.niigata.jp\0" +"hirono.fukushima.jp\0" +"forlicesena.it\0tsushima.nagasaki.jp\0" +"sci.eg\0\xe7\xae\x87\xe4\xba\xba.hk\0" +"kawaba.gunma.jp\0ookuwa.nagano.jp\0" +"masuda.shimane.jp\0xbox\0" +"servep2p.com\0" +"portal.museum\0" +"blog.br\0dagestan.su\0" +"fukushima.jp\0newholland\0" +"merseine.nu\0ditchyourip.com\0" +"iraq.museum\0bronnoy.no\0" +"ogasawara.tokyo.jp\0" +"furukawa.miyagi.jp\0takayama.nagano.jp\0" +"name.tj\0" +"mb.ca\0koto.tokyo.jp\0" +"loyalist.museum\0gdansk.pl\0" +"chosei.chiba.jp\0nagawa.nagano.jp\0" +"cheltenham.museum\0" +"casadelamoneda.museum\0name.tr\0" +"d\xc3\xb8nna.no\0name.tt\0futuremailing.at\0" +"al.no\0" +"trentinoa-adige.it\0herad.no\0" +"kizu.kyoto.jp\0\xc3\xa5krehamn.no\0" +"katagami.akita.jp\0\xc3\xb8stre-toten.no\0" +"johana.toyama.jp\0" +"kawasaki.miyagi.jp\0" +"cc.in.us\0dnsdojo.com\0" +"cc.de.us\0\xe6\x89\x8b\xe8\xa1\xa8\0" +"toki.gifu.jp\0" +"georgia.museum\0gs.tr.no\0" +"ri.it\0" +"an.it\0house.museum\0" +"is-a-musician.com\0servehttp.com\0" +"oto.fukuoka.jp\0" +"\xe5\xbe\xae\xe5\x8d\x9a\0" +"mtpc\0" +"nordkapp.no\0boxfuse.io\0" +"shell.museum\0" +"alipay\0mt.eu.org\0" +"\xe6\x9d\xb1\xe4\xba\xac.jp\0softbank\0" +"yashio.saitama.jp\0" +"mutsuzawa.chiba.jp\0nowtv\0" +"ina.ibaraki.jp\0hembygdsforbund.museum\0" +"xin\0" +"loppa.no\0" +"judygarland.museum\0here\0scjohnson\0" +"firm.ht\0" +"suita.osaka.jp\0" +"assn.lk\0" +"saikai.nagasaki.jp\0" +"mo-i-rana.no\0spiegel\0sites.static.land\0" +"skydiving.aero\0homegoods\0" +"hino.tokyo.jp\0phoenix.museum\0kvalsund.no\0" +"firm.in\0" +"k12.ia.us\0" +"heguri.nara.jp\0name.qa\0guru\0lego\0" +"flor\xc3\xb8.no\0name.pr\0" +"\xe9\x95\xb7\xe9\x87\x8e.jp\0" +"palermo.it\0" +"control.aero\0verona.it\0" +"traniandriabarletta.it\0takamori.kumamoto.jp\0" +"skedsmo.no\0" +"kyotamba.kyoto.jp\0" +"itami.hyogo.jp\0" +"clubmed\0star\0" +"ginowan.okinawa.jp\0name.na\0" +"griw.gov.pl\0" +"name.mv\0mormon\0" +"name.ng\0" +"fvg.it\0name.my\0tomsk.ru\0" +"altoadige.it\0" +"school.museum\0gs.jan-mayen.no\0" +"md.ci\0firm.co\0" +"and\xc3\xb8y.no\0mari-el.ru\0lib.az.us\0" +"wanouchi.gifu.jp\0higashiyamato.tokyo.jp\0" +"textile.museum\0" +"kitakami.iwate.jp\0mansions.museum\0randaberg.no\0chrysler\0" +"udm.ru\0cc.ny.us\0is-a-guru.com\0" +"eisenbahn.museum\0" +"eun.eg\0her\xc3\xb8y.m\xc3\xb8re-og-romsdal.no\0praxi\0" +"firm.dk\0" +"domains\0" +"parachuting.aero\0" +"mb.it\0" +"ap.it\0" +"travel\0" +"muko.kyoto.jp\0" +"tsukiyono.gunma.jp\0freiburg.museum\0" +"higashiyama.kyoto.jp\0" +"\xe6\x84\x9b\xe7\x9f\xa5.jp\0al.us\0" +"kamagaya.chiba.jp\0" +"ibaraki.ibaraki.jp\0chikuhoku.nagano.jp\0mima.tokushima.jp\0" +"noheji.aomori.jp\0" +"edu.ac\0" +"redirectme.net\0" +"tahara.aichi.jp\0" +"edu.af\0" +"taxi.br\0" +"name.mk\0" +"med.br\0" +"edu.al\0nishitosa.kochi.jp\0stpetersburg.museum\0" +"salon\0" +"edu.ba\0" +"edu.ar\0edu.bb\0gyeongnam.kr\0" +"*.0emm.com\0" +"shimoichi.nara.jp\0" +"civilaviation.aero\0edu.au\0la-spezia.it\0" +"seiyo.ehime.jp\0" +"edu.bh\0is-very-bad.org\0" +"edu.bi\0" +"edu.az\0" +"k12.ct.us\0" +"b.ssl.fastly.net\0" +"edu.bm\0" +"name.jo\0" +"edu.bo\0" +"dyndns-wiki.com\0" +"edu.br\0\xeb\x8b\xb7\xec\xbb\xb4\0" +"edu.bs\0" +"flog.br\0edu.bt\0onjuku.chiba.jp\0" +"otoyo.kochi.jp\0" +"benevento.it\0" +"edu.ci\0" +"in-addr.arpa\0edu.bz\0" +"art.br\0history.museum\0brother\0" +"med.ec\0meteorapp.com\0" +"agr.br\0" +"edu.cn\0med.ee\0naka.hiroshima.jp\0kamimine.saga.jp\0" +"edu.co\0" +"rishiri.hokkaido.jp\0" +"edu.cu\0shinjo.nara.jp\0nesset.no\0" +"edu.cw\0click\0" +"\xe9\xa4\x90\xe5\x8e\x85\0" +"lib.ga.us\0" +"\xd9\x83\xd9\x88\xd9\x85\0is-a-bookkeeper.com\0" +"samara.ru\0" +"ainan.ehime.jp\0" +"edu.dm\0" +"edu.do\0" +"cc.ok.us\0" +"fujisawa.iwate.jp\0" +"edu.ec\0" +"vlog.br\0" +"edu.ee\0hamatonbetsu.hokkaido.jp\0" +"datsun\0my.eu.org\0" +"edu.eg\0football\0" +"art.do\0rm.it\0" +"lt.it\0" +"edu.dz\0" +"ar.it\0juedisches.museum\0" +"e4.cz\0" +"a.prod.fastly.net\0" +"ri.us\0" +"norddal.no\0" +"art.dz\0edu.es\0" +"edu.et\0" +"geisei.kochi.jp\0" +"kasaoka.okayama.jp\0" +"bergen.no\0" +"kujukuri.chiba.jp\0ochi.kochi.jp\0ladbrokes\0" +"foundation\0" +"ven.it\0style\0" +"edu.ge\0okayama.jp\0takahama.aichi.jp\0shimofusa.chiba.jp\0" +"family\0godaddy\0read\0" +"edu.gh\0imakane.hokkaido.jp\0" +"edu.gi\0shioya.tochigi.jp\0" +"\xe1\x83\x92\xe1\x83\x94\0" +"edu.gl\0skjak.no\0" +"med.ht\0gifu.jp\0" +"edu.gn\0" +"culturalcenter.museum\0" +"edu.gp\0" +"is-a-llama.com\0" +"edu.gr\0skanland.no\0" +"edu.gt\0inagi.tokyo.jp\0" +"mobara.chiba.jp\0creditunion\0" +"edu.gy\0community\0" +"osaka.jp\0historisch.museum\0" +"edu.hk\0b\xc3\xa1l\xc3\xa1t.no\0" +"press.aero\0pri.ee\0edu.hn\0" +"sa.au\0ulvik.no\0" +"barreau.bj\0edu.ht\0asaka.saitama.jp\0birkenes.no\0evje-og-hornnes.no\0pomorze.pl\0firm.ve\0" +"siena.it\0nysa.pl\0est-a-la-maison.com\0paris.eu.org\0" +"brussels\0" "withgoogle.com\0" -"operaunite.com\0" -"bz.it\0yamazoe.nara.jp\0" -"vgs.no\0" -"net.jo\0" -"pa.it\0" -"telekommunikation.museum\0cc.mt.us\0cc.nd.us\0" -"brasil.museum\0" -"net.kg\0ullensvang.no\0sebastopol.ua\0" -"toyooka.hyogo.jp\0" -"net.ki\0supply\0" -"higashiomi.shiga.jp\0" -"tottori.tottori.jp\0" -"jfk.museum\0" -"misaki.okayama.jp\0net.kn\0" -"kr.com\0" -"ookuwa.nagano.jp\0koshigaya.saitama.jp\0" -"net.la\0" -"furubira.hokkaido.jp\0net.lb\0" -"net.lc\0historicalsociety.museum\0" -"cesenaforli.it\0" -"kagami.kochi.jp\0" -"gobo.wakayama.jp\0" -"net.ky\0loppa.no\0" -"net.kz\0" -"net.lk\0gs.tr.no\0arts.ro\0" -"castres.museum\0r\xc3\xb8""d\xc3\xb8y.no\0" -"net.ma\0" -"net.lr\0" -"is-a-landscaper.com\0" -"net.me\0" -"imizu.toyama.jp\0net.lv\0" -"birkenes.no\0" -"net.ly\0va.no\0" -"net.mk\0" -"hikimi.shimane.jp\0net.ml\0" -"uri.arpa\0ltd.gi\0net.mo\0depot.museum\0smolensk.ru\0jlc\0" -"showa.gunma.jp\0kawanishi.hyogo.jp\0" -"klepp.no\0" -"net.ms\0honefoss.no\0" -"net.mt\0" -"net.mu\0" -"yazu.tottori.jp\0net.mv\0net.nf\0gen.tr\0" -"w.bg\0net.mw\0net.ng\0" -"net.mx\0" -"net.my\0" -"tos.it\0toya.hokkaido.jp\0" -"sakura\0" -"assedic.fr\0aid.pl\0" -"ltd.hk\0" -"isernia.it\0net.nr\0" -"botany.museum\0" -"aramco\0" -"net.nz\0" -"ostrowwlkp.pl\0" -"hotel.lk\0net.om\0voting\0" -"\xe4\xbc\x81\xe4\xb8\x9a\0" -"virginia.museum\0googlecode.com\0" -"stj\xc3\xb8rdalshalsen.no\0net.pa\0adygeya.ru\0" -"arai.shizuoka.jp\0arts.nf\0" -"americanart.museum\0habmer.no\0net.pe\0" -"lib.pr.us\0" -"net.ph\0" -"net.pk\0" -"net.pl\0" -"morioka.iwate.jp\0net.pn\0" -"net.qa\0" -"kanuma.tochigi.jp\0net.pr\0" -"gjerdrum.no\0net.ps\0" -"inawashiro.fukushima.jp\0yamatotakada.nara.jp\0net.pt\0" -"shimizu.shizuoka.jp\0wielun.pl\0" -"net.py\0" -"asahi.chiba.jp\0" -"os\xc3\xb8yro.no\0" -"kijo.miyazaki.jp\0\xe7\xbd\x91\xe5\x9d\x80\0" -"b.se\0rhcloud.com\0" -"kamikitayama.nara.jp\0jot\0" -"toyotomi.hokkaido.jp\0" -"from.hr\0" -"portlligat.museum\0joy\0" -"saijo.ehime.jp\0fin.tn\0yandex\0" -"other.nf\0" -"bruxelles.museum\0" -"utsunomiya.tochigi.jp\0gyeongbuk.kr\0" -"tools\0" -"ltd.lk\0net.sa\0" -"ikata.ehime.jp\0net.sb\0" -"catering.aero\0net.sc\0" -"health.nz\0net.sd\0" -"net.ru\0" -"tsuno.kochi.jp\0shimane.shimane.jp\0" -"net.rw\0net.sg\0is-very-evil.org\0" -"i.ph\0net.sh\0" -"kosuge.yamanashi.jp\0" -"\xc3\xb8ystre-slidre.no\0" -"net.sl\0" -"info.ht\0maizuru.kyoto.jp\0shinjo.nara.jp\0yorii.saitama.jp\0" -"info.hu\0m\xc3\xa5s\xc3\xb8y.no\0press.se\0net.so\0" -"po.it\0" -"s\xc3\xb8r-varanger.no\0" -"net.st\0" -"hotel.hu\0oppegard.no\0" -"net.th\0" -"nsw.au\0net.sy\0githubusercontent.com\0" -"kanagawa.jp\0net.tj\0" -"roma.museum\0" -"contemporaryart.museum\0net.tm\0va.us\0" -"info.et\0net.tn\0" -"net.to\0land-4-sale.us\0" -"konan.aichi.jp\0\xd8\xa7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86\0" -"net.ua\0k12.vi.us\0" -"alto-adige.it\0net.tr\0" -"net.tt\0" -"dyndns-web.com\0" -"shiwa.iwate.jp\0nagai.yamagata.jp\0stargard.pl\0" -"net.tw\0" -"kasuya.fukuoka.jp\0nagaoka.niigata.jp\0" -"!city.sapporo.jp\0" -"tranoy.no\0net.uk\0" -"pila.pl\0" -"dyndns-home.com\0is-into-cartoons.com\0" -"aizumisato.fukushima.jp\0" -"\xe3\x81\xbf\xe3\x82\x93\xe3\x81\xaa\0" -"clock.museum\0net.vc\0" -"kamioka.akita.jp\0fujimi.nagano.jp\0ando.nara.jp\0tochigi.tochigi.jp\0" -"lorenskog.no\0i.se\0net.ve\0" -"vv.it\0kamishihoro.hokkaido.jp\0shiogama.miyagi.jp\0" -"pilots.museum\0net.uy\0net.vi\0" -"net.uz\0" -"is-a-cubicle-slave.com\0" -"cargo.aero\0salzburg.museum\0" -"kitami.hokkaido.jp\0net.vn\0" -"dyroy.no\0pa.us\0" -"nagiso.nagano.jp\0" +"ikawa.akita.jp\0\xc3\xa5mot.no\0credit\0" +"art.ht\0midori.gunma.jp\0kazo.saitama.jp\0komatsushima.tokushima.jp\0" +"edu.in\0pavia.it\0mihara.kochi.jp\0aridagawa.wakayama.jp\0transport.museum\0" +"sodegaura.chiba.jp\0" +"edu.iq\0edunet.tn\0" +"edu.is\0lib.md.us\0\xd8\xa7\xd9\x85\xd8\xa7\xd8\xb1\xd8\xa7\xd8\xaa\0" +"edu.it\0kawakita.ishikawa.jp\0" +"go.ci\0\xe7\x9f\xb3\xe5\xb7\x9d.jp\0accountants\0" +"act.edu.au\0" +"xj.cn\0" +"kurgan.ru\0" +"s3-us-gov-west-1.amazonaws.com\0" +"yashiro.hyogo.jp\0" +"sa.cr\0alabama.museum\0pasadena.museum\0ro.im\0" +"gs.svalbard.no\0" +"go.cr\0" +"edu.jo\0ap-northeast-2.compute.amazonaws.com\0" +"sakai.fukui.jp\0" +"ro.it\0miyama.fukuoka.jp\0" +"extraspace\0" +"memorial.museum\0" +"at.it\0nl.eu.org\0" +"edu.kg\0xxx\0\xd8\xa8\xd9\x8a\xd8\xaa\xd9\x83\0us-west-2.compute.amazonaws.com\0" +"toya.hokkaido.jp\0edu.ki\0suldal.no\0kurgan.su\0" +"enebakk.no\0groks-the.info\0" +"edu.km\0tiffany\0\xe4\xbd\x9b\xe5\xb1\xb1\0" +"edu.kn\0anthropology.museum\0baghdad.museum\0" +"edu.kp\0" +"edu.la\0" +"edu.lb\0med.ly\0\xd8\xaa\xd9\x88\xd9\x86\xd8\xb3\0" +"edu.lc\0kafjord.no\0" +"ueno.gunma.jp\0" +"edu.ky\0vinnytsia.ua\0xyz\0" +"edu.kz\0" +"edu.lk\0" +"misato.saitama.jp\0" +"mus.br\0monza.it\0torahime.shiga.jp\0ichikai.tochigi.jp\0" +"katori.chiba.jp\0" +"edu.lr\0" +"shikama.miyagi.jp\0vestnes.no\0banamex\0" +"edu.me\0" +"edu.lv\0" +"edu.mg\0" +"edu.ly\0" +"orientexpress\0team\0" +"edu.mk\0inder\xc3\xb8y.no\0ru.com\0se.com\0" +"edu.ml\0" +"taiki.hokkaido.jp\0" +"edu.mn\0nyc.museum\0firm.ro\0from-fl.com\0" +"varese.it\0edu.mo\0" +"isumi.chiba.jp\0" +"a.ssl.fastly.net\0" +"edu.ms\0" +"imari.saga.jp\0edu.mt\0" +"edu.mv\0med.om\0" +"edu.mw\0edu.ng\0" +"edu.mx\0amot.no\0" +"lom.it\0edu.my\0edu.ni\0" +"hiji.oita.jp\0edu.mz\0med.pa\0" +"goto.nagasaki.jp\0freebox-os.fr\0" +"yamazoe.nara.jp\0" +"\xe5\xa4\xa9\xe4\xb8\xbb\xe6\x95\x99\0" +"nesoddtangen.no\0edu.nr\0\xe4\xb8\xad\xe4\xbf\xa1\0" +"amakusa.kumamoto.jp\0" +"ryazan.ru\0tech\0med.pl\0" +"arai.shizuoka.jp\0\xe0\xa4\xa8\xe0\xa5\x87\xe0\xa4\x9f\0" +"isa.us\0" +"edu.om\0" +"donostia.museum\0" +"go.id\0" +"edu.pa\0edeka\0" +"construction\0" +"sc.cn\0" +"ha.cn\0shibecha.hokkaido.jp\0edu.pe\0" +"cody.museum\0palace.museum\0edu.pf\0lt.ua\0cc.tx.us\0\xd9\x85\xd8\xb5\xd8\xb1\0reit\0" +"topology.museum\0edu.ph\0" +"serveftp.com\0" +"edu.pk\0" +"edu.pl\0" +"sa.it\0academy.museum\0edu.pn\0rnd.ru\0" +"go.it\0nakatsugawa.gifu.jp\0" +"av.it\0edu.qa\0" +"vet.br\0edu.pr\0" +"edu.ps\0" +"eigersund.no\0edu.pt\0" +"firm.nf\0art.pl\0" +"wv.us\0ng.eu.org\0" +"shacknet.nu\0" +"md.us\0" +"edu.py\0" +"med.sa\0ar.us\0" +"pisa.it\0tr.eu.org\0" +"go.jp\0" +"med.sd\0" +"*.ext.githubcloud.com\0" +"bihoro.hokkaido.jp\0" +"potager.org\0" +"tattoo\0you\0" +"reggio-emilia.it\0" +"mg.leg.br\0" +"kawagoe.saitama.jp\0us-2.evennode.com\0" +"samsclub\0is-saved.org\0" +"shinanomachi.nagano.jp\0" +"club.tw\0" +"go.kr\0" +"artcenter.museum\0komforb.se\0news\0" +"whaling.museum\0edu.sa\0" +"edu.sb\0" +"edu.rs\0edu.sc\0" +"lom.no\0edu.sd\0" +"edu.ru\0" +"info.ht\0sannan.hyogo.jp\0edu.rw\0edu.sg\0" +"info.hu\0" +"edu.sl\0" +"edu.sn\0" +"ambulance.museum\0" +"kanra.gunma.jp\0academy\0next\0" +"kokubunji.tokyo.jp\0" +"nfshost.com\0" +"kushiro.hokkaido.jp\0edu.st\0" +"edu.sv\0toshiba\0" +"info.et\0bd.se\0art.sn\0" +"from-pa.com\0" +"voronezh.ru\0edu.sy\0" +"edu.tj\0" +"kaneyama.yamagata.jp\0meraker.no\0game.tw\0" +"swiss\0" +"gs.oslo.no\0edu.tm\0" +"aoki.nagano.jp\0ikoma.nara.jp\0" +"edu.to\0" +"joyo.kyoto.jp\0edu.ua\0" +"newyork.museum\0edu.tr\0" +"edu.tt\0is-a-hard-worker.com\0" +"samegawa.fukushima.jp\0" +"narvik.no\0rent\0" +"soc.lk\0edu.tw\0" +"lib.ar.us\0webcam\0" +"sola.no\0" +"flekkefjord.no\0" +"gs.cn\0" +"bj.cn\0lv.ua\0" +"ketrzyn.pl\0cc.pa.us\0" +"hitoyoshi.kumamoto.jp\0edu.vc\0" +"edu.ve\0" +"ilawa.pl\0" +"tabayama.yamanashi.jp\0us-1.evennode.com\0" +"edu.uy\0" +"kumejima.okinawa.jp\0from-co.net\0" +"bilbao.museum\0alfaromeo\0" +"edu.vn\0" +"kashima.ibaraki.jp\0agrinet.tn\0expert\0" +"settsu.osaka.jp\0" +"bus.museum\0h\xc3\xb8ylandet.no\0" +"video\0" +"pro.az\0" +"kawanehon.shizuoka.jp\0edu.vu\0" +"info.ec\0firenze.it\0murakami.niigata.jp\0" +"nord-aurdal.no\0" +"yachimata.chiba.jp\0" +"pro.br\0" +"yun\0elb.amazonaws.com\0" +"chrome\0istmein.de\0" +"itano.tokushima.jp\0mycd.eu\0" +"go.pw\0edu.ws\0" +"info.bb\0yamada.iwate.jp\0tawaramoto.nara.jp\0lgbt\0" +"partners\0" +"sc.kr\0balsfjord.no\0info.at\0" +"info.au\0" +"fairwinds\0" +"beskidy.pl\0creditcard\0" +"shingo.aomori.jp\0ouda.nara.jp\0" +"info.az\0" +"servemp3.com\0" +"axis.museum\0lplfinancial\0" +"sor-aurdal.no\0" +"aosta-valley.it\0fujiidera.osaka.jp\0" +"pro.cy\0pescara.it\0hiranai.aomori.jp\0" +"sagamihara.kanagawa.jp\0" +"gjemnes.no\0" +"asakuchi.okayama.jp\0heritage.museum\0weber\0" +"pro.ec\0venezia.it\0oguni.yamagata.jp\0" +"kobayashi.miyazaki.jp\0" +"kagawa.jp\0nango.fukushima.jp\0" +"edu.za\0marriott\0" +"info.co\0bill.museum\0fet.no\0\xe5\x9c\xa8\xe7\xba\xbf\0" +"culture.museum\0nissedal.no\0" +"olawa.pl\0rest\0" +"bajddar.no\0" +"journal.aero\0" +"evenassi.no\0" +"katano.osaka.jp\0" +"penza.ru\0edu.zm\0" +"kosaka.akita.jp\0" +"s3-ap-southeast-2.amazonaws.com\0" +"tome.miyagi.jp\0higashiyodogawa.osaka.jp\0on-the-web.tv\0" +"go.th\0" +"omachi.nagano.jp\0katowice.pl\0lib.hi.us\0isa-hockeynut.com\0" +"ha.no\0go.tj\0" +"verm\xc3\xb6gensberatung\0" +"he.cn\0savannahga.museum\0" +"kashima.kumamoto.jp\0penza.su\0" +"is-a-chef.org\0" +"av.tr\0solar\0zip\0" +"kainan.wakayama.jp\0" +"yamada.fukuoka.jp\0go.ug\0\xe5\xa8\xb1\xe4\xb9\x90\0" +"oseto.nagasaki.jp\0coastaldefence.museum\0" +"go.tz\0" +"kadogawa.miyazaki.jp\0lease\0" +"safety\0" +"mielec.pl\0" +"katashina.gunma.jp\0" "sortland.no\0" -"\xe5\xb1\xb1\xe6\xa2\xa8.jp\0" -"volgograd.ru\0net.vu\0" -"tsunan.niigata.jp\0" -"takata.fukuoka.jp\0" -"info.ec\0" -"istanbul\0" -"rel.ht\0" -"dyndns-server.com\0" -"\xe9\x9d\x92\xe6\xa3\xae.jp\0" -"net.ws\0bauhaus\0" -"forlicesena.it\0kfh\0" -"pv.it\0norton\0" -"cc.ny.us\0" -"info.bb\0hashikami.aomori.jp\0" -"seirou.niigata.jp\0info.at\0" -"info.au\0lib.ee\0" -"selfip.biz\0" -"info.az\0tsukigata.hokkaido.jp\0" -"trani-barletta-andria.it\0loan\0" -"press.ma\0" -"legnica.pl\0" -"lavangen.no\0pors\xc3\xa1\xc5\x8bgu.no\0sk\xc3\xa5nland.no\0" -"orsta.no\0" -"hakusan.ishikawa.jp\0" -"flight.aero\0hemnes.no\0moss.no\0sykkylven.no\0" -"hirara.okinawa.jp\0" -"ukiha.fukuoka.jp\0kyotango.kyoto.jp\0health.vn\0" -"info.co\0bo.nordland.no\0tysv\xc3\xa6r.no\0fhsk.se\0" -"\xe9\xb9\xbf\xe5\x85\x90\xe5\xb3\xb6.jp\0" -"air-traffic-control.aero\0design.aero\0meland.no\0chtr.k12.ma.us\0" -"matsumae.hokkaido.jp\0sakuragawa.ibaraki.jp\0nagano.nagano.jp\0motegi.tochigi.jp\0" -"insurance.aero\0automotive.museum\0ullensaker.no\0p.se\0" -"alessandria.it\0" -"journalist.aero\0cody.museum\0" -"bato.tochigi.jp\0misasa.tottori.jp\0" -"polkowice.pl\0" -"correios-e-telecomunica\xc3\xa7\xc3\xb5""es.museum\0" -"trentino-sued-tirol.it\0" -"asahi.toyama.jp\0" -"sogne.no\0orenburg.ru\0kim\0" -"isa-geek.net\0" -"tatarstan.ru\0" -"kashiwa.chiba.jp\0kamimine.saga.jp\0" -"contractors\0" -"tagajo.miyagi.jp\0fujikawa.shizuoka.jp\0" -"kudamatsu.yamaguchi.jp\0" -"ltd.uk\0" -"nantan.kyoto.jp\0" -"r\xc3\xb8yrvik.no\0" -"is-a-chef.net\0" -"planetarium.museum\0langev\xc3\xa5g.no\0" -"abbott\0" -"club.aero\0" +"qsl.br\0" +"\xe5\xa4\xa7\xe9\x98\xaa.jp\0indiana.museum\0" +"seika.kyoto.jp\0workshop.museum\0gallup\0" +"linz.museum\0financial\0" +"pro.ht\0" +"surf\0" +"konin.pl\0" +"joetsu.niigata.jp\0" +"l\xc3\xa6rdal.no\0" +"shingu.fukuoka.jp\0miyama.mie.jp\0" +"yoita.niigata.jp\0" "ind.br\0" -"from-nv.com\0" -"tokushima.jp\0omaezaki.shizuoka.jp\0" -"hongo.hiroshima.jp\0" -"inderoy.no\0" -"res.in\0" -"\xe5\xb1\xb1\xe5\xbd\xa2.jp\0echizen.fukui.jp\0" -"dr\xc3\xb8""bak.no\0s\xc3\xb8r-fron.no\0" -"teo.br\0yokoze.saitama.jp\0" -"sch.ae\0franziskaner.museum\0undersea.museum\0belau.pw\0" -"kouyama.kagoshima.jp\0" -"zarow.pl\0" -"aviation.museum\0" -"soeda.fukuoka.jp\0" -"skydiving.aero\0teaches-yoga.com\0" -"shinto.gunma.jp\0kure.hiroshima.jp\0" -"yakumo.hokkaido.jp\0minobu.yamanashi.jp\0" -"dclk\0" -"ibaraki.jp\0" -"naklo.pl\0" -"yachimata.chiba.jp\0" -"vanylven.no\0" -"shimodate.ibaraki.jp\0" -"union.aero\0toshiba\0from-ak.com\0" -"kuju.oita.jp\0" -"w.se\0" -"rel.pl\0" -"friuliv-giulia.it\0minamiashigara.kanagawa.jp\0" -"togura.nagano.jp\0" -"!www.ck\0b\xc3\xa1id\xc3\xa1r.no\0" -"miyoshi.aichi.jp\0" -"izumo.shimane.jp\0" -"us-west-1.compute.amazonaws.com\0" -"tsuruoka.yamagata.jp\0" -"finland.museum\0" -"barreau.bj\0tokashiki.okinawa.jp\0" -"television.museum\0\xe0\xb8\x84\xe0\xb8\xad\xe0\xb8\xa1\0" -"tuscany.it\0" -"sport.hu\0fjell.no\0" -"philadelphia.museum\0" -"hasami.nagasaki.jp\0" -"software.aero\0" -"yufu.oita.jp\0" -"kongsvinger.no\0boots\0" -"chikuma.nagano.jp\0" -"london.museum\0" -"s3-ap-northeast-1.amazonaws.com\0" -"ind.gt\0suzu.ishikawa.jp\0" -"arteducation.museum\0eidsberg.no\0vevelstad.no\0" -"\xe5\xb2\x90\xe9\x98\x9c.jp\0fujisato.akita.jp\0hanyu.saitama.jp\0" -"bod\xc3\xb8.no\0" -"is-a-therapist.com\0" -"yoshikawa.saitama.jp\0" -"r\xc3\xb8st.no\0" -"rishiri.hokkaido.jp\0grajewo.pl\0" -"3.bg\0" -"kosai.shizuoka.jp\0kpn\0" -"chuo.chiba.jp\0susono.shizuoka.jp\0" +"sicily.it\0miyazaki.jp\0kawazu.shizuoka.jp\0\xe5\x95\x86\xe6\xa5\xad.tw\0" +"ic.gov.pl\0za.net\0" +"tondabayashi.osaka.jp\0astronomy.museum\0hgtv\0" +"agrar.hu\0suginami.tokyo.jp\0rentals\0" +"kariya.aichi.jp\0usgarden.museum\0\xd8\xb4\xd8\xa8\xd9\x83\xd8\xa9\0" +"asn.au\0" +"fujinomiya.shizuoka.jp\0" +"isa.kagoshima.jp\0muenster.museum\0" +"mp.br\0mashike.hokkaido.jp\0" +"!city.kawasaki.jp\0" +"townnews-staging.com\0" +"novosibirsk.ru\0" +"kunisaki.oita.jp\0from-sd.com\0" +"ris\xc3\xb8r.no\0sanok.pl\0nikolaev.ua\0is-a-chef.com\0" +"sandnessj\xc3\xb8""en.no\0" +"rikuzentakata.iwate.jp\0" +"\xe7\xb6\xb2\xe7\xbb\x9c.hk\0" +"shinyoshitomi.fukuoka.jp\0\xeb\x8b\xb7\xeb\x84\xb7\0" +"sc.ug\0" +"zhytomyr.ua\0" +"abo.pa\0teva\0cloudns.asia\0" +"sc.tz\0" +"mn.it\0urausu.hokkaido.jp\0ee.eu.org\0" +"nanae.hokkaido.jp\0" +"bl.it\0pilots.museum\0zakopane.pl\0" +"minato.tokyo.jp\0database.museum\0" +"ohkura.yamagata.jp\0jessheim.no\0" +"sc.us\0" +"pro.na\0" +"pro.mv\0" +"psc.br\0tamayu.shimane.jp\0j\xc3\xb8lster.no\0" +"ivano-frankivsk.ua\0" +"motorcycles\0" +"eu.meteorapp.com\0cable-modem.org\0" +"muika.niigata.jp\0" +"sener\0" +"com.ac\0kami.kochi.jp\0leangaviika.no\0" +"oppeg\xc3\xa5rd.no\0uk.eu.org\0" +"com.af\0otsuka\0" +"com.ag\0nakamichi.yamanashi.jp\0" +"ind.gt\0" +"com.ai\0bike\0" +"com.al\0" +"\xe7\xbb\x84\xe7\xbb\x87.hk\0kiyosu.aichi.jp\0karatsu.saga.jp\0" +"nishio.aichi.jp\0" +"com.ba\0inf.br\0sirdal.no\0pro.om\0" +"com.ar\0com.bb\0info.ve\0" +"diet\0" +"com.au\0k12.or.us\0" +"com.aw\0" +"com.bh\0\xe7\xa6\x8f\xe4\xba\x95.jp\0minokamo.gifu.jp\0tver.ru\0" +"com.bi\0from-ky.com\0freeboxos.fr\0" +"com.az\0" +"info.vn\0" +"mining.museum\0vevelstad.no\0" +"com.bm\0" +"com.bo\0family.museum\0shangrila\0int.eu.org\0" "fla.no\0" -"roma.it\0kudoyama.wakayama.jp\0global.prod.fastly.net\0" -"gamo.shiga.jp\0" -"gildesk\xc3\xa5l.no\0cloudcontrolled.com\0" -"ind.in\0futsu.nagasaki.jp\0" -"furudono.fukushima.jp\0kashiwara.osaka.jp\0" -"minoh.osaka.jp\0" -"akrehamn.no\0" -"nosegawa.nara.jp\0" -"baths.museum\0likes-pie.com\0" -"krd\0lat\0" -"seki.gifu.jp\0togakushi.nagano.jp\0ens.tn\0" -"rana.no\0law\0" -"juedisches.museum\0national.museum\0" -"sande.m\xc3\xb8re-og-romsdal.no\0" -"bozen.it\0" -"furniture.museum\0malvik.no\0" -"hjelmeland.no\0" -"loabat.no\0" -"info.ve\0" -"kamagaya.chiba.jp\0" -"betainabox.com\0" -"fosnes.no\0from-tn.com\0" -"sakae.chiba.jp\0" -"sohu\0" -"mb.ca\0" -"wanouchi.gifu.jp\0hidaka.kochi.jp\0torahime.shiga.jp\0info.vn\0" -"mari-el.ru\0" -"tsukumi.oita.jp\0" -"sch.id\0kota.aichi.jp\0" -"snillfjord.no\0" -"akkeshi.hokkaido.jp\0" -"kanegasaki.iwate.jp\0takaoka.toyama.jp\0" -"ostre-toten.no\0novosibirsk.ru\0selfip.com\0" -"molise.it\0" -"barrel-of-knowledge.info\0" -"sch.ir\0" -"fuoisku.no\0" -"lds\0" -"oguchi.aichi.jp\0" -"omsk.ru\0" -"nogata.fukuoka.jp\0" -"sch.jo\0guide\0" -"sunagawa.hokkaido.jp\0info.tn\0" -"turystyka.pl\0a.ssl.fastly.net\0" -"nishiarita.saga.jp\0info.tr\0" -"mortgage\0" +"com.br\0ind.in\0" +"com.bs\0" +"com.bt\0inf.cu\0lavagis.no\0" +"kawai.iwate.jp\0" +"pro.pr\0" +"klodzko.pl\0" +"\xe5\x85\xac\xe5\x8f\xb8.cn\0saigawa.fukuoka.jp\0kawatana.nagasaki.jp\0on-aptible.com\0" +"com.by\0com.ci\0s3-fips-us-gov-west-1.amazonaws.com\0" +"com.bz\0" +"tanabe.kyoto.jp\0" +"sk.ca\0winb.gov.pl\0" +"nb.ca\0com.cm\0" +"com.cn\0fiat\0" +"com.co\0" +"higashiizu.shizuoka.jp\0" +"larsson.museum\0" +"lib.sc.us\0" +"br\xc3\xb8nn\xc3\xb8ysund.no\0lib.nj.us\0" +"com.cu\0\xe5\x85\xac\xe5\x8f\xb8.hk\0hapmir.no\0lib.gu.us\0com.de\0" +"is-a-rockstar.com\0" +"com.cw\0aca.pro\0" +"com.cy\0" +"carraramassa.it\0" +"hi.cn\0oiso.kanagawa.jp\0info.tn\0bing\0" +"com.dm\0" +"com.do\0info.tr\0" +"rad\xc3\xb8y.no\0" "info.tt\0" -"\xe5\x8f\xb0\xe7\x81\xa3\0" -"muroran.hokkaido.jp\0" -"tendo.yamagata.jp\0" -"nanbu.tottori.jp\0info.tz\0" -"go.dyndns.org\0" -"is-very-nice.org\0" -"hammarfeasta.no\0" -"williamsburg.museum\0dyndns-wiki.com\0" -"tagawa.fukuoka.jp\0" -"kurotaki.nara.jp\0xerox\0" -"lib.ma.us\0" -"sch.lk\0" -"arkhangelsk.ru\0" -"trentino-s-tirol.it\0" -"\xc3\xa1lt\xc3\xa1.no\0info.ro\0" -"ab.ca\0askoy.no\0" -"malopolska.pl\0" -"aogaki.hyogo.jp\0info.sd\0" -"km.ua\0" -"sch.ly\0" -"onjuku.chiba.jp\0" -"muncie.museum\0" -"kawaminami.miyazaki.jp\0" -"cn-north-1.compute.amazonaws.cn\0" -"vads\xc3\xb8.no\0" -"ushuaia.museum\0vista\0" -"kaminokawa.tochigi.jp\0" -"olbiatempio.it\0shiga.jp\0" -"sener\0" -"sch.ng\0kddi\0endoftheinternet.org\0" -"ichikai.tochigi.jp\0" -"lund.no\0lib.ga.us\0style\0" -"info.pk\0tsaritsyn.ru\0" -"info.pl\0" -"jevnaker.no\0" -"fst.br\0ainan.ehime.jp\0" -"california.museum\0sony\0" -"oketo.hokkaido.jp\0" -"is-a-bruinsfan.org\0" +"com.ec\0" +"si.it\0" +"com.ee\0" +"verbania.it\0" +"com.eg\0bn.it\0info.tz\0" +"com.dz\0kamigori.hyogo.jp\0" +"yamatsuri.fukushima.jp\0" +"pharmaciens.km\0portland.museum\0" +"michigan.museum\0" +"az.us\0" +"is-a-linux-user.org\0" +"com.es\0couchpotatofries.org\0" +"com.et\0" +"voyage\0" +"finn\xc3\xb8y.no\0" +"kumenan.okayama.jp\0fido\0" +"aomori.jp\0" +"info.ro\0" +"minamiashigara.kanagawa.jp\0" +"info.sd\0" +"com.fr\0kasai.hyogo.jp\0ski.museum\0" +"leg.br\0com.ge\0" +"com.gh\0pro.tt\0" +"com.gi\0" +"targi.pl\0" +"elvendrell.museum\0" +"com.gl\0" +"com.gn\0tingvoll.no\0nationwide\0sakura\0\xe5\x95\x86\xe5\xba\x97\0" +"com.gp\0matsusaka.mie.jp\0asn.lv\0stcgroup\0" +"com.gr\0" +"com.gt\0" +"tonsberg.no\0" +"namie.fukushima.jp\0info.pk\0" +"com.gy\0info.pl\0bounty-full.com\0" +"com.hk\0southcarolina.museum\0" +"media.aero\0bjarkoy.no\0folldal.no\0forex\0" +"vadso.no\0" +"com.hn\0daejeon.kr\0" "info.pr\0" -"nt.edu.au\0" -"carrier.museum\0newport.museum\0" -"promo\0" -"mb.it\0mima.tokushima.jp\0" -"info.na\0jan-mayen.no\0" -"narita.chiba.jp\0" -"info.mv\0info.nf\0" -"fuso.aichi.jp\0gmina.pl\0" -"manx.museum\0\xd9\x85\xd9\x84\xd9\x8a\xd8\xb3\xd9\x8a\xd8\xa7\0" -"show.aero\0moskenes.no\0sch.qa\0lib.nh.us\0" -"fnd.br\0cieszyn.pl\0" -"properties\0ru.com\0se.com\0" -"info.nr\0" -"madrid.museum\0love\0" -"hakone.kanagawa.jp\0kita.osaka.jp\0" -"from-de.com\0" -"siena.it\0tateshina.nagano.jp\0" -"cricket\0\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0\0" -"numata.hokkaido.jp\0" -"brussel.museum\0hitra.no\0pyatigorsk.ru\0" -"rifu.miyagi.jp\0ind.tn\0" -"judygarland.museum\0" -"mp.br\0" -"higashitsuno.kochi.jp\0" +"myfritz.net\0" +"okazaki.aichi.jp\0" +"com.hr\0pro.vn\0" +"com.ht\0" +"urbino-pesaro.it\0" +"\xe5\xae\xae\xe5\xb4\x8e.jp\0" +"shijonawate.osaka.jp\0saitama.saitama.jp\0\xe5\x98\x89\xe9\x87\x8c\0" +"magazine.aero\0duckdns.org\0" +"com.im\0choshi.chiba.jp\0mosvik.no\0" +"info.na\0rana.no\0" +"com.io\0mashiki.kumamoto.jp\0lib.nh.us\0azurewebsites.net\0" +"com.iq\0" +"com.is\0info.mv\0info.nf\0career\0" +"schlesisches.museum\0" +"urn.arpa\0uw.gov.pl\0" +"hk.cn\0info.ni\0" +"\xd8\xb3\xd9\x88\xd8\xb1\xd9\x8a\xd8\xa7\0theguardian\0" +"odawara.kanagawa.jp\0" +"\xd8\xb3\xd9\x88\xd8\xb1\xd9\x8a\xd8\xa9\0statebank\0" +"jaguar\0weather\0" +"hole.no\0warman\0" +"com.jo\0info.nr\0" +"vodka\0" +"sande.more-og-romsdal.no\0apple\0" +"kvits\xc3\xb8y.no\0" +"higashihiroshima.hiroshima.jp\0sauda.no\0" +"yoshikawa.saitama.jp\0com.kg\0" +"humanities.museum\0ask\xc3\xb8y.no\0" +"com.ki\0mn.us\0" +"gu.us\0" +"plc.co.im\0com.km\0" "info.la\0" -"fr.it\0" -"zone\0" -"si.it\0elblag.pl\0" -"baikal.ru\0" -"toyotsu.fukuoka.jp\0" -"building.museum\0sorfold.no\0" -"is-a-geek.com\0" -"eidsvoll.no\0sch.sa\0" -"institute\0" -"dazaifu.fukuoka.jp\0" -"chukotka.ru\0rivne.ua\0domains\0from-sd.com\0ro.com\0" -"mihara.kochi.jp\0asahi.nagano.jp\0" -"stockholm.museum\0chernigov.ua\0" -"potenza.it\0" -"pagespeedmobilizer.com\0" -"shoo.okayama.jp\0" -"bible.museum\0sherbrooke.museum\0" -"nesset.no\0" -"chloe\0" -"anpachi.gifu.jp\0aibetsu.hokkaido.jp\0wlocl.pl\0" -"mi.it\0" -"elverum.no\0" -"fredrikstad.no\0markets\0" -"iglesias-carbonia.it\0" -"nikaho.akita.jp\0miyashiro.saitama.jp\0" -"asmatart.museum\0" -"tsushima.nagasaki.jp\0" -"hekinan.aichi.jp\0" -"lib.ms.us\0lib.nc.us\0" -"inazawa.aichi.jp\0" -"info.ki\0agdenes.no\0" -"medizinhistorisches.museum\0furniture\0" -"ozora.hokkaido.jp\0wakayama.wakayama.jp\0" -"gyokuto.kumamoto.jp\0" -"fishing\0" -"hyogo.jp\0" -"stj\xc3\xb8rdal.no\0" -"kutno.pl\0" -"ulvik.no\0" -"ofunato.iwate.jp\0restaurant\0" -"americanantiques.museum\0paderborn.museum\0" -"sp.it\0yokaichiba.chiba.jp\0" -"kurgan.ru\0" -"hakata.fukuoka.jp\0man\0" -"entomology.museum\0" -"otoyo.kochi.jp\0" -"lel.br\0" -"zoology.museum\0samnanger.no\0" -"obama.nagasaki.jp\0" -"oshu.iwate.jp\0miasa.nagano.jp\0" -"rnrt.tn\0" -"money.museum\0" -"\xe5\xb1\xb1\xe5\x8f\xa3.jp\0" -"yahiko.niigata.jp\0kadena.okinawa.jp\0" -"\xc3\xb8ygarden.no\0" -"v\xc3\xa5gan.no\0" -"trentino.it\0" -"\xc3\xb8rskog.no\0" -"hoyanger.no\0sb.ua\0" -"vestby.no\0" -"yurihonjo.akita.jp\0" -"fjaler.no\0cc.ks.us\0" -"\xd9\x82\xd8\xb7\xd8\xb1\0" -"ltd\0" -"rockart.museum\0" -"lib.as.us\0" -"hashima.gifu.jp\0" -"agano.niigata.jp\0ath.cx\0" -"gangaviika.no\0" -"hammerfest.no\0" -"saskatchewan.museum\0est-mon-blogueur.com\0" -"hoylandet.no\0stockholm\0" -"tatsuno.nagano.jp\0" -"georgia.museum\0" -"kherson.ua\0" -"shiroishi.miyagi.jp\0tomi.nagano.jp\0" -"computerhistory.museum\0" -"kofu.yamanashi.jp\0" -"meo\0" -"setagaya.tokyo.jp\0prochowice.pl\0" -"farm.museum\0" -"fujikawa.yamanashi.jp\0" -"\xe9\xa3\x9e\xe5\x88\xa9\xe6\xb5\xa6\0dontexist.net\0" -"workshop.museum\0toray\0" -"kosaka.akita.jp\0shijonawate.osaka.jp\0takanezawa.tochigi.jp\0" -"k12.ak.us\0" -"nakamura.kochi.jp\0ochi.kochi.jp\0iizuna.nagano.jp\0" -"midtre-gauldal.no\0" -"k12.md.us\0" -"inuyama.aichi.jp\0" -"kumatori.osaka.jp\0" -"ako.hyogo.jp\0" -"tgory.pl\0" -"ato.br\0higashikawa.hokkaido.jp\0akagi.shimane.jp\0bbs.tr\0" -"newspaper.museum\0oregontrail.museum\0" -"gb.net\0" -"\xe7\xb6\xb2\xe8\xb7\xaf.tw\0" -"ap.it\0" -"zaporizhzhia.ua\0" -"taka.hyogo.jp\0" -"karate.museum\0is-a-geek.org\0" -"from-ks.com\0" -"fage\0misconfused.org\0" -"hn.cn\0" -"palana.ru\0" +"design.museum\0" +"com.kp\0" +"com.la\0" +"ono.hyogo.jp\0com.lb\0oregontrail.museum\0" +"\xe4\xba\xac\xe9\x83\xbd.jp\0com.lc\0" +"takayama.gunma.jp\0cyou\0bnr.la\0" +"ebina.kanagawa.jp\0kawachinagano.osaka.jp\0" +"gotpantheon.com\0" +"takata.fukuoka.jp\0tarama.okinawa.jp\0" +"com.ky\0" +"com.kz\0inf.mk\0" +"com.lk\0" "kisarazu.chiba.jp\0" -"vaapste.no\0" -"namie.fukushima.jp\0ichikawa.hyogo.jp\0" -"cn.com\0" -"stpetersburg.museum\0nord-fron.no\0iamallama.com\0" -"fam.pk\0" -"skjervoy.no\0" -"beskidy.pl\0" -"siellak.no\0" -"mi.th\0" -"mil\0" -"culturalcenter.museum\0tsk.ru\0odessa.ua\0" -"otama.fukushima.jp\0" +"com.lr\0" +"marylhurst.museum\0" +"com.lv\0from-ia.com\0" +"piedmont.it\0goshiki.hyogo.jp\0com.mg\0zero\0" +"mizusawa.iwate.jp\0" +"com.ly\0" +"com.mk\0" +"com.ml\0sandoy.no\0" +"atlanta.museum\0george\0" +"imperia.it\0com.mo\0" +"com.na\0" +"ind.tn\0" +"com.ms\0is-very-sweet.org\0" +"com.mt\0" +"com.mu\0" +"naka.ibaraki.jp\0com.mv\0com.nf\0" +"giessen.museum\0com.mw\0com.ng\0film\0" +"com.mx\0" +"vic.edu.au\0com.my\0com.ni\0sa-east-1.compute.amazonaws.com\0" +"hakui.ishikawa.jp\0" +"chikujo.fukuoka.jp\0" +"okuizumo.shimane.jp\0" +"kota.aichi.jp\0" +"com.nr\0" +"nf.ca\0" +"kids.museum\0" +"fukagawa.hokkaido.jp\0" +"info.ki\0" +"dish\0" +"tana.no\0" +"mr.no\0" +"kerryproperties\0" +"com.om\0" +"hiphop\0" +"com.pa\0" +"cc.ut.us\0" +"sdn.gov.pl\0" +"com.pe\0" +"com.pf\0" +"com.ph\0" +"gs.vf.no\0" +"showtime\0" +"mt.it\0makinohara.shizuoka.jp\0com.pk\0" +"nishikata.tochigi.jp\0com.pl\0" +"br.it\0cb.it\0" +"numata.hokkaido.jp\0" +"com.qa\0rubtsovsk.ru\0" +"com.pr\0" +"zgora.pl\0com.ps\0s3-external-2.amazonaws.com\0" +"com.pt\0certmgr.org\0" +"etajima.hiroshima.jp\0" +"com.py\0" +"cn.eu.org\0" +"mobi.gp\0" +"ichikawa.hyogo.jp\0uchihara.ibaraki.jp\0" +"psi.br\0nittedal.no\0" +"hayakawa.yamanashi.jp\0yorkshire.museum\0" +"valleeaoste.it\0" +"\xe5\xba\x83\xe5\xb3\xb6.jp\0tanabe.wakayama.jp\0com.re\0chloe\0" +"balashov.su\0loans\0" +"selbu.no\0" +"niigata.niigata.jp\0" +"paris.museum\0vantaa.museum\0" +"kembuchi.hokkaido.jp\0" +"com.ro\0" +"com.sa\0poltava.ua\0mymediapc.net\0" +"com.sb\0" +"trentino-sud-tirol.it\0com.sc\0" +"com.sd\0" +"pmn.it\0com.ru\0com.se\0" +"com.rw\0com.sg\0homes\0" +"com.sh\0" +"naie.hokkaido.jp\0" +"fussa.tokyo.jp\0" +"com.sl\0" +"com.sn\0" +"com.so\0fire\0servegame.com\0" +"leclerc\0" +"holmestrand.no\0dedyn.io\0" +"com.st\0" +"com.sv\0" +"bio.br\0ternopil.ua\0" +"githubcloud.com\0" +"com.sy\0" +"trentino-alto-adige.it\0com.tj\0" +"blockbuster\0" +"com.tm\0" +"com.tn\0\xe7\xbd\x91\xe5\x9d\x80\0" +"joboji.iwate.jp\0com.to\0" +"handson.museum\0society.museum\0com.ua\0dyndns-free.com\0" +"com.tr\0fish\0" +"miyakonojo.miyazaki.jp\0" +"nishi.fukuoka.jp\0com.tt\0" +"nichinan.tottori.jp\0lib.mt.us\0lib.nd.us\0is-a-chef.net\0" +"shimotsuma.ibaraki.jp\0kamikitayama.nara.jp\0com.tw\0com.ug\0" +"tsugaru.aomori.jp\0" +"xz.cn\0" +"vegas\0" +"kuju.oita.jp\0" +"kunohe.iwate.jp\0" +"takarazuka.hyogo.jp\0geek.nz\0" +"stv.ru\0" +"com.vc\0" +"so.it\0com.ve\0" +"anamizu.ishikawa.jp\0semine.miyagi.jp\0itoman.okinawa.jp\0" +"ama.aichi.jp\0" +"bt.it\0" +"iwanai.hokkaido.jp\0com.uy\0com.vi\0" +"kunst.museum\0com.uz\0" +"nyuzen.toyama.jp\0" +"dontexist.net\0" +"com.vn\0" +"kitaura.miyazaki.jp\0" +"hi.us\0" +"brussel.museum\0" +"austevoll.no\0" +"com.vu\0" +"oygarden.no\0" +"tomika.gifu.jp\0kumatori.osaka.jp\0lidl\0" +"chikuho.fukuoka.jp\0" +"cy.eu.org\0" +"philips\0" +"kawai.nara.jp\0" +"forum\0" +"com.ws\0" +"munakata.fukuoka.jp\0tokuyama.yamaguchi.jp\0dyr\xc3\xb8y.no\0" +"deloitte\0" +"gemological.museum\0" +"airport.aero\0" +"\xc3\xa1laheadju.no\0northwesternmutual\0" +"higashikagura.hokkaido.jp\0glade\0" +"toei.aichi.jp\0mombetsu.hokkaido.jp\0" +"press\0za.org\0" +"servegame.org\0" +"k12.vi.us\0life\0" +"shimokawa.hokkaido.jp\0ritto.shiga.jp\0" +"!city.sapporo.jp\0" +"cz.eu.org\0" +"leitungsen.de\0worse-than.tv\0" +"yokoshibahikari.chiba.jp\0miyoshi.saitama.jp\0" +"feedback\0" +"kaszuby.pl\0" +"pesaro-urbino.it\0" +"moriya.ibaraki.jp\0" +"furudono.fukushima.jp\0" +"tateyama.toyama.jp\0" +"\xe5\xb3\xb6\xe6\xa0\xb9.jp\0brandywinevalley.museum\0sogndal.no\0" +"tachikawa.tokyo.jp\0alaheadju.no\0vestvagoy.no\0" +"\xe5\xae\xb6\xe9\x9b\xbb\0" +"zentsuji.kagawa.jp\0" +"oita.jp\0\xc3\xa1lt\xc3\xa1.no\0dyndns-ip.com\0" +"workinggroup.aero\0com.zm\0" +"corvette.museum\0for-more.biz\0" +"rimini.it\0mihama.chiba.jp\0" +"hm.no\0" +"sm.ua\0\xe9\xa6\x99\xe6\xb8\xaf\0" +"ath.cx\0" +"bungotakada.oita.jp\0lutsk.ua\0dk.eu.org\0" +"hirara.okinawa.jp\0" +"media.hu\0bharti\0" +"ta.it\0ipiranga\0" +"is-slick.com\0" +"nico\0" +"marumori.miyagi.jp\0" +"arts.co\0tsuruta.aomori.jp\0lancome\0" +"gliding.aero\0inatsuki.fukuoka.jp\0" +"nome.pt\0familyds.net\0" +"naruto.tokushima.jp\0mt.us\0nd.us\0" +"kakinoki.shimane.jp\0" +"is-an-entertainer.com\0" +"port.fr\0gotdns.ch\0" +"bydgoszcz.pl\0" +"r\xc3\xb8st.no\0" +"ranzan.saitama.jp\0" +"marburg.museum\0komi.ru\0" +"wellbeingzone.co.uk\0" +"chikuzen.fukuoka.jp\0hjartdal.no\0" +"ikeda.fukui.jp\0" +"contemporaryart.museum\0" +"ostroleka.pl\0like\0" +"\xc3\xb8vre-eiker.no\0dyndns-server.com\0" "ishikawa.fukushima.jp\0" -"nu.ca\0" -"omiya.saitama.jp\0" -"bike\0" -"hirono.iwate.jp\0digital\0read\0" -"exhibition.museum\0" -"tn.it\0hita.oita.jp\0" -"inder\xc3\xb8y.no\0" -"fail\0" -"otsuka\0" -"k-uralsk.ru\0" -"tamaki.mie.jp\0florist\0" -"mi.us\0place\0" -"yono.saitama.jp\0movistar\0" -"sn\xc3\xa5""ase.no\0k12.ma.us\0" -"ashibetsu.hokkaido.jp\0mizusawa.iwate.jp\0isa.kagoshima.jp\0" -"farsund.no\0" -"haebaru.okinawa.jp\0" -"gs.aa.no\0" -"hyllestad.no\0" -"itako.ibaraki.jp\0" -"pics\0" -"godo.gifu.jp\0" -"fauske.no\0frei.no\0dyndns.info\0" -"bg.it\0" -"matsumoto.nagano.jp\0" -"kids.museum\0gaivuotna.no\0" -"dell\0" -"cc.ma.us\0" -"\xe5\xb2\xa9\xe6\x89\x8b.jp\0yamagata.ibaraki.jp\0" -"austevoll.no\0mma\0" -"br.com\0" -"fuchu.hiroshima.jp\0ostrowiec.pl\0podlasie.pl\0" -"nature.museum\0" -"usdecorativearts.museum\0bing\0" -"matsudo.chiba.jp\0niimi.okayama.jp\0" -"federation.aero\0brussels\0" -"ancona.it\0piaget\0" -"k12.ga.us\0" -"jorpeland.no\0camera\0" -"preservation.museum\0" -"vibo-valentia.it\0" -"tochigi.jp\0" -"salerno.it\0" -"iwade.wakayama.jp\0kiwi.nz\0" -"pvt.ge\0gifts\0globo\0" -"honai.ehime.jp\0" -"childrensgarden.museum\0spreadbetting\0" -"hannan.osaka.jp\0" -"raholt.no\0cc.ga.us\0from-ut.com\0" -"cartier\0maif\0" -"kolobrzeg.pl\0" -"moe\0" -"bungotakada.oita.jp\0" -"moi\0" -"otaru.hokkaido.jp\0\xe8\xb0\xb7\xe6\xad\x8c\0" -"akita.jp\0" -"carboniaiglesias.it\0" -"d.bg\0" -"mov\0" -"gs.ah.no\0marnardal.no\0fans\0" -"tysnes.no\0mordovia.ru\0" -"bearalv\xc3\xa1hki.no\0engineering\0compute-1.amazonaws.com\0" -"is-a-nascarfan.com\0" -"\xd0\xb8\xd0\xba\xd0\xbe\xd0\xbc.museum\0" -"friuli-venezia-giulia.it\0bn.it\0udono.mie.jp\0" -"oslo.no\0" -"nu.it\0mormon\0" -"freiburg.museum\0hamar.no\0" -"kita.tokyo.jp\0" -"minamifurano.hokkaido.jp\0" -"bible\0" -"esp.br\0" -"is-a-democrat.com\0" -"narusawa.yamanashi.jp\0" -"uonuma.niigata.jp\0wien\0" -"on-the-web.tv\0" -"karm\xc3\xb8y.no\0" -"mosjoen.no\0" -"koya.wakayama.jp\0" -"chernovtsy.ua\0holiday\0from-mi.com\0" -"square.museum\0is-a-patsfan.org\0" -"mihama.fukui.jp\0" -"clothing\0" -"reit\0" -"historichouses.museum\0gjovik.no\0desi\0" -"cam.it\0asuke.aichi.jp\0" -"kizu.kyoto.jp\0" -"syzran.ru\0eu-central-1.compute.amazonaws.com\0" -"ama.shimane.jp\0" -"farm\0" -"jaworzno.pl\0" -"emp.br\0" -"k12.ar.us\0" -"oto.fukuoka.jp\0takahagi.ibaraki.jp\0elk.pl\0" -"k12.mo.us\0" -"soo.kagoshima.jp\0umaji.kochi.jp\0" -"farmequipment.museum\0github.io\0" -"mashiki.kumamoto.jp\0" -"k.bg\0" -"mtn\0" -"skole.museum\0deals\0" -"is-a-student.com\0" -"friuli-ve-giulia.it\0" -"force.museum\0nec\0" -"fast\0walter\0" -"pharmacien.fr\0ce.it\0hakuba.nagano.jp\0" -"s3-eu-west-1.amazonaws.com\0" -"lucca.it\0" -"nakadomari.aomori.jp\0" -"antiques.museum\0resistance.museum\0cc.mo.us\0" -"troandin.no\0vyatka.ru\0" -"net\0microsoft\0" -"civilisation.museum\0" -"komatsushima.tokushima.jp\0" -"bronnoysund.no\0new\0" -"nanbu.yamanashi.jp\0" -"vic.au\0\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\xd9\x87\0" -"shitara.aichi.jp\0kamikawa.hokkaido.jp\0nogi.tochigi.jp\0" -"tn.us\0pink\0" -"yokote.akita.jp\0" -"oz.au\0k12.tx.us\0physio\0" -"\xe0\xa6\xad\xe0\xa6\xbe\xe0\xa6\xb0\xe0\xa6\xa4\0" -"stalbans.museum\0productions\0" -"fvg.it\0" -"riik.ee\0aland.fi\0" -"okazaki.aichi.jp\0" -"gs.tm.no\0" -"*.sapporo.jp\0" -"children.museum\0dali.museum\0" -"ngo\0" -"ritto.shiga.jp\0" -"wiki\0dyndns-at-home.com\0" -"vc.it\0" -"rent\0" -"berlevag.no\0" -"bryne.no\0\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\xd8\xa9\0nhk\0" -"eng.br\0carrara-massa.it\0" -"penza.ru\0" -"lib.in.us\0" -"onomichi.hiroshima.jp\0" -"k12.oh.us\0" -"ebino.miyazaki.jp\0" -"deatnu.no\0lib.wi.us\0" -"wa.au\0r.bg\0us.org\0" -"univ.sn\0" -"seiro.niigata.jp\0" -"brindisi.it\0" -"is-a-hard-worker.com\0" -"rankoshi.hokkaido.jp\0" -"archi\0" -"dnsdojo.org\0from-ia.com\0" -"kimitsu.chiba.jp\0" -"chernihiv.ua\0" -"cl.it\0toride.ibaraki.jp\0" -"bjarkoy.no\0" -"bu.no\0" -"pc.it\0" -"karasjok.no\0" -"ol.no\0" -"kesennuma.miyagi.jp\0katsuragi.nara.jp\0" -"tourism.tn\0" -"bolzano.it\0" -"act.au\0trondheim.no\0" -"trentinosuedtirol.it\0suwalki.pl\0" -"bahccavuotna.no\0abo.pa\0" -"yamagata.gifu.jp\0canon\0" -"\xe0\xae\x9a\xe0\xae\xbf\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xae\xaa\xe0\xaf\x8d\xe0\xae\xaa\xe0\xaf\x82\xe0\xae\xb0\xe0\xaf\x8d\0horse\0" -"viajes\0" -"repair\0\xe6\x89\x8b\xe8\xa1\xa8\0" -"history.museum\0" -"gs.hm.no\0" -"\xe7\xa6\x8f\xe4\xba\x95.jp\0" -"inashiki.ibaraki.jp\0" -"us.na\0osoyro.no\0fedje.no\0" -"sakai.fukui.jp\0" -"air-surveillance.aero\0engineer.aero\0pri.ee\0" -"is.it\0namikata.ehime.jp\0" -"warabi.saitama.jp\0" -"strand.no\0" -"lecco.it\0" -"tatar\0" -"shinjo.yamagata.jp\0" -"sakahogi.gifu.jp\0" -"aarborte.no\0cityeats\0" -"\xe7\xbe\xa4\xe9\xa6\xac.jp\0rest\0" -"skien.no\0" -"kasai.hyogo.jp\0hitachinaka.ibaraki.jp\0" -"costume.museum\0photography.museum\0froya.no\0grozny.ru\0simbirsk.ru\0" -"barletta-trani-andria.it\0sells-it.net\0" -"y.bg\0" -"art.museum\0" -"karpacz.pl\0" -"sanok.pl\0" -"gs.nt.no\0" -"fortworth.museum\0murmansk.ru\0" -"mansion.museum\0" -"cs.it\0" -"nishiokoppe.hokkaido.jp\0yaese.okinawa.jp\0" -"santacruz.museum\0googleapis.com\0" -"servebbs.net\0" -"cc.nm.us\0" -"asso.fr\0lupin\0" -"eigersund.no\0" -"sukumo.kochi.jp\0ketrzyn.pl\0" -"compute.amazonaws.com\0" -"nagara.chiba.jp\0" -"bokn.no\0" -"mino.gifu.jp\0" -"author.aero\0" -"erni\0" -"asso.gp\0iz.hr\0" -"otsuki.yamanashi.jp\0" -"posts-and-telecommunications.museum\0marker.no\0" -"is-into-cars.com\0" -"flynnhub.com\0" -"kr\xc3\xa5""anghke.no\0" -"nakamichi.yamanashi.jp\0" -"tokke.no\0" -"pc.pl\0" -"etne.no\0community\0" -"hol.no\0" -"asso.ht\0tatsuno.hyogo.jp\0tokamachi.niigata.jp\0" -"valer.ostfold.no\0d.se\0" -"agrar.hu\0" -"nagareyama.chiba.jp\0niigata.niigata.jp\0" -"ap-northeast-1.compute.amazonaws.com\0" -"qh.cn\0sardinia.it\0tozawa.yamagata.jp\0" -"oe.yamagata.jp\0" -"scotland.museum\0kalmykia.ru\0wedding\0" -"med.br\0" -"nra\0" -"asso.bj\0tabayama.yamanashi.jp\0" -"obi\0" -"cci.fr\0ome.tokyo.jp\0" -"sakuho.nagano.jp\0" -"per.la\0s\xc3\xa1l\xc3\xa1t.no\0" -"murata.miyagi.jp\0" -"airport.aero\0" -"cz.it\0" -"friulive-giulia.it\0koeln\0" -"asso.ci\0birthplace.museum\0nrw\0" -"naka.hiroshima.jp\0shiranuka.hokkaido.jp\0" -"bamble.no\0" -"jx.cn\0mibu.tochigi.jp\0" -"watchandclock.museum\0g\xc3\xa1ls\xc3\xa1.no\0" -"shibata.niigata.jp\0!teledata.mz\0" -"nanmoku.gunma.jp\0" -"med.ec\0aquarium.museum\0il.us\0outsystemscloud.com\0" -"med.ee\0mandal.no\0verran.no\0" -"kumamoto.jp\0is-a-geek.net\0" -"flekkefjord.no\0" -"shinonsen.hyogo.jp\0fudai.iwate.jp\0" -"\xe4\xbf\xa1\xe6\x81\xaf\0" -"nishiaizu.fukushima.jp\0" -"sumy.ua\0" -"per.nf\0" -"chiba.jp\0ntt\0" -"asso.dz\0" -"badaddja.no\0cc.id.us\0\xd8\xa8\xd8\xa7\xd8\xb2\xd8\xa7\xd8\xb1\0" -"k.se\0" -"niki.hokkaido.jp\0higashikagawa.kagawa.jp\0" -"koeln.museum\0" -"andoy.no\0" -"frana.no\0\xd9\x83\xd9\x88\xd9\x85\0" -"katashina.gunma.jp\0" -"tourism.pl\0" -"aremark.no\0" -"chita.ru\0" -"tarumizu.kagoshima.jp\0" -"\xe7\xbd\x91\xe7\xb5\xa1.hk\0orkanger.no\0" -"tempioolbia.it\0saotome.st\0" -"kawakita.ishikawa.jp\0" -"karikatur.museum\0uz.ua\0hermes\0" -"friuli-vgiulia.it\0" -"textile.museum\0" -"iwatsuki.saitama.jp\0" -"cc.ok.us\0" -"med.ht\0" -"\xe8\xaf\xba\xe5\x9f\xba\xe4\xba\x9a\0" -"tsushima.aichi.jp\0ide.kyoto.jp\0" -"abira.hokkaido.jp\0actor\0" -"\xe7\xb5\x84\xe7\xbb\x87.hk\0" -"tsuchiura.ibaraki.jp\0" -"dep.no\0" -"republican\0" -"vefsn.no\0" -"luxembourg.museum\0" -"chikuho.fukuoka.jp\0" +"um.gov.pl\0industries\0" +"b\xc3\xa5""d\xc3\xa5""ddj\xc3\xa5.no\0" +"koga.fukuoka.jp\0tsukui.kanagawa.jp\0" +"sumida.tokyo.jp\0info.zm\0" +"tohma.hokkaido.jp\0shika.ishikawa.jp\0" +"ilovecollege.info\0" +"gojome.akita.jp\0tsuchiura.ibaraki.jp\0" +"shikokuchuo.ehime.jp\0" +"pulawy.pl\0" +"dr\xc3\xb8""bak.no\0muos\xc3\xa1t.no\0" +"cremona.it\0" +"de.eu.org\0" +"\xe5\x98\x89\xe9\x87\x8c\xe5\xa4\xa7\xe9\x85\x92\xe5\xba\x97\0" +"mx.na\0" +"oster\xc3\xb8y.no\0" +"nl.ca\0" +"minami.fukuoka.jp\0r\xc3\xb8yken.no\0" +"t\xc3\xb8nsberg.no\0" +"mihama.fukui.jp\0kodaira.tokyo.jp\0limo\0" +"bv.nl\0lind\xc3\xa5s.no\0" +"livorno.it\0" +"yn.cn\0" +"ascolipiceno.it\0sm\xc3\xb8la.no\0\xe6\x96\xb0\xe9\x97\xbb\0" +"is-not-certified.com\0" +"kanmaki.nara.jp\0honda\0" +"link\0" +"roma.it\0nowruz\0" +"prof.pr\0" +"dallas.museum\0" +"iron.museum\0futbol\0hk.org\0" +"ss.it\0" "nasu.tochigi.jp\0" -"intelligence.museum\0nyc\0" -"is-an-actress.com\0" -"\xe7\xa6\x8f\xe5\xb2\xa1.jp\0" -"vda.it\0" -"\xe6\xbb\x8b\xe8\xb3\x80.jp\0worse-than.tv\0" -"gliding.aero\0notaires.km\0lea\xc5\x8bgaviika.no\0" -"r.se\0per.sg\0" -"taxi.br\0" -"elvendrell.museum\0" -"kariwa.niigata.jp\0" -"science.museum\0from-ms.com\0from-nc.com\0" -"cesena-forli.it\0" -"dc.us\0dontexist.org\0" -"kishiwada.osaka.jp\0" -"yoshioka.gunma.jp\0" -"k12.dc.us\0" -"toyoake.aichi.jp\0seranishi.hiroshima.jp\0noda.iwate.jp\0" -"cagliari.it\0buyshouses.net\0" -"aso.kumamoto.jp\0" -"sauda.no\0" -"\xe5\x85\xb5\xe5\xba\xab.jp\0nisshin.aichi.jp\0" -"vegarshei.no\0" -"m\xc4\x81ori.nz\0" -"overhalla.no\0voagat.no\0" -"indian.museum\0railroad.museum\0nsk.ru\0is-leet.com\0" -"inf.br\0nakama.fukuoka.jp\0" -"readmyblog.org\0" -"bergamo.it\0\xe5\xa5\x88\xe8\x89\xaf.jp\0" -"ushiku.ibaraki.jp\0" -"med.ly\0" -"tahara.aichi.jp\0" -"ringsaker.no\0cc.or.us\0" -"aga.niigata.jp\0" -"property\0" -"hinohara.tokyo.jp\0" -"ac\0" -"ad\0kuji.iwate.jp\0kinder\0compute.amazonaws.cn\0" +"other.nf\0" +"ch.it\0sykkylven.no\0loginto.me\0" +"author\0" +"aid.pl\0pics\0" +"us.gov.pl\0kustanai.ru\0" +"nkz.ru\0" +"yaroslavl.ru\0" +"koeln\0" +"padova.it\0" +"vard\xc3\xb8.no\0" +"shiga.jp\0" +"gaular.no\0rennesoy.no\0" +"panama.museum\0" +"yonezawa.yamagata.jp\0media.pl\0ciscofreak.com\0" +"tosa.kochi.jp\0ogawa.nagano.jp\0holt\xc3\xa5len.no\0" +"itayanagi.aomori.jp\0nakamura.kochi.jp\0askvoll.no\0" +"batsfjord.no\0" +"yosemite.museum\0homeip.net\0" +"nike\0" +"tempioolbia.it\0sandvikcoromant\0" +"iwade.wakayama.jp\0" +"kaufen\0" +"shinjuku.tokyo.jp\0presidio.museum\0gloppen.no\0is-a-celticsfan.org\0" +"bahccavuotna.no\0lezajsk.pl\0" +"minamisanriku.miyagi.jp\0" +"*.sapporo.jp\0" +"tomi.nagano.jp\0" +"friuliveneziagiulia.it\0bando.ibaraki.jp\0" +"meiwa.gunma.jp\0" +"k12.fl.us\0" +"sos.pl\0gotdns.org\0" +"bashkiria.ru\0" +"troitsk.su\0" +"kuban.ru\0" +"nakhodka.ru\0" +"moriyama.shiga.jp\0motorcycle.museum\0" +"crew.aero\0" +"luster.no\0podhale.pl\0hockey\0" +"bahn.museum\0" +"tas.gov.au\0" +"izumizaki.fukushima.jp\0" +"b\xc3\xa1jddar.no\0*.magentosite.cloud\0" +"bashkiria.su\0" +"satosho.okayama.jp\0kvam.no\0discount\0" +"cosenza.it\0" +"orkanger.no\0" +"v\xc3\xa5ler.hedmark.no\0" +"tobishima.aichi.jp\0" +"vang.no\0" +"higashine.yamagata.jp\0lib.mn.us\0" +"arao.kumamoto.jp\0center.museum\0" +"doomdns.com\0" +"n\xc3\xb8tter\xc3\xb8y.no\0arts.ve\0" +"\xc3\xa5lesund.no\0mobi.tt\0pamperedchef\0" +"valleaosta.it\0" +"kunstunddesign.museum\0gdynia.pl\0" +"valer.ostfold.no\0rich\0" +"mobi.tz\0" +"te.it\0udono.mie.jp\0" +"abarth\0" +"bz.it\0" +"ca.eu.org\0" +"\xe3\x82\xb3\xe3\x83\xa0\0" +"sondrio.it\0for-some.biz\0" +"wa.gov.au\0agro.pl\0" +"hanno.saitama.jp\0asahi.toyama.jp\0" +"taka.hyogo.jp\0nh.us\0" +"noda.iwate.jp\0" +"hongo.hiroshima.jp\0omiya.saitama.jp\0\xd0\xb1\xd0\xb5\xd0\xbb\0" +"cuneo.it\0yachiyo.chiba.jp\0" +"troandin.no\0" +"is-a-cpa.com\0" +"mikasa.hokkaido.jp\0" +"\xe9\x95\xb7\xe5\xb4\x8e.jp\0smola.no\0glass\0" +"kanoya.kagoshima.jp\0" +"int.ar\0" +"tel.tr\0" +"live\0" +"mitake.gifu.jp\0" +"nakano.nagano.jp\0" +"is-a-nurse.com\0" +"int.az\0matera.it\0hs.kr\0\xc3\xb8rskog.no\0" +"yuzawa.niigata.jp\0" +"lowicz.pl\0" +"int.bo\0grondar.za\0" +"eu-2.evennode.com\0" +"volgograd.ru\0" +"mazowsze.pl\0" +"is-into-games.com\0" +"is-found.org\0" +"vossevangen.no\0" +"int.ci\0yonabaru.okinawa.jp\0" +"resistance.museum\0" +"ginan.gifu.jp\0tiaa\0" +"ayase.kanagawa.jp\0ise.mie.jp\0chichibu.saitama.jp\0athleta\0" +"int.co\0" +"langev\xc3\xa5g.no\0" +"oguni.kumamoto.jp\0" +"sec.ps\0" +"chita.aichi.jp\0" +"nakagyo.kyoto.jp\0cloudcontrolled.com\0" +"inderoy.no\0" +"monmouth.museum\0dep.no\0mazury.pl\0" +"gliwice.pl\0" +"jan-mayen.no\0arts.ro\0" +"ohira.miyagi.jp\0" +"\xe5\xa5\x88\xe8\x89\xaf.jp\0law.pro\0" +"riik.ee\0mobi.na\0volda.no\0" +"shisui.chiba.jp\0" +"kyuragi.saga.jp\0\xe6\x96\xb0\xe5\x8a\xa0\xe5\x9d\xa1\0home.dyndns.org\0" +"rotorcraft.aero\0mobi.ng\0nl.no\0" +"kasuga.hyogo.jp\0" +"\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86.ir\0ping\0" +"jfk.museum\0" +"vestv\xc3\xa5g\xc3\xb8y.no\0fam.pk\0healthcare\0pink\0" +"rome.it\0fukushima.hokkaido.jp\0nord-fron.no\0" +"magadan.ru\0" +"nakayama.yamagata.jp\0" +"val-daosta.it\0" +"kiyose.tokyo.jp\0" +"notodden.no\0" +"cl.it\0miami\0" +"modena.it\0" +"hitachiomiya.ibaraki.jp\0" +"kyowa.hokkaido.jp\0yakage.okayama.jp\0" +"\xe6\x96\xb0\xe6\xbd\x9f.jp\0mer\xc3\xa5ker.no\0simple-url.com\0" +"cd.eu.org\0" +"nj.us\0schwarz\0" +"ia.us\0eu-1.evennode.com\0" +"oldnavy\0" +"vladivostok.ru\0" +"barrel-of-knowledge.info\0" +"hirosaki.aomori.jp\0" +"aeroclub.aero\0navigation.aero\0" +"santafe.museum\0" +"dellogliastra.it\0\xe6\x94\xbf\xe5\xba\x9c\0" +"asnes.no\0" +"vao.it\0yugawa.fukushima.jp\0" +"chuo.osaka.jp\0arts.nf\0tokyo\0" +"ap-southeast-1.compute.amazonaws.com\0" +"notogawa.shiga.jp\0" +"tennis\0us.com\0" +"holdings\0" +"beats\0lifestyle\0" +"redumbrella\0issmarterthanyou.com\0" +"britishcolumbia.museum\0" +"maizuru.kyoto.jp\0" +"k12.va.us\0" +"encyclopedic.museum\0posts-and-telecommunications.museum\0k12.pr.us\0" +"youth.museum\0" +"barletta-trani-andria.it\0" +"kai.yamanashi.jp\0" +"riodejaneiro.museum\0" +"nyny.museum\0" +"software.aero\0yamato.kanagawa.jp\0" +"obira.hokkaido.jp\0" +"int.is\0" +"review\0" +"mishima.shizuoka.jp\0" +"aizubange.fukushima.jp\0vestby.no\0" +"akita.jp\0" +"budejju.no\0" +"hosting\0" +"kuwana.mie.jp\0" +"\xe4\xb8\x96\xe7\x95\x8c\0" +"te.ua\0" +"\xe5\xa4\xa7\xe5\x88\x86.jp\0" +"tako.chiba.jp\0moareke.no\0" +"associates\0" +"m\xc3\xa1latvuopmi.no\0windows\0" +"mail.pl\0augustow.pl\0" +"int.la\0" +"!city.kobe.jp\0" +"cn.it\0sanfrancisco.museum\0" +"sakado.saitama.jp\0s3-ap-southeast-1.amazonaws.com\0" +"principe.st\0okinawa\0" +"drive\0" +"jogasz.hu\0misato.shimane.jp\0kuroiso.tochigi.jp\0" +"int.lk\0" +"higashikagawa.kagawa.jp\0" +"groks-this.info\0" +"arkhangelsk.ru\0" +"yawatahama.ehime.jp\0" +"pa.leg.br\0" +"chigasaki.kanagawa.jp\0minami-alps.yamanashi.jp\0osoyro.no\0" +"tone.ibaraki.jp\0matsuda.kanagawa.jp\0tenri.nara.jp\0" +"nogata.fukuoka.jp\0" +"omachi.saga.jp\0\xc3\xb8rsta.no\0" +"lucca.it\0yanaizu.fukushima.jp\0" +"africa.com\0" +"wakuya.miyagi.jp\0" +"arkhangelsk.su\0" +"eurovision\0" +"manx.museum\0askim.no\0" +"sakegawa.yamagata.jp\0" +"int.mv\0b\xc3\xa1hccavuotna.no\0" +"int.mw\0" +"int.ni\0" +"sakaki.nagano.jp\0nakano.tokyo.jp\0" +"blog\0" +"tinn.no\0ostroda.pl\0mydrobo.com\0" +"pb.leg.br\0" +"gonohe.aomori.jp\0starostwo.gov.pl\0edu.krd\0" +"marugame.kagawa.jp\0" +"nt.au\0" +"sekigahara.gifu.jp\0" +"plaza.museum\0" +"leasing.aero\0tjeldsund.no\0" +"sunagawa.hokkaido.jp\0" +"\xd8\xa7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86.ir\0from-nh.com\0" +"nt.ca\0" +"bellevue.museum\0" +"lib.oh.us\0" +"tysfjord.no\0" +"otsuki.kochi.jp\0co.krd\0" +"k12.ec\0porsangu.no\0" +"yukuhashi.fukuoka.jp\0" +"int.pt\0" +"soundandvision.museum\0nesna.no\0" +"read-books.org\0" +"khmelnitskiy.ua\0" +"br\xc3\xb8nn\xc3\xb8y.no\0" +"tm.cy\0fedje.no\0" +"monzabrianza.it\0" +"ami.ibaraki.jp\0marker.no\0cloudfront.net\0" +"naganohara.gunma.jp\0forsand.no\0" +"\xe6\xbe\xb3\xe9\x96\x80\0volkswagen\0" +"tosu.saga.jp\0raisa.no\0yokohama\0" +"aip.ee\0" +"foggia.it\0" +"takinoue.hokkaido.jp\0realm.cz\0" +"coldwar.museum\0lancaster\0" +"wassamu.hokkaido.jp\0ro.eu.org\0" +"tomari.hokkaido.jp\0locus\0" +"stjordal.no\0" +"aga.niigata.jp\0americanart.museum\0" +"campobasso.it\0shimoda.shizuoka.jp\0" +"adult\0pharmacy\0" +"telekommunikation.museum\0" +"ac\0kopervik.no\0" +"ad\0witd.gov.pl\0int.ru\0" "ae\0" -"af\0uchinomi.kagawa.jp\0kashihara.nara.jp\0" -"ag\0snasa.no\0" -"ai\0" -"inf.cu\0wa.us\0" -"al\0tomioka.gunma.jp\0" -"am\0" -"an\0" -"ao\0k12.wi.us\0" -"traniandriabarletta.it\0" -"aq\0ba\0" -"ar\0bb\0" -"as\0uslivinghistory.museum\0" -"at\0" -"au\0be\0" -"bf\0tomisato.chiba.jp\0tajimi.gifu.jp\0" -"aw\0bg\0is-a-knight.org\0" +"af\0mytis.ru\0int.rw\0abudhabi\0" +"ag\0" +"ai\0raholt.no\0" +"oshima.yamaguchi.jp\0" +"al\0" +"am\0latino\0tips\0" +"reklam.hu\0jewish.museum\0rakkestad.no\0" +"ao\0higashimatsushima.miyagi.jp\0\xe5\xa4\xa7\xe6\x8b\xbf\0elasticbeanstalk.com\0" +"aq\0ba\0chernivtsi.ua\0blogsite.org\0from-id.com\0" +"ar\0bb\0jobs.tt\0" +"as\0tm.fr\0yamagata.yamagata.jp\0dontexist.org\0" +"at\0obanazawa.yamagata.jp\0" +"air-surveillance.aero\0au\0be\0" +"bf\0" +"aw\0bg\0carrara-massa.it\0" "ax\0bh\0" -"bi\0" -"az\0bj\0" -"bm\0nebraska.museum\0one\0" -"bo\0ong\0s3-sa-east-1.amazonaws.com\0" -"ca\0med.om\0" -"br\0gold\0" -"bs\0cc\0y.se\0" -"bt\0cd\0nakai.kanagawa.jp\0golf\0onl\0" -"med.pa\0cc.vi.us\0" -"bv\0cf\0shinanomachi.nagano.jp\0" -"bw\0cg\0york.museum\0" -"ch\0nishihara.kumamoto.jp\0" +"bi\0heroy.more-og-romsdal.no\0int.tj\0" +"az\0bj\0myftp.org\0" +"aogaki.hyogo.jp\0blue\0" +"bm\0" +"kawamata.fukushima.jp\0aurskog-h\xc3\xb8land.no\0scholarships\0" +"bo\0romskog.no\0flir\0" +"honbetsu.hokkaido.jp\0" +"ca\0pors\xc3\xa1\xc5\x8bgu.no\0" +"br\0" +"bs\0cc\0idf.il\0int.tt\0" +"bt\0cd\0" +"bv\0cf\0" +"bw\0cg\0k12.il\0" +"ch\0" "by\0ci\0" "bz\0" -"firestone\0" -"cl\0chikusei.ibaraki.jp\0" -"cm\0frosta.no\0" -"cn\0" -"co\0tingvoll.no\0isa.us\0\xe5\x95\x86\xe5\xba\x97\0" -"sic.it\0kasuga.hyogo.jp\0med.pl\0" -"cr\0!city.yokohama.jp\0maori.nz\0" -"shiroi.chiba.jp\0amagasaki.hyogo.jp\0flsmidth\0" -"cu\0de\0soc.lk\0gloppen.no\0holdings\0loans\0" -"cv\0funabashi.chiba.jp\0kaizuka.osaka.jp\0" -"cw\0ooo\0" -"cx\0\xe1\x83\x92\xe1\x83\x94\0financial\0" -"stada\0" -"cz\0dj\0bedzin.pl\0" -"dk\0\xd8\xa8\xd9\x8a\xd8\xaa\xd9\x83\0" -"wodzislaw.pl\0" -"dm\0" -"otaki.chiba.jp\0saroma.hokkaido.jp\0poker\0" -"do\0lviv.ua\0" -"bibai.hokkaido.jp\0aridagawa.wakayama.jp\0" -"arezzo.it\0" -"ec\0civilization.museum\0vestnes.no\0" -"ee\0communications.museum\0" -"pmn.it\0" -"eg\0" -"dz\0final\0" -"sarufutsu.hokkaido.jp\0nagawa.nagano.jp\0accountant\0" -"muenchen.museum\0" -"\xd1\x83\xd0\xbf\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0" -"pisa.it\0" -"linde\0" -"es\0audnedaln.no\0narvik.no\0" -"et\0geometre-expert.fr\0livorno.it\0tra.kp\0" -"eu\0med.sa\0lib.sd.us\0goog\0" -"5.bg\0krager\xc3\xb8.no\0gratis\0" -"med.sd\0" -"fi\0luxury\0" -"nanjo.okinawa.jp\0" -"askim.no\0aurskog-holand.no\0asso.re\0\xd9\x85\xd8\xb5\xd8\xb1\0" -"wada.nagano.jp\0" +"hangout\0moscow\0" +"cl\0" +"cm\0aostavalley.it\0prudential\0" +"cn\0oirase.aomori.jp\0" +"co\0\xc3\xa5mli.no\0" +"chikugo.fukuoka.jp\0" +"cr\0yaizu.shizuoka.jp\0" +"int.ve\0" +"cu\0de\0shiraoi.hokkaido.jp\0iruma.saitama.jp\0lib.nv.us\0" +"of.by\0cv\0tm.hu\0teshikaga.hokkaido.jp\0lib.ia.us\0lawyer\0university\0" +"cw\0yamaga.kumamoto.jp\0" +"b.bg\0cx\0si.eu.org\0" +"cz\0dj\0" +"dk\0" +"dm\0cc.vt.us\0int.vn\0" +"furano.hokkaido.jp\0" +"do\0cn.ua\0" +"consultant.aero\0kasama.ibaraki.jp\0" +"lecce.it\0frana.no\0" +"\xe9\x9b\xbb\xe8\xa8\x8a\xe7\x9b\x88\xe7\xa7\x91\0" +"b.br\0ec\0" +"ee\0" +"higashitsuno.kochi.jp\0" +"eg\0s3-ap-northeast-1.amazonaws.com\0" +"cr.it\0defense.tn\0" +"dz\0" +"tokoname.aichi.jp\0" +"cargo.aero\0frankfurt.museum\0" +"yamakita.kanagawa.jp\0" +"es\0yakutia.ru\0" +"et\0torino.it\0" +"eu\0noshiro.akita.jp\0" +"fr\xc3\xb8ya.no\0\xe6\xbe\xb3\xe9\x97\xa8\0" +"fi\0" "fm\0" -"fo\0org\0" -"fm.br\0agro.pl\0" -"ga\0" -"fr\0gb\0kazo.saitama.jp\0" -"gd\0ogawa.ibaraki.jp\0" -"ge\0us-east-1.amazonaws.com\0" -"gf\0" -"gg\0mer\xc3\xa5ker.no\0from-ok.com\0" -"gh\0kuwana.mie.jp\0" +"tm.km\0" +"fo\0" +"blogdns.org\0" +"ga\0for-better.biz\0" +"fr\0gb\0iinet\0is-a-democrat.com\0" +"kurate.fukuoka.jp\0" +"gd\0" +"ge\0nakijin.okinawa.jp\0" +"gf\0miyoshi.tokushima.jp\0" +"gg\0" +"gh\0" "gi\0" -"mashike.hokkaido.jp\0" -"is-a-celticsfan.org\0" -"gl\0ogawa.nagano.jp\0" -"gm\0" +"oyama.tochigi.jp\0" +"kanan.osaka.jp\0" +"gl\0hannan.osaka.jp\0" +"gm\0tranby.no\0" "gn\0" -"arendal.no\0" -"sd.cn\0gp\0" +"familyds.org\0" +"gp\0" "gq\0" -"gr\0\xe5\xbe\xb3\xe5\xb3\xb6.jp\0" -"gs\0claims\0" -"gt\0" -"gw\0lib.md.us\0" -"int.ar\0" +"gr\0trentinostirol.it\0sande.vestfold.no\0" +"gs\0kanna.gunma.jp\0" +"gt\0tm.mc\0k12.ak.us\0insurance\0" +"virgin\0" +"gw\0" +"tm.mg\0sk.eu.org\0" "gy\0" -"hk\0colonialwilliamsburg.museum\0associates\0" +"hk\0amli.no\0" "hm\0" -"hn\0" -"int.az\0karumai.iwate.jp\0" -"hr\0zao.miyagi.jp\0anan.tokushima.jp\0" -"gov.ac\0" -"ht\0id\0tsuiki.fukuoka.jp\0ikoma.nara.jp\0chungnam.kr\0mail.pl\0" -"gov.ae\0int.bo\0hu\0ie\0bergen.no\0kh.ua\0is-lost.org\0" -"gov.af\0" -"kurobe.toyama.jp\0green\0" -"yk.ca\0" -"tonami.toyama.jp\0" -"gov.al\0" -"md.ci\0im\0histoire.museum\0salem.museum\0" -"in\0rm.it\0vercelli.it\0" -"int.ci\0io\0music.museum\0" -"bieszczady.pl\0gmail\0" -"gov.ba\0iq\0" -"gov.ar\0gov.bb\0ir\0" -"gov.as\0is\0\xc3\xa1laheadju.no\0samsung\0" -"it\0dnsdojo.net\0" -"gov.au\0int.co\0je\0game-server.cc\0" -"gov.bf\0" -"kragero.no\0" -"gov.bh\0" -"asso.nc\0" -"gov.az\0" -"gov.bm\0voss.no\0" -"gov.bo\0jo\0insure\0" -"chirurgiens-dentistes.fr\0gorizia.it\0jp\0ovh\0" -"inf.mk\0" -"gov.br\0" -"gov.bs\0\xc3\xb8ksnes.no\0" -"gov.bt\0gov.cd\0" -"flora.no\0" -"kg\0khakassia.ru\0" -"gov.by\0ki\0" -"gov.bz\0shinkamigoto.nagasaki.jp\0" -"sk.ca\0\xc3\xa5lesund.no\0" -"gov.cl\0fukaya.saitama.jp\0wloclawek.pl\0" -"gov.cm\0km\0tynset.no\0chuvashia.ru\0tec.ve\0" -"gov.cn\0kn\0" -"gov.co\0journalism.museum\0netbank\0" -"basilicata.it\0susaki.kochi.jp\0ogawara.miyagi.jp\0kp\0" -"la\0kvitsoy.no\0" -"kr\0lb\0" -"lc\0alaheadju.no\0" -"gd.cn\0" -"gov.cu\0" -"fujiidera.osaka.jp\0" -"gov.cx\0" -"ky\0li\0oceanographique.museum\0viking.museum\0jessheim.no\0forgot.her.name\0" -"kz\0kitchen\0" -"lk\0" -"minamiawaji.hyogo.jp\0nikko.tochigi.jp\0" -"gov.dm\0" -"kakuda.miyagi.jp\0" -"gov.do\0" -"kasuga.fukuoka.jp\0" -"ma\0r\xc3\xa1isa.no\0" -"lr\0" -"gov.ec\0ls\0mc\0" -"fukuoka.jp\0lt\0md\0" -"gov.ee\0lu\0me\0" +"hn\0shonai.yamagata.jp\0" +"bible\0" +"hr\0" +"pagespeedmobilizer.com\0" +"ht\0id\0trentino-s-tirol.it\0kppsp.gov.pl\0" +"hu\0ie\0" +"yamatokoriyama.nara.jp\0visa\0" +"assedic.fr\0seihi.nagasaki.jp\0\xd0\xb0\xd0\xba.\xd1\x81\xd1\x80\xd0\xb1\0" +"higashiosaka.osaka.jp\0" +"digital\0" +"il\0" +"im\0" +"in\0nagasaki.jp\0alstom\0" +"io\0" +"tm.no\0" +"iq\0shimonoseki.yamaguchi.jp\0nt.no\0protection\0" +"ir\0" +"d.bg\0is\0" +"zj.cn\0it\0vrn.ru\0" +"je\0macys\0" +"nx.cn\0" +"grane.no\0" +"no-ip.co.uk\0" +"santacruz.museum\0aaa.pro\0" +"shiranuka.hokkaido.jp\0" +"surrey.museum\0" +"misato.miyagi.jp\0ngo.lk\0baikal.ru\0careers\0sharp\0" +"jo\0aizumi.tokushima.jp\0" +"to.it\0jp\0palana.ru\0" +"lombardia.it\0markets\0" +"im.it\0gs.fm.no\0latrobe\0" +"ct.it\0pi.leg.br\0" +"sannohe.aomori.jp\0mizumaki.fukuoka.jp\0" +"kg\0guernsey.museum\0\xe7\xb6\xb2\xe8\xb7\xaf.tw\0" +"educational.museum\0" +"ki\0kwp.gov.pl\0" +"soma.fukushima.jp\0dvrcam.info\0" +"km\0tm.pl\0" +"kn\0" +"med.pro\0" +"ota.tokyo.jp\0kp\0" +"la\0" +"kr\0lb\0bradesco\0" +"lc\0dynv6.net\0" +"its.me\0" +"molde.no\0" +"viva\0" +"hofu.yamaguchi.jp\0ru.eu.org\0se.eu.org\0" +"nakatombetsu.hokkaido.jp\0susaki.kochi.jp\0ky\0li\0" +"kz\0chattanooga.museum\0" +"kunitachi.tokyo.jp\0lk\0marnardal.no\0apps.fbsbx.com\0" +"is-an-artist.com\0ch.eu.org\0" +"ovre-eiker.no\0" +"aeroport.fr\0kuromatsunai.hokkaido.jp\0" +"naturalhistory.museum\0" +"shobara.hiroshima.jp\0ma\0""1kapp.com\0" +"taa.it\0lr\0" +"ls\0mc\0grue.no\0" +"lt\0md\0vivo\0" +"kiryu.gunma.jp\0lu\0me\0" "lv\0" -"gov.eg\0mg\0" -"vet.br\0mh\0" +"mg\0gratangen.no\0nat.tn\0" +"mh\0" "ly\0" -"gov.dz\0" -"mk\0" -"zama.kanagawa.jp\0ml\0pid\0" -"trade\0isa-hockeynut.com\0" +"mk\0k12.wi.us\0" +"ml\0" +"betainabox.com\0" "mn\0" -"mo\0komvux.se\0" -"mp\0" -"mq\0na\0from-al.com\0" -"fm.it\0futtsu.chiba.jp\0mr\0" -"ms\0nc\0" -"gov.et\0yasaka.nagano.jp\0mt\0" -"mu\0ne\0ltda\0" -"kazuno.akita.jp\0mv\0nf\0pin\0" -"mw\0ng\0" -"mishima.fukushima.jp\0mx\0" -"steam.museum\0my\0" -"group.aero\0\xe5\x80\x8b\xe4\xba\xba.hk\0" -"matsuyama.ehime.jp\0nl\0" -"no\0trana.no\0" -"minamitane.kagoshima.jp\0nr\0" -"schoenbrunn.museum\0wv.us\0" -"mombetsu.hokkaido.jp\0" -"gov.ge\0boston.museum\0schweiz.museum\0nu\0dyndns-pics.com\0" -"ureshino.mie.jp\0" -"aseral.no\0snz.ru\0" -"gov.gh\0thruhere.net\0" -"gov.gi\0" +"mo\0global\0" +"mp\0tm.ro\0" +"mq\0na\0nt.ro\0" +"yotsukaido.chiba.jp\0mr\0" +"nishiokoppe.hokkaido.jp\0ms\0nc\0" +"kira.aichi.jp\0mt\0" +"mu\0ne\0" +"mv\0nf\0tm.se\0" +"miyawaka.fukuoka.jp\0mw\0ng\0" +"mx\0servebbs.net\0" +"my\0" +"mz\0kraanghke.no\0" +"ngo.ph\0hzc.io\0" +"planetarium.museum\0nl\0onthewifi.com\0" +"k12.tr\0" +"toyako.hokkaido.jp\0" +"no\0" +"adm.br\0" +"samnanger.no\0nr\0" +"wolterskluwer\0" +"nu\0" +"midatlantic.museum\0" +"tsuruoka.yamagata.jp\0" +"radio.br\0" "nz\0" -"gjesdal.no\0" -"om\0" -"gov.gn\0" -"s3.amazonaws.com\0" -"friulivgiulia.it\0tokyo.jp\0" -"kvinesdal.no\0pa\0" -"gov.gr\0" -"asso.km\0hagebostad.no\0" -"adachi.tokyo.jp\0" -"pe\0" -"pf\0" -"bushey.museum\0" -"lt.it\0seoul.kr\0ph\0kaszuby.pl\0" -"civilaviation.aero\0int.is\0" -"genoa.it\0teshikaga.hokkaido.jp\0kawanabe.kagoshima.jp\0" -"gov.hk\0pk\0bharti\0" -"friulivegiulia.it\0ebetsu.hokkaido.jp\0pl\0" -"pm\0" -"kanonji.kagawa.jp\0pn\0star\0" -"shisui.chiba.jp\0" -"qa\0" -"tenri.nara.jp\0pr\0" -"ps\0s3-website-us-west-2.amazonaws.com\0" -"nago.okinawa.jp\0pt\0" -"gov.ie\0alstahaug.no\0" -"pw\0blogspot.com\0" -"aya.miyazaki.jp\0tamano.okayama.jp\0" -"asso.mc\0py\0" -"cuisinella\0" -"moriyoshi.akita.jp\0ikeda.gifu.jp\0berlin\0" -"gov.in\0geek.nz\0" -"okuizumo.shimane.jp\0konskowola.pl\0" -"gov.iq\0circle\0" -"gov.ir\0" -"gov.is\0" -"gov.it\0" -"nb.ca\0re\0kv.ua\0" -"zagan.pl\0" -"int.la\0v\xc3\xa5g\xc3\xa5.no\0\xe4\xb8\xad\xe6\x96\x87\xe7\xbd\x91\0" -"newhampshire.museum\0fm.no\0" -"hiji.oita.jp\0" -"gov.jo\0ro\0" -"press.aero\0int.lk\0sa\0" -"yoichi.hokkaido.jp\0kumenan.okayama.jp\0sb\0" -"rs\0sc\0is-a-linux-user.org\0" -"leg.br\0sd\0" -"jur.pro\0ru\0se\0" -"gov.kg\0rw\0sg\0" -"brescia.it\0akishima.tokyo.jp\0sh\0" -"gov.ki\0basel.museum\0si\0shacknet.nu\0" -"ami.ibaraki.jp\0sj\0" +"kicks-ass.net\0" +"of.no\0rade.no\0wloclawek.pl\0legal\0" +"om\0lib.ct.us\0" +"f.bg\0uchinada.ishikawa.jp\0" +"trogstad.no\0" +"pa\0gsm.pl\0" +"od.ua\0" +"k12.vi\0" +"pe\0wsa.gov.pl\0cr.ua\0" +"minamitane.kagoshima.jp\0pf\0pomorskie.pl\0homeunix.net\0" +"ph\0" +"khmelnytskyi.ua\0" +"fukushima.fukushima.jp\0miki.hyogo.jp\0" +"pk\0" +"b\xc3\xb8.nordland.no\0pl\0" +"pm\0panerai\0" +"newmexico.museum\0pn\0" +"qa\0*.ex.ortsinfo.at\0" +"alstahaug.no\0pr\0schaeffler\0" +"otobe.hokkaido.jp\0ps\0" +"como.it\0pt\0" +"oystre-slidre.no\0racing\0" +"trapani.it\0" +"pw\0" +"bayern\0" +"py\0" +"naamesjevuemie.no\0" +"abogado\0" +"space\0" +"svelvik.no\0" +"re\0" +"shirako.chiba.jp\0kvitsoy.no\0" +"hachinohe.aomori.jp\0" +"padua.it\0" +"kurogi.fukuoka.jp\0kanuma.tochigi.jp\0aure.no\0" +"entertainment.aero\0" +"soeda.fukuoka.jp\0" +"moseushi.hokkaido.jp\0ro\0boats\0" +"oksnes.no\0" +"sa\0" +"sb\0" +"rs\0sc\0pe.leg.br\0" +"isehara.kanagawa.jp\0sd\0" +"perso.ht\0ru\0se\0" +"otaki.chiba.jp\0" +"rw\0sg\0" +"sh\0k12.ky.us\0from-ga.com\0" +"scienceandindustry.museum\0si\0budapest\0" +"zushi.kanagawa.jp\0sj\0" "sk\0" -"sl\0" -"gov.km\0sandefjord.no\0sm\0" -"gov.kn\0sn\0" +"sl\0graphics\0" +"sm\0" +"sn\0" "so\0" -"yahaba.iwate.jp\0gov.kp\0" -"gov.la\0pharmacy\0" -"kunitachi.tokyo.jp\0gov.lb\0sr\0" -"gov.lc\0tc\0" -"hidaka.saitama.jp\0st\0td\0" -"convent.museum\0nyny.museum\0floro.no\0su\0" -"kurate.fukuoka.jp\0sv\0tf\0" -"altai.ru\0tg\0" -"ibigawa.gifu.jp\0kakogawa.hyogo.jp\0nagaokakyo.kyoto.jp\0sx\0th\0" -"gov.ky\0sy\0" -"gov.kz\0sz\0tj\0" -"gov.lk\0tk\0" -"int.mv\0tl\0" -"int.mw\0herad.no\0tm\0" -"oarai.ibaraki.jp\0tn\0" -"to\0" -"tp\0" -"gov.ma\0ua\0dnsalias.com\0" -"gov.lr\0tr\0" -"sor-fron.no\0" -"hb.cn\0gov.lt\0tt\0" -"gov.me\0healthcare\0" -"\xe9\x9d\x99\xe5\xb2\xa1.jp\0inagawa.hyogo.jp\0gov.lv\0tv\0" -"gov.mg\0tw\0ug\0" -"ad.jp\0miura.kanagawa.jp\0" -"gov.ly\0" -"tz\0" -"gov.mk\0uk\0" -"\xe4\xbd\x90\xe8\xb3\x80.jp\0okinawa.okinawa.jp\0gov.ml\0" -"archaeology.museum\0" -"biz.bb\0gov.mn\0" -"gov.mo\0" -"biz.at\0" +"beardu.no\0" +"sr\0" +"tc\0durban\0" +"st\0td\0" +"su\0" +"works.aero\0valer.hedmark.no\0sv\0tf\0" +"kikugawa.shizuoka.jp\0tg\0" +"obihiro.hokkaido.jp\0joso.ibaraki.jp\0sx\0th\0" +"sy\0media\0" +"sz\0tj\0" +"tk\0" +"tl\0" +"trading.aero\0tm\0at.eu.org\0" +"nieruchomosci.pl\0tn\0" +"to\0dyn-o-saur.com\0" +"ua\0" +"nakagusuku.okinawa.jp\0tr\0tm.za\0myftp.biz\0" +"kashima.saga.jp\0andasuolo.no\0" +"tt\0s3-eu-central-1.amazonaws.com\0" +"toride.ibaraki.jp\0lighting\0" +"b.se\0tv\0" +"tw\0ug\0" +"artsandcrafts.museum\0bievat.no\0" +"h.bg\0divtasvuodna.no\0dominic.ua\0" +"shizuoka.jp\0mitane.akita.jp\0tz\0booking\0" +"eidfjord.no\0uk\0" +"city.hu\0" +"oki.fukuoka.jp\0" +"shinjo.okayama.jp\0oracle\0" "va\0" -"iglesiascarbonia.it\0satte.saitama.jp\0gov.mr\0" -"gov.ms\0us\0vc\0" -"isshiki.aichi.jp\0" -"gov.mu\0ve\0" -"biz.az\0obira.hokkaido.jp\0gov.mv\0" -"gov.mw\0gov.ng\0vg\0" -"gov.my\0uy\0vi\0" +"nozawaonsen.nagano.jp\0" +"schoenbrunn.museum\0us\0vc\0" +"stjordalshalsen.no\0" +"ve\0from-wa.com\0" +"ts.it\0" +"vg\0" +"gs.ah.no\0uy\0vi\0gallery\0" "uz\0" -"gs.rl.no\0" -"corvette.museum\0" +"unj\xc3\xa1rga.no\0" "vn\0" -"marburg.museum\0swiss\0" -"lyngdal.no\0" -"taiki.hokkaido.jp\0gov.nr\0" -"sandoy.no\0" -"otoineppu.hokkaido.jp\0" -"vu\0" -"sr.it\0misugi.mie.jp\0wf\0" -"orland.no\0pro\0" -"can.museum\0servebbs.org\0" -"int.pt\0" -"services\0" -"s\xc3\xb8mna.no\0gov.om\0" -"higashi.fukuoka.jp\0" -"taobao\0" -"lombardia.it\0tsuwano.shimane.jp\0" -"biei.hokkaido.jp\0" -"meraker.no\0ws\0" -"soka.saitama.jp\0" -"wildlife.museum\0lib.tx.us\0" -"shonai.fukuoka.jp\0gov.ph\0" -"sakaki.nagano.jp\0" -"copenhagen.museum\0gov.pk\0" -"gov.pl\0" -"blue\0christmas\0" -"gov.pn\0" -"gov.qa\0" -"sanagochi.tokushima.jp\0gov.pr\0author\0" -"vestv\xc3\xa5g\xc3\xb8y.no\0gov.ps\0" -"yamanashi.jp\0gov.pt\0" -"yakage.okayama.jp\0" -"holt\xc3\xa5len.no\0" -"gov.py\0" -"pub\0" -"int.ru\0" -"hi.cn\0notaires.fr\0" -"int.rw\0" -"trentino-altoadige.it\0osaka.jp\0" -"loten.no\0" -"biz.et\0odate.akita.jp\0" -"niepce.museum\0" -"rollag.no\0" -"yt\0" -"sd.us\0click\0" -"lib.oh.us\0doesntexist.org\0" -"immobilien\0" -"stor-elvdal.no\0from-ri.com\0" -"fribourg.museum\0finnoy.no\0" -"diet\0" -"int.tj\0" -"gov.sa\0" -"gov.sb\0" -"gov.rs\0gov.sc\0" -"gov.sd\0" -"gov.ru\0lt.ua\0" -"shell.museum\0saratov.ru\0gov.rw\0gov.sg\0" -"aikawa.kanagawa.jp\0gov.sh\0" -"tours\0" -"aosta-valley.it\0gr.it\0buzen.fukuoka.jp\0int.tt\0" -"res.aero\0v\xc3\xa6r\xc3\xb8y.no\0" -"kawamata.fukushima.jp\0gov.sl\0" -"minami.fukuoka.jp\0suzuka.mie.jp\0genkai.saga.jp\0" -"shika.ishikawa.jp\0" -"yao.osaka.jp\0gov.st\0" -"gr.jp\0mitake.gifu.jp\0sejny.pl\0" -"md.us\0" -"gov.sx\0" -"gov.sy\0nagoya\0" -"kurume.fukuoka.jp\0gov.tj\0" -"int.ve\0" -"gov.tl\0" -"gov.tm\0" -"mitaka.tokyo.jp\0gov.tn\0" -"gov.to\0" -"biz.id\0my.id\0" -"trogstad.no\0gov.ua\0" -"gov.tr\0" -"ass.km\0budejju.no\0" -"gov.tt\0int.vn\0" -"aogashima.tokyo.jp\0gets-it.net\0" -"plants.museum\0gov.tw\0" -"store.nf\0" -"gov.uk\0" -"ar.it\0" -"schlesisches.museum\0" -"unzen.nagasaki.jp\0" -"gaular.no\0koenig.ru\0" -"epson\0" -"sld.do\0mr.no\0gov.vc\0" -"ptz.ru\0gov.ve\0" -"build\0" +"nv.us\0" +"ct.us\0\xe5\xb9\xbf\xe4\xb8\x9c\0sells-for-less.com\0" +"hikawa.shimane.jp\0vu\0" +"wf\0" +"kamisu.ibaraki.jp\0grajewo.pl\0rsc.cdn77.org\0" +"yamanakako.yamanashi.jp\0red.sv\0" +"uruma.okinawa.jp\0ryuoh.shiga.jp\0tree.museum\0hotel.tz\0play\0" +"komaki.aichi.jp\0" +"ogliastra.it\0elburg.museum\0" +"averoy.no\0" +"fuchu.toyama.jp\0koenig.ru\0" +"umb.it\0hitachinaka.ibaraki.jp\0alvdal.no\0ws\0" +"berg.no\0ngo.za\0" +"cooking\0" +"okaya.nagano.jp\0" +"kuroishi.aomori.jp\0gwangju.kr\0" +"osakasayama.osaka.jp\0nationalfirearms.museum\0" +"trana.no\0" +"kamogawa.chiba.jp\0prime\0" +"union.aero\0newjersey.museum\0k12.ks.us\0coupon\0" +"nagahama.shiga.jp\0" +"settlement.museum\0" +"siracusa.it\0" +"ac.leg.br\0" +"s\xc3\xb8r-aurdal.no\0adygeya.su\0kep.tr\0" +"os\xc3\xb8yro.no\0" +"kouzushima.tokyo.jp\0malatvuopmi.no\0" +"lavangen.no\0" +"carrier.museum\0" +"uslivinghistory.museum\0homedns.org\0" +"hamada.shimane.jp\0" +"vallee-aoste.it\0vega.no\0yt\0" +"ishigaki.okinawa.jp\0" +"kv\xc3\xa6""fjord.no\0" +"emergency.aero\0on.ca\0m\xc3\xa1tta-v\xc3\xa1rjjat.no\0tj\xc3\xb8me.no\0" +"politie\0" +"zm\0cloud\0" +"washingtondc.museum\0" +"tromsa.no\0xen.prgmr.com\0" +"urakawa.hokkaido.jp\0d.se\0" +"chihayaakasaka.osaka.jp\0" +"j.bg\0stjohn.museum\0audio\0" +"qld.edu.au\0kitanakagusuku.okinawa.jp\0\xe7\xbd\x91\xe7\xab\x99\0" "tw.cn\0" -"from-mn.com\0" -"og.ao\0namsskogan.no\0" -"yamato.kumamoto.jp\0" -"moseushi.hokkaido.jp\0gov.vn\0" -"rocks\0" -"biz.ki\0" -"nes.buskerud.no\0\xe7\xb5\x84\xe7\xb9\x94.tw\0" -"schwarz\0" -"pruszkow.pl\0" -"r\xc3\xb8mskog.no\0bargains\0" -"vardo.no\0mk.ua\0" -"house\0" -"hashimoto.wakayama.jp\0" -"cc.fl.us\0gov.ws\0" -"chosei.chiba.jp\0shimosuwa.nagano.jp\0" -"donna.no\0" -"tp.it\0" -"cc.sc.us\0" -"meet\0" -"sologne.museum\0" -"obu.aichi.jp\0" -"ardal.no\0" -"meldal.no\0is-a-republican.com\0" -"maintenance.aero\0" -"haboro.hokkaido.jp\0hatoyama.saitama.jp\0rich\0" -"gateway.museum\0" -"kikonai.hokkaido.jp\0kosa.kumamoto.jp\0" -"yasuoka.nagano.jp\0" -"village.museum\0" -"kyoto.jp\0hanamaki.iwate.jp\0" -"tomsk.ru\0" -"\xe7\xa7\x8b\xe7\x94\xb0.jp\0toyohashi.aichi.jp\0shiso.hyogo.jp\0" -"hadsel.no\0google\0firebaseapp.com\0" -"biz.mv\0" -"biz.mw\0" -"bi.it\0" -"otobe.hokkaido.jp\0" -"kvam.no\0vindafjord.no\0mine.nu\0" -"omuta.fukuoka.jp\0ogasawara.tokyo.jp\0biz.nr\0" -"frosinone.it\0kainan.wakayama.jp\0" -"higashiyoshino.nara.jp\0" -"\xe5\xa4\xa7\xe9\x98\xaa.jp\0" -"delmenhorst.museum\0" -"iwanuma.miyagi.jp\0" -"khmelnitskiy.ua\0" -"kanan.osaka.jp\0" -"uwajima.ehime.jp\0toyonaka.osaka.jp\0" -"transport.museum\0" -"sklep.pl\0" -"figueres.museum\0" -"shimogo.fukushima.jp\0nishinomiya.hyogo.jp\0" -"oumu.hokkaido.jp\0habikino.osaka.jp\0nakano.tokyo.jp\0ohkura.yamagata.jp\0" -"qld.edu.au\0on.ca\0vacations\0" -"berkeley.museum\0collection.museum\0biz.pk\0" -"biz.pl\0pulawy.pl\0" -"yabuki.fukushima.jp\0" -"b\xc3\xa6rum.no\0" -"kanazawa.ishikawa.jp\0" -"reklam.hu\0emerck\0" -"\xe5\xae\xae\xe5\xb4\x8e.jp\0oita.oita.jp\0biz.pr\0" -"cyou\0" -"kiyokawa.kanagawa.jp\0yonago.tottori.jp\0" -"cards\0" -"discount\0" -"ak.us\0" -"iide.yamagata.jp\0exposed\0" -"store.ve\0de.com\0" -"seljord.no\0sula.no\0" -"skiptvet.no\0k12.mt.us\0" -"friuliveneziagiulia.it\0ikeda.nagano.jp\0" -"corporation.museum\0" -"f.bg\0gj\xc3\xb8vik.no\0immo\0" -"name.hr\0" -"southwest.museum\0" -"sekikawa.niigata.jp\0" -"sciencecenters.museum\0" -"tienda\0" -"motoyama.kochi.jp\0" -"plantation.museum\0kyoto\0" -"izena.okinawa.jp\0" -"mo\xc3\xa5reke.no\0" -"og.it\0" -"ap-southeast-1.compute.amazonaws.com\0s3-ap-southeast-1.amazonaws.com\0" -"name.et\0" -"kihoku.ehime.jp\0" -"meme\0co.com\0" -"prof.pr\0" -"foggia.it\0kamisunagawa.hokkaido.jp\0" -"historical.museum\0" -"s3-ap-southeast-2.amazonaws.com\0" -"biz.tj\0" +"no-ip.info\0" +"kusu.oita.jp\0" +"veneto.it\0namikata.ehime.jp\0higashikurume.tokyo.jp\0iide.yamagata.jp\0" +"ddr.museum\0" +"cv.ua\0" +"cc.ga.us\0" +"kyotango.kyoto.jp\0" +"seto.aichi.jp\0" +"takaharu.miyazaki.jp\0" +"is.it\0" +"cz.it\0\xe4\xbd\x90\xe8\xb3\x80.jp\0" +"yoshinogari.saga.jp\0kristiansand.no\0zarow.pl\0no-ip.org\0" +"drangedal.no\0amfam\0" +"trd.br\0adygeya.ru\0\xe0\xae\x87\xe0\xae\xa8\xe0\xaf\x8d\xe0\xae\xa4\xe0\xae\xbf\xe0\xae\xaf\xe0\xae\xbe\0frontier\0" +"tamano.okayama.jp\0" +"oh.us\0" +"assassination.museum\0" +"afjord.no\0" +"napoli.it\0komatsu.ishikawa.jp\0pr.leg.br\0" +"shishikui.tokushima.jp\0" +"taranto.it\0!city.yokohama.jp\0higashiomi.shiga.jp\0" +"erimo.hokkaido.jp\0opole.pl\0" +"berlin\0" +"kamisato.saitama.jp\0rindal.no\0" +"trustee.museum\0stada\0" +"accident-investigation.aero\0" +"hokuto.yamanashi.jp\0" +"ownprovider.com\0" +"trainer.aero\0" +"koshu.yamanashi.jp\0countryestate.museum\0astrakhan.ru\0" +"hotel.lk\0direct\0does-it.net\0" +"hatoyama.saitama.jp\0" +"asahi.ibaraki.jp\0norilsk.ru\0" +"pizza\0" +"stryn.no\0" +"\xd0\xb5\xd1\x8e\0" +"audnedaln.no\0supply\0" +"shimamoto.osaka.jp\0" +"saito.miyazaki.jp\0" +"stord.no\0" +"nonoichi.ishikawa.jp\0likescandy.com\0" +"valled-aosta.it\0" +"biratori.hokkaido.jp\0" +"trentinosued-tirol.it\0" +"television.museum\0" +"heimatunduhren.museum\0minnesota.museum\0" +"narashino.chiba.jp\0aejrie.no\0" +"f.se\0" +"ol.no\0" +"l.bg\0ruovat.no\0" +"yatsuka.shimane.jp\0" +"tsushima.aichi.jp\0" +"upow.gov.pl\0" +"nantan.kyoto.jp\0" +"airguard.museum\0" +"lecco.it\0" +"gorlice.pl\0" +"lorenskog.no\0" +"kursk.ru\0" "perm.ru\0" -"tamayu.shimane.jp\0nanyo.yamagata.jp\0" -"folldal.no\0" -"matsuda.kanagawa.jp\0" -"pe.ca\0" -"etajima.hiroshima.jp\0mitsue.nara.jp\0biz.tr\0" -"localhistory.museum\0rodeo\0doesntexist.com\0" -"biz.tt\0" -"iris.arpa\0zp.ua\0" -"showa.yamanashi.jp\0" -"urn.arpa\0sld.pa\0" -"menu\0" -"ar.us\0" -"yusuhara.kochi.jp\0red\0" -"glass.museum\0bygland.no\0" -"ginoza.okinawa.jp\0\xd0\xba\xd0\xbe\xd0\xbc\0" -"\xe7\xbd\x91\xe5\xba\x97\0" -"store.ro\0" -"higashikagura.hokkaido.jp\0" -"selbu.no\0" -"ohda.shimane.jp\0" -"name.eg\0" -"ren\0" -"m.bg\0architecture.museum\0" -"biz.vn\0" -"satsumasendai.kagoshima.jp\0mazury.pl\0" -"gojome.akita.jp\0" -"chungbuk.kr\0" -"\xe7\xbd\x91\xe7\xbb\x9c.cn\0nakasatsunai.hokkaido.jp\0takikawa.hokkaido.jp\0" -"tokushima.tokushima.jp\0" -"store.st\0" -"name.az\0cnt.br\0johana.toyama.jp\0" -"s3-website-eu-west-1.amazonaws.com\0" -"social\0" -"kvits\xc3\xb8y.no\0" -"association.museum\0" -"rikuzentakata.iwate.jp\0" -"environment.museum\0indianmarket.museum\0hi.us\0" -"ishikari.hokkaido.jp\0" -"heimatunduhren.museum\0lib.de.us\0" -"eti.br\0" -"lunner.no\0estate\0" -"lewismiller.museum\0\xec\x82\xbc\xec\x84\xb1\0" -"komaki.aichi.jp\0" -"naumburg.museum\0" -"misato.wakayama.jp\0tsuru.yamanashi.jp\0" -"haus\0" -"kawagoe.mie.jp\0" -"dance\0" -"kadoma.osaka.jp\0" -"ve.it\0" -"vana\0" -"museumcenter.museum\0" -"\xc3\xb8stre-toten.no\0philips\0" -"volyn.ua\0" -"rio\0" -"rip\0" -"hiraya.nagano.jp\0skoczow.pl\0" -"latrobe\0" -"t.bg\0info\0homeftp.org\0" -"shingu.hyogo.jp\0" -"mykolaiv.ua\0" -"loab\xc3\xa1t.no\0\xe7\xbd\x91\xe7\xab\x99\0" -"prd.fr\0incheon.kr\0" -"joburg\0" -"\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0" -"oizumi.gunma.jp\0" -"grp.lk\0" -"cn.it\0kitamoto.saitama.jp\0" -"silk.museum\0" -"swinoujscie.pl\0" -"\xe7\xbd\x91\xe7\xbb\x9c.hk\0sauherad.no\0komatsu\0" -"pe.it\0datsun\0" -"drangedal.no\0cc.nh.us\0versicherung\0" -"date.fukushima.jp\0" -"jl.cn\0mitane.akita.jp\0ozu.ehime.jp\0" -"is-with-theband.com\0" -"yoro.gifu.jp\0" -"kamo.kyoto.jp\0azure-mobile.net\0" -"aizuwakamatsu.fukushima.jp\0hasuda.saitama.jp\0targi.pl\0" -"ddr.museum\0kiwi\0" -"niyodogawa.kochi.jp\0" -"snaase.no\0" -"sumida.tokyo.jp\0" -"emr.it\0" -"prato.it\0surf\0" -"iron.museum\0pittsburgh.museum\0us-gov-west-1.compute.amazonaws.com\0" -"church\0futbol\0" -"in.na\0" -"moriyama.shiga.jp\0" -"ehime.jp\0" -"watch-and-clock.museum\0" -"kushima.miyazaki.jp\0fussa.tokyo.jp\0" -"qc.ca\0" -"bmd.br\0shakotan.hokkaido.jp\0nyuzen.toyama.jp\0pe.kr\0" -"skjerv\xc3\xb8y.no\0" -"tree.museum\0" -"egersund.no\0" -"gratangen.no\0luxe\0" -"\xe7\xb5\x84\xe7\xb9\x94.hk\0valer.hedmark.no\0" -"stcgroup\0" -"\xe5\x8c\x97\xe6\xb5\xb7\xe9\x81\x93.jp\0higashisumiyoshi.osaka.jp\0" -"accountants\0" -"is-uberleet.com\0" -"kitaaiki.nagano.jp\0" -"test.tj\0" -"bomlo.no\0" -"gs.of.no\0" -"obanazawa.yamagata.jp\0yamanashi.yamanashi.jp\0" -"prd.km\0" -"from-wa.com\0" -"agrigento.it\0" -"casino.hu\0" -"tawaramoto.nara.jp\0babia-gora.pl\0\xd8\xa8\xda\xbe\xd8\xa7\xd8\xb1\xd8\xaa\0credit\0" +"\xe7\xa6\x8f\xe5\xb3\xb6.jp\0oga.akita.jp\0kiyosato.hokkaido.jp\0ouchi.saga.jp\0aaa\0" +"tjome.no\0" +"wakkanai.hokkaido.jp\0\xe8\x87\xba\xe7\x81\xa3\0" +"is-very-nice.org\0""3utilities.com\0" +"compute-1.amazonaws.com\0" +"crotone.it\0" +"toyohashi.aichi.jp\0soja.okayama.jp\0" +"rel.ht\0abb\0" +"abc\0" +"chikusei.ibaraki.jp\0tunes\0" +"hotel.hu\0bofa\0dnsdojo.org\0" +"mamurogawa.yamagata.jp\0" +"bindal.no\0kv\xc3\xa6nangen.no\0" +"medical.museum\0" +"sarufutsu.hokkaido.jp\0" +"2000.hu\0n\xc3\xa6r\xc3\xb8y.no\0" +"fukui.jp\0vipsinaapp.com\0" +"oharu.aichi.jp\0" +"lebtimnetz.de\0" +"bushey.museum\0" +"kashiwazaki.niigata.jp\0london\0" +"francaise.museum\0k12.wa.us\0" +"s3.ap-northeast-2.amazonaws.com\0" +"desa.id\0railroad.museum\0" +"r\xc3\xb8ros.no\0" +"pb.ao\0" +"bologna.it\0" +"aco\0" +"or.at\0" +"gratis\0" +"anpachi.gifu.jp\0" +"uenohara.yamanashi.jp\0" +"or.bi\0" +"\xe4\xb8\xad\xe5\x9b\xbd\0" +"from-mt.com\0from-nd.com\0" +"hobol.no\0perso.sn\0attorney\0" +"mitaka.tokyo.jp\0" +"ads\0kinder\0" +"h.se\0" +"or.ci\0s\xc3\xb8gne.no\0aeg\0" +"veg\xc3\xa5rshei.no\0\xe4\xb8\xad\xe5\x9c\x8b\0" +"n.bg\0ureshino.mie.jp\0" +"buzen.fukuoka.jp\0" +"ora.gunma.jp\0" +"unjarga.no\0au.eu.org\0be.eu.org\0" +"powiat.pl\0" +"perso.tn\0" +"kawaminami.miyazaki.jp\0dnipropetrovsk.ua\0" +"or.cr\0osteroy.no\0" +"ooshika.nagano.jp\0boehringer\0" +"kaho.fukuoka.jp\0missoula.museum\0lur\xc3\xb8y.no\0cc.al.us\0" +"docs\0" +"klabu.no\0" +"chita.ru\0" +"s3.cn-north-1.amazonaws.com.cn\0" +"foundation.museum\0l\xc3\xa1hppi.no\0comsec\0mcdonalds\0" +"afl\0" +"pesarourbino.it\0asahi.chiba.jp\0" +"iris.arpa\0inagawa.hyogo.jp\0takatsuki.osaka.jp\0" +"shiso.hyogo.jp\0" +"chofu.tokyo.jp\0viking.museum\0" +"\xc3\xa1k\xc5\x8boluokta.no\0" +"higashinaruse.akita.jp\0" +"vaapste.no\0yachts\0" +"friuli-vegiulia.it\0andria-barletta-trani.it\0grandrapids.museum\0" +"taiki.mie.jp\0dyndns.tv\0" +"gob.ar\0tools\0" +"mup.gov.pl\0" +"uto.kumamoto.jp\0palmsprings.museum\0" +"\xd1\x80\xd1\x84\0" +"akrehamn.no\0" +"caserta.it\0" +"mordovia.su\0" +"sld.do\0" +"farmers\0search\0" +"gob.bo\0nishikatsura.yamanashi.jp\0davvesiida.no\0" +"bialowieza.pl\0k12.la.us\0" +"frogn.no\0g\xc3\xa1ls\xc3\xa1.no\0sinaapp.com\0" +"vic.gov.au\0aero.tt\0aig\0" +"\xe8\xb0\xb7\xe6\xad\x8c\0" +"rel.pl\0" +"annaka.gunma.jp\0izumi.osaka.jp\0" +"tobetsu.hokkaido.jp\0ina.saitama.jp\0blogdns.net\0bg.eu.org\0" +"gob.cl\0capebreton.museum\0" +"embroidery.museum\0" +"miyako.fukuoka.jp\0" +"weibo\0" +"pol.dz\0mjondalen.no\0doha\0ptplus.fit\0" +"plus\0" +"yoshimi.saitama.jp\0\xe7\xa7\xbb\xe5\x8a\xa8\0is-a-republican.com\0al.leg.br\0" +"aero.mv\0" +"labour.museum\0\xe0\xae\x9a\xe0\xae\xbf\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xae\xaa\xe0\xaf\x8d\xe0\xae\xaa\xe0\xaf\x82\xe0\xae\xb0\xe0\xaf\x8d\0bond\0" +"kaluga.ru\0" +"koka.shiga.jp\0kicks-ass.org\0" +"ono.fukushima.jp\0takasago.hyogo.jp\0asahi.nagano.jp\0kadoma.osaka.jp\0gives\0dyndns.ws\0" +"gob.do\0" +"or.id\0tosashimizu.kochi.jp\0" +"bel.tr\0" +"p.bg\0" +"gob.ec\0" +"kindle\0" +"zp.ua\0" +"homeunix.org\0" +"miyota.nagano.jp\0" +"cc.ri.us\0" +"medecin.km\0kaluga.su\0" +"aisho.shiga.jp\0" +"mordovia.ru\0" +"nowaruda.pl\0" +"book\0" +"or.it\0" +"is-a-patsfan.org\0" +"sigdal.no\0" +"gob.es\0" +"\xe7\xa6\x8f\xe5\xb2\xa1.jp\0" +"lindas.no\0" +"potenza.it\0" +"nsk.ru\0" +"tsuiki.fukuoka.jp\0" +"or.jp\0" +"sk\xc3\xa1nit.no\0" +"b\xc3\xa1id\xc3\xa1r.no\0" +"lea\xc5\x8bgaviika.no\0" +"rifu.miyagi.jp\0" +"ibaraki.jp\0crown\0is-a-knight.org\0" +"mincom.tn\0" +"diamonds\0" +"coach\0" +"pol.ht\0" +"nemuro.hokkaido.jp\0" +"or.kr\0" +"rost.no\0" +"fuel.aero\0gob.gt\0kitagata.saga.jp\0" +"is-a-student.com\0" +"incheon.kr\0" +"idv.hk\0muroto.kochi.jp\0" +"valle-d-aosta.it\0modum.no\0" +"gob.hn\0" +"servecounterstrike.com\0" +"repbody.aero\0ed.ao\0vagan.no\0" +"himeshima.oita.jp\0" +"tajimi.gifu.jp\0takamori.nagano.jp\0" +"wif.gov.pl\0" +"anz\0" +"aol\0hr.eu.org\0" +"or.na\0" +"gildesk\xc3\xa5l.no\0" +"yahiko.niigata.jp\0" +"or.mu\0" +"rep.kp\0" +"shimada.shizuoka.jp\0" +"yokkaichi.mie.jp\0" +"santabarbara.museum\0republican\0*.cns.joyent.com\0" +"l.se\0" +"r.bg\0ed.ci\0surgut.ru\0" +"app\0" +"fjell.no\0" +"kurashiki.okayama.jp\0" +"york.museum\0" +"konskowola.pl\0dn.ua\0" +"green\0" +"ed.cr\0" +"backplaneapp.io\0" +"higashimurayama.tokyo.jp\0servebbs.org\0" +"yokosuka.kanagawa.jp\0tsaritsyn.ru\0" +"ot.it\0pd.it\0livinghistory.museum\0sandcats.io\0" +"bar\0" +"bbc\0" +"shima.mie.jp\0" +"shimonita.gunma.jp\0philadelphia.museum\0" +"show.aero\0carboniaiglesias.it\0koryo.nara.jp\0" +"giehtavuoatna.no\0" +"nadex\0" +"cieszyn.pl\0catholic\0" +"yamatotakada.nara.jp\0lebesby.no\0art\0bbt\0" +"or.pw\0" +"uconnect\0" +"paleo.museum\0bcg\0\xe9\x80\x9a\xe8\xb2\xa9\0" +"vibovalentia.it\0nobeoka.miyazaki.jp\0tsurugashima.saitama.jp\0" +"basilicata.it\0\xd0\xba\xd0\xb0\xd1\x82\xd0\xbe\xd0\xbb\xd0\xb8\xd0\xba\0" +"agric.za\0bcn\0" +"frogans\0" +"babia-gora.pl\0" +"sld.pa\0cruise\0" +"minamiechizen.fukui.jp\0rmit\0" +"walter\0" +"pug.it\0tono.iwate.jp\0joshkar-ola.ru\0" +"gob.mx\0hadsel.no\0hashbang.sh\0" +"gob.ni\0" +"fst.br\0" +"pyatigorsk.ru\0" +"masaki.ehime.jp\0" +"emp.br\0" +"fitjar.no\0" +"ashibetsu.hokkaido.jp\0uzhgorod.ua\0komatsu\0xfinity\0cloudcontrolapp.com\0" +"jorpeland.no\0" +"parti.se\0" +"dr.na\0h\xc3\xa1""bmer.no\0" +"biella.it\0" +"oristano.it\0" +"atsugi.kanagawa.jp\0" +"coal.museum\0stordal.no\0" +"gob.pa\0" +"grosseto.it\0bet\0" +"viterbo.it\0jobs\0rollag.no\0" +"or.th\0" +"shonai.fukuoka.jp\0yono.saitama.jp\0kunstsammlung.museum\0gob.pe\0n.se\0" "dontexist.com\0" -"yatsushiro.kumamoto.jp\0" -"h\xc3\xa5.no\0" -"js.cn\0niikappu.hokkaido.jp\0" -"gallery\0training\0" -"oguni.kumamoto.jp\0" -"\xe5\xaf\x8c\xe5\xb1\xb1.jp\0" -"homebuilt.aero\0" -"lowicz.pl\0" -"sokndal.no\0" -"prd.mg\0" -"kakinoki.shimane.jp\0" -"farmstead.museum\0active\0" -"adm.br\0" -"alibaba\0" -"kunigami.okinawa.jp\0" -"forgot.his.name\0" -"\xc3\xa5mot.no\0test.ru\0" -"bari.it\0" -"fukuchi.fukuoka.jp\0sap\0" -"in.rs\0" -"doshi.yamanashi.jp\0" +"t.bg\0" +"horse\0" +"kashiwa.chiba.jp\0gob.pk\0zt.ua\0" +"cc.wv.us\0" +"food\0health\0" +"vladimir.su\0dp.ua\0cc.md.us\0no-ip.net\0" +"cc.ar.us\0" +"tas.au\0\xe5\xb1\xb1\xe6\xa2\xa8.jp\0or.ug\0" +"tomisato.chiba.jp\0ibaraki.osaka.jp\0farmers.museum\0" +"\xe6\xbb\x8b\xe8\xb3\x80.jp\0yokote.akita.jp\0ine.kyoto.jp\0" +"or.tz\0" "monticello.museum\0" -"f.se\0" -"vs.it\0" -"cpa.pro\0" -"oygarden.no\0" -"tarui.gifu.jp\0" -"inzai.chiba.jp\0arida.wakayama.jp\0" -"sca\0" -"hokuto.hokkaido.jp\0okutama.tokyo.jp\0scb\0" -"sbs\0" -"name.vn\0" -"lib.wy.us\0" -"in.th\0" -"dubai\0" -"magnitka.ru\0vegas\0" -"otofuke.hokkaido.jp\0" -"taipei\0" -"trentinoa-adige.it\0" -"in.ua\0" -"ozu.kumamoto.jp\0" -"from-id.com\0" -"psi.br\0koshu.yamanashi.jp\0" -"capetown\0" -"fylkesbibl.no\0cc.nv.us\0pvt.k12.ma.us\0" -"hachioji.tokyo.jp\0" -"western.museum\0" -"store.bb\0kasama.ibaraki.jp\0" -"trentino-alto-adige.it\0terni.it\0kawaba.gunma.jp\0" -"name.tj\0" -"in.us\0" -"katagami.akita.jp\0kawazu.shizuoka.jp\0" -"mizunami.gifu.jp\0" -"tank.museum\0lib.ri.us\0" -"name.tr\0" -"kiwa.mie.jp\0name.tt\0" -"sm\xc3\xb8la.no\0" -"nakaniikawa.toyama.jp\0" -"online.museum\0hk.org\0" -"miyoshi.saitama.jp\0" -"asaminami.hiroshima.jp\0" -"cn.ua\0" -"fr\xc3\xb8ya.no\0" -"!city.kawasaki.jp\0fukuroi.shizuoka.jp\0" -"sew\0" -"izunokuni.shizuoka.jp\0sex\0" -"exeter.museum\0nesoddtangen.no\0" -"tsukuba.ibaraki.jp\0" -"m.se\0dreamhosters.com\0" -"yame.fukuoka.jp\0ouchi.saga.jp\0" -"amakusa.kumamoto.jp\0realtor\0" -"symantec\0" -"gyeonggi.kr\0" -"ooshika.nagano.jp\0isla.pr\0" -"eun.eg\0sund.no\0lib.ky.us\0" -"teramo.it\0" -"natori.miyagi.jp\0goto.nagasaki.jp\0" -"notteroy.no\0" -"sue.fukuoka.jp\0" -"beardu.no\0naamesjevuemie.no\0" -"iida.nagano.jp\0" -"skj\xc3\xa5k.no\0" -"ino.kochi.jp\0" -"valle-d-aosta.it\0" -"pz.it\0" -"eastafrica.museum\0" -"\xe0\xa4\xb8\xe0\xa4\x82\xe0\xa4\x97\xe0\xa4\xa0\xe0\xa4\xa8\0" -"minamiminowa.nagano.jp\0" -"name.qa\0" -"name.pr\0" -"jamison.museum\0" -"kai.yamanashi.jp\0" -"guitars\0" -"farmers.museum\0" -"ntr.br\0kamitonda.wakayama.jp\0" -"name.na\0" -"hanno.saitama.jp\0matsuzaki.shizuoka.jp\0" -"leclerc\0" -"napoli.it\0" -"inatsuki.fukuoka.jp\0name.mv\0" -"name.ng\0pl.ua\0police.uk\0" -"oxford.museum\0name.my\0" -"\xe7\xb6\xb2\xe7\xb5\xa1.cn\0kashima.saga.jp\0fuchu.tokyo.jp\0" -"coal.museum\0bridgestone\0software\0" -"campania.it\0rep.kp\0" -"sor-odal.no\0t.se\0" -"kyonan.chiba.jp\0hikawa.shimane.jp\0suginami.tokyo.jp\0" -"medical.museum\0cc.ut.us\0" -"kitakami.iwate.jp\0pa.gov.pl\0" -"ecn.br\0aizumi.tokushima.jp\0" -"amur.ru\0de.us\0" -"kikugawa.shizuoka.jp\0yoshida.shizuoka.jp\0" -"r\xc3\xa5holt.no\0" -"k12.de.us\0" -"international\0" -"sande.vestfold.no\0" -"\xd8\xaa\xd9\x88\xd9\x86\xd8\xb3\0" -"sky\0from-fl.com\0" -"seiyo.ehime.jp\0ariake.saga.jp\0" -"shiojiri.nagano.jp\0" -"koori.fukushima.jp\0bond\0" -"nakagyo.kyoto.jp\0" -"academy.museum\0" -"ra.it\0abeno.osaka.jp\0" -"eidskog.no\0" -"shirahama.wakayama.jp\0" -"dudinka.ru\0" -"bnpparibas\0" -"rybnik.pl\0\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb1\xd8\xaf\xd9\x86\0" -"lazio.it\0gdynia.pl\0" -"name.mk\0" -"\xe5\xae\xae\xe5\x9f\x8e.jp\0nagi.okayama.jp\0" -"is-an-artist.com\0" -"racing\0" -"hatsukaichi.hiroshima.jp\0sakai.ibaraki.jp\0chizu.tottori.jp\0" -"0.bg\0" -"nore-og-uvdal.no\0" -"ichinomiya.chiba.jp\0lezajsk.pl\0" -"bashkiria.ru\0" -"name.jo\0sciencehistory.museum\0" -"lucerne.museum\0vinnytsia.ua\0" -"\xe7\xb6\xb2\xe7\xb5\xa1.hk\0s3-website-us-east-1.amazonaws.com\0is-an-anarchist.com\0" -"annaka.gunma.jp\0" -"florence.it\0tajiri.osaka.jp\0" -"shikabe.hokkaido.jp\0" -"uchinada.ishikawa.jp\0" -"from-pr.com\0hobby-site.com\0" -"higashine.yamagata.jp\0" -"society.museum\0" -"soy\0" -"anamizu.ishikawa.jp\0" -"lom.it\0pohl\0" -"\xc3\xa5seral.no\0" -"kira.aichi.jp\0" -"pizza\0" -"ethnology.museum\0malselv.no\0" -"bayern\0tab\0" -"contact\0" -"tozsde.hu\0saves-the-whales.com\0" -"hokuto.yamanashi.jp\0" -"org.ac\0" -"ayabe.kyoto.jp\0" -"org.ae\0time.no\0cc.ct.us\0" -"org.af\0sobetsu.hokkaido.jp\0takinoue.hokkaido.jp\0sayama.osaka.jp\0" -"org.ag\0moscow\0" -"fukushima.jp\0hirado.nagasaki.jp\0" -"org.ai\0" -"org.al\0" -"org.an\0" -"tax\0" -"org.ba\0soundandvision.museum\0trust.museum\0" -"org.ar\0org.bb\0takasago.hyogo.jp\0" -"engine.aero\0" -"org.au\0kursk.ru\0is-very-bad.org\0" -"\xe6\x94\xbf\xe5\xba\x9c\0" -"org.bh\0" -"7.bg\0org.bi\0sola.no\0is-a-socialist.com\0" -"org.az\0" -"hitachi.ibaraki.jp\0" -"org.bm\0" -"org.bo\0" -"rome.it\0" -"tci\0" -"org.br\0tsukiyono.gunma.jp\0" -"org.bs\0ulm.museum\0" -"org.bt\0" -"padova.it\0iyo.ehime.jp\0" -"org.bw\0" -"sa.edu.au\0org.ci\0" -"org.bz\0shintoku.hokkaido.jp\0" -"stc\0" -"detroit.museum\0geelvinck.museum\0" -"org.cn\0" -"org.co\0sande.more-og-romsdal.no\0" -"sakata.yamagata.jp\0" -"sicily.it\0" -"org.cu\0lib.ak.us\0" -"org.cw\0" -"vang.no\0" -"maritimo.museum\0" -"org.dm\0" -"lapy.pl\0" -"org.do\0lom.no\0\xd0\xbc\xd0\xbe\xd0\xbd\0" -"stranda.no\0" -"sicilia.it\0takasu.hokkaido.jp\0kunitomi.miyazaki.jp\0sugito.saitama.jp\0" -"org.ec\0" -"tel\0" -"org.ee\0" -"nishimera.miyazaki.jp\0" -"org.eg\0" -"aichi.jp\0koto.tokyo.jp\0" -"org.dz\0" -"maryland.museum\0" -"minami.kyoto.jp\0homeftp.net\0" -"giving\0" -"ro.it\0turin.it\0wroclaw.pl\0" -"cc.pr.us\0" -"org.es\0from-mt.com\0from-nd.com\0" -"org.et\0\xe0\xa8\xad\xe0\xa8\xbe\xe0\xa8\xb0\xe0\xa8\xa4\0" -"langevag.no\0" -"yamanouchi.nagano.jp\0" -"r\xc3\xa6lingen.no\0fairwinds\0est-a-la-masion.com\0" -"hakui.ishikawa.jp\0" -"kuzumaki.iwate.jp\0sharp\0" -"toyono.osaka.jp\0saitama.saitama.jp\0" -"singles\0" -"military.museum\0" -"eniwa.hokkaido.jp\0" -"jerusalem.museum\0k12.wy.us\0is-a-designer.com\0" -"itayanagi.aomori.jp\0" -"trustee.museum\0" -"org.ge\0" -"amami.kagoshima.jp\0" -"parachuting.aero\0org.gg\0" -"org.gh\0ostroleka.pl\0" -"org.gi\0jondal.no\0stuff-4-sale.org\0" -"org.gn\0" -"servebbs.com\0" -"org.gp\0urawa.saitama.jp\0" -"org.gr\0lo.it\0" -"h\xc3\xb8nefoss.no\0" -"org.gt\0" -"from-nj.com\0" -"cc.wi.us\0" -"org.hk\0" -"org.hn\0" -"oystre-slidre.no\0k12.fl.us\0" -"nat.tn\0" -"encyclopedic.museum\0lib.nm.us\0" -"minamiaiki.nagano.jp\0" -"kv\xc3\xa6nangen.no\0oppdal.no\0k12.ri.us\0" -"org.ht\0" -"org.hu\0dagestan.ru\0" -"gangwon.kr\0" -"rad\xc3\xb8y.no\0" -"*.yokohama.jp\0mochizuki.nagano.jp\0shimoda.shizuoka.jp\0" -"org.im\0" -"org.in\0kunneppu.hokkaido.jp\0" -"marriott\0" -"org.iq\0" -"org.ir\0lodi.it\0shirakawa.gifu.jp\0kumamoto.kumamoto.jp\0" -"org.is\0alabama.museum\0photo\0" -"org.je\0" -"porn\0" -"kristiansand.no\0from-nh.com\0" -"rokunohe.aomori.jp\0" -"org.jo\0" -"la.us\0" -"chichibu.saitama.jp\0" -"afjord.no\0" -"tel.tr\0" -"asn.au\0k12.ky.us\0" -"org.kg\0" -"okawa.fukuoka.jp\0" -"org.ki\0" -"za.net\0" -"badajoz.museum\0" -"tenkawa.nara.jp\0post\0" -"org.km\0" -"org.kn\0" -"ohi.fukui.jp\0org.kp\0" -"org.la\0" -"\xe6\xa0\x83\xe6\x9c\xa8.jp\0org.lb\0" -"org.lc\0" -"caltanissetta.it\0" -"monza.it\0" -"vega.no\0" -"grosseto.it\0" -"council.aero\0org.ky\0pictures\0" -"org.kz\0" -"org.lk\0s3-website-ap-southeast-2.amazonaws.com\0" -"togo.aichi.jp\0wajima.ishikawa.jp\0tado.mie.jp\0" -"org.ma\0" -"org.lr\0dyndns.biz\0" -"org.ls\0" -"saga.jp\0" -"org.me\0h\xc3\xb8yanger.no\0" -"narashino.chiba.jp\0org.lv\0" -"org.mg\0and.museum\0" -"sos.pl\0" -"org.ly\0lib.mt.us\0lib.nd.us\0" -"tohnosho.chiba.jp\0poznan.pl\0" -"org.mk\0" -"org.ml\0" -"s3-website-ap-southeast-1.amazonaws.com\0" -"org.mn\0tmall\0" -"org.mo\0" -"cheltenham.museum\0org.na\0sor-aurdal.no\0" -"kusatsu.shiga.jp\0" -"org.ms\0" -"am.br\0toyone.aichi.jp\0org.mt\0" -"org.mu\0plumbing\0" -"org.mv\0bielawa.pl\0" -"org.mw\0org.ng\0" -"org.mx\0" -"org.my\0" -"work\0" -"toyama.jp\0" -"fh.se\0" -"pol.dz\0" -"gripe\0wales\0" -"tenei.fukushima.jp\0iwakuni.yamaguchi.jp\0po.gov.pl\0" -"family.museum\0" -"org.nr\0" -"bilbao.museum\0sf.no\0" -"hida.gifu.jp\0" -"lyngen.no\0" -"yokoshibahikari.chiba.jp\0" -"kamchatka.ru\0" -"nirasaki.yamanashi.jp\0top\0" -"brunel.museum\0" -"org.nz\0" -"meiwa.gunma.jp\0" -"org.om\0" -"hino.tottori.jp\0boleslawiec.pl\0" -"hareid.no\0" -"taa.it\0" -"org.pa\0" -"tagami.niigata.jp\0" -"komi.ru\0" -"kurogi.fukuoka.jp\0nakatombetsu.hokkaido.jp\0naha.okinawa.jp\0" -"org.pe\0" -"wakuya.miyagi.jp\0org.pf\0" -"org.ph\0" -"org.pk\0" -"higashi.fukushima.jp\0kushiro.hokkaido.jp\0org.pl\0" -"\xd0\xbe\xd1\x80\xd0\xb3.\xd1\x81\xd1\x80\xd0\xb1\0is-a-llama.com\0" -"desa.id\0org.pn\0" -"leksvik.no\0" -"org.qa\0" -"shirako.chiba.jp\0org.pr\0" -"org.ps\0" -"org.pt\0" -"gamvik.no\0org.py\0" -"ikawa.akita.jp\0" -"aircraft.aero\0" -"obama.fukui.jp\0" -"england.museum\0graz.museum\0lib.mo.us\0" -"akita.akita.jp\0nakagawa.hokkaido.jp\0" -"davvenj\xc3\xa1rga.no\0" -"embaixada.st\0" -"ambulance.aero\0" -"pol.ht\0" -"chuo.osaka.jp\0" -"l\xc3\xb8ten.no\0ubs\0" -"limited\0" -"bergbau.museum\0h\xc3\xa6gebostad.no\0" -"savona.it\0" -"org.ro\0uk.com\0" -"ski.museum\0org.sa\0" -"org.sb\0" -"ushistory.museum\0org.rs\0org.sc\0" -"org.sd\0" -"org.ru\0org.se\0amsterdam\0" -"coop.ht\0" -"usarts.museum\0org.sg\0" -"org.sh\0" -"iwate.iwate.jp\0" -"tuva.ru\0" -"org.sl\0" -"stadt.museum\0" -"org.sn\0" -"org.so\0" -"kisosaki.mie.jp\0" -"shunan.yamaguchi.jp\0" -"ohira.miyagi.jp\0wake.okayama.jp\0kyuragi.saga.jp\0org.st\0" -"kumano.mie.jp\0org.sv\0" -"porsanger.no\0org.sy\0" -"trentino-sudtirol.it\0org.sz\0org.tj\0gda.pl\0" -"tj\xc3\xb8me.no\0" -"museum.tt\0" -"org.tm\0lifestyle\0" -"org.tn\0" -"org.to\0" -"altoadige.it\0" -"org.ua\0tui\0" -"org.tr\0" -"r\xc3\xb8yken.no\0m\xc3\xa1tta-v\xc3\xa1rjjat.no\0" -"coop.br\0org.tt\0" -"brumunddal.no\0rv.ua\0gr.com\0" -"ingatlan.hu\0org.tw\0org.ug\0finance\0" +"sakawa.kochi.jp\0nakagawa.tokushima.jp\0" +"saitama.jp\0" +"ozu.ehime.jp\0college\0" +"pharmacy.museum\0" +"press.museum\0r\xc3\xb8yrvik.no\0gist.githubcloud.com\0" +"slattum.no\0" +"umi.fukuoka.jp\0" +"or.us\0axa\0" +"usa.oita.jp\0drammen.no\0" +"aws\0" +"e164.arpa\0" +"ed.jp\0" +"spjelkavik.no\0brasilia.me\0" +"trani-andria-barletta.it\0kasumigaura.ibaraki.jp\0studio\0" +"\xe3\x82\xaf\xe3\x83\xa9\xe3\x82\xa6\xe3\x83\x89\0" +"travelers\0" +"swiebodzin.pl\0" +"kure.hiroshima.jp\0" +"molise.it\0bid\0" +"iwatsuki.saitama.jp\0" +"pup.gov.pl\0" +"nhlfan.net\0" +"pol.tr\0" +"kyowa.akita.jp\0oum.gov.pl\0yolasite.com\0" +"bio\0" +"ford\0" +"rygge.no\0vladimir.ru\0" +"k12.wy.us\0servesarcasm.com\0" +"toyooka.hyogo.jp\0" +"nabari.mie.jp\0" +"gob.sv\0" +"biz\0nachikatsuura.wakayama.jp\0" +"*.kitakyushu.jp\0loan\0azure-mobile.net\0" +"chuo.fukuoka.jp\0satsumasendai.kagoshima.jp\0" +"compute.amazonaws.com\0" +"oz.au\0" +"badaddja.no\0" +"akabira.hokkaido.jp\0" +"kashiwara.osaka.jp\0idv.tw\0" "itakura.gunma.jp\0" -"mt.it\0semboku.akita.jp\0minami-alps.yamanashi.jp\0" -"uvic.museum\0org.uk\0" -"nishikata.tochigi.jp\0" -"hk.cn\0" -"namegawa.saitama.jp\0" -"rentals\0" -"volda.no\0org.vc\0" -"org.ve\0" -"kariya.aichi.jp\0asn.lv\0" -"jp.net\0" -"museumvereniging.museum\0philately.museum\0project.museum\0stordal.no\0lib.nv.us\0org.uy\0org.vi\0" -"org.uz\0football\0" -"!city.sendai.jp\0" -"lebesby.no\0vladimir.ru\0" -"org.vn\0" -"games.hu\0" -"kawakami.nara.jp\0" -"priv.hu\0" -"takamatsu.kagawa.jp\0foundation\0" -"fetsund.no\0org.vu\0" -"yotsukaido.chiba.jp\0" -"lv.ua\0" -"osen.no\0" -"soma.fukushima.jp\0fujisawa.kanagawa.jp\0" -"reggioemilia.it\0" -"\xed\x95\x9c\xea\xb5\xad\0" -"bando.ibaraki.jp\0" -"leka.no\0" -"oshima.tokyo.jp\0" -"presidio.museum\0st.no\0org.ws\0" -"space-to-rent.com\0" -"delaware.museum\0" -"kiyama.saga.jp\0" -"omaha.museum\0azure\0" -"matsukawa.nagano.jp\0kannami.shizuoka.jp\0" -"nakhodka.ru\0" -"suifu.ibaraki.jp\0" -"safety.aero\0songdalen.no\0" -"utazas.hu\0guge\0" -"kahoku.ishikawa.jp\0" -"gotsu.shimane.jp\0koge.tottori.jp\0" -"home.dyndns.org\0" -"trentinostirol.it\0kobayashi.miyazaki.jp\0" -"sm.ua\0" -"at.it\0monza-e-della-brianza.it\0" -"ishigaki.okinawa.jp\0musashimurayama.tokyo.jp\0" -"defense.tn\0" -"kosei.shiga.jp\0" -"nichinan.tottori.jp\0" -"\xd7\x99\xd7\xa8\xd7\x95\xd7\xa9\xd7\x9c\xd7\x99\xd7\x9d.museum\0" -"surgut.ru\0" -"taito.tokyo.jp\0" -"isleofman.museum\0" -"oksnes.no\0" -"volkenkunde.museum\0" -"minamimaki.nagano.jp\0" -"cologne\0" +"association.museum\0is-a-personaltrainer.com\0" +"ringerike.no\0" +"p.se\0lib.or.us\0" +"folkebibl.no\0" +"v.bg\0" +"uwajima.ehime.jp\0maserati\0" +"oskol.ru\0gob.ve\0z-2.compute-1.amazonaws.com\0" +"urasoe.okinawa.jp\0" +"kumagaya.saitama.jp\0warszawa.pl\0" +"dr.tr\0" +"can.museum\0" +"skanit.no\0" +"ap-northeast-1.compute.amazonaws.com\0" +"atsuma.hokkaido.jp\0mitou.yamaguchi.jp\0" +"va.it\0isesaki.gunma.jp\0" +"rhcloud.com\0" +"mitsue.nara.jp\0" +"columbia.museum\0" +"shimizu.hokkaido.jp\0\xd9\x87\xd9\x85\xd8\xb1\xd8\xa7\xd9\x87\0" +"cadaques.museum\0" +"is-a-bruinsfan.org\0sells-it.net\0" +"chungnam.kr\0" +"akashi.hyogo.jp\0" +"nsw.au\0" +"barum.no\0" +"ms.leg.br\0" +"bms\0" +"dnsdojo.net\0" +"yomitan.okinawa.jp\0" +"bmw\0" +"\xd0\xbf\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0" +"villas\0" +"endofinternet.net\0" +"haibara.shizuoka.jp\0bnl\0" +"ed.pw\0" +"yamaguchi.jp\0" +"medecin.fr\0" +"suzuka.mie.jp\0" +"tamaki.mie.jp\0" +"nirasaki.yamanashi.jp\0" +"catanzaro.it\0" +"nordre-land.no\0" +"ustka.pl\0" +"bom\0" +"nic.in\0" +"froya.no\0k12.mi.us\0boo\0" +"station.museum\0is-a-blogger.com\0" +"coffee\0loft\0" +"mt.leg.br\0" +"tires\0" +"iwamizawa.hokkaido.jp\0bot\0" +"box\0" +"kamo.niigata.jp\0nativeamerican.museum\0" +"friuli-ve-giulia.it\0from-or.com\0" +"ohira.tochigi.jp\0" +"bomlo.no\0\xd8\xa7\xd8\xa8\xd9\x88\xd8\xb8\xd8\xa8\xd9\x8a\0" +"cab\0" +"nagai.yamagata.jp\0" +"czeladz.pl\0" +"tonaki.okinawa.jp\0" +"dentist\0" +"communication.museum\0fusa.no\0condos\0host\0" +"lib.vi.us\0cal\0ufcfan.org\0" +"emr.it\0va.no\0r.se\0cam\0" +"gushikami.okinawa.jp\0sayama.saitama.jp\0" +"sosa.chiba.jp\0geology.museum\0" +"x.bg\0" +"fyresdal.no\0cba\0noip.us\0" +"car\0" +"\xe7\xbe\xa4\xe9\xa6\xac.jp\0minobu.yamanashi.jp\0" +"cat\0js.cn\0" +"publ.pt\0" +"assabu.hokkaido.jp\0cafe\0" +"sumoto.kumamoto.jp\0ar.com\0from-vt.com\0" +"vc.it\0chiyoda.tokyo.jp\0" +"cbn\0" +"cbs\0" +"correios-e-telecomunica\xc3\xa7\xc3\xb5""es.museum\0" +"asmatart.museum\0shell\0" +"yamato.kumamoto.jp\0azure\0compare\0" +"*.nagoya.jp\0music.museum\0farsund.no\0" +"il.eu.org\0" +"\xe6\xa0\x83\xe6\x9c\xa8.jp\0tanagura.fukushima.jp\0mibu.tochigi.jp\0" +"\xc3\xb8rland.no\0" +"nt.edu.au\0" +"s3-ap-northeast-2.amazonaws.com\0" +"tama.tokyo.jp\0" +"kosai.shizuoka.jp\0from-in.com\0" +"forsale\0alpha-myqnapcloud.com\0" +"nagano.nagano.jp\0taira.toyama.jp\0schmidt\0" +"trade\0" +"ceb\0" +"meloy.no\0" +"casino.hu\0tatar\0" +"auction\0" +"reviews\0" +"s\xc3\xb8r-fron.no\0vaksdal.no\0" +"yabu.hyogo.jp\0hu.eu.org\0ie.eu.org\0" +"hopto.org\0" +"kasukabe.saitama.jp\0" +"ceo\0logoip.de\0" +"soo.kagoshima.jp\0cfa\0" +"hiroshima.jp\0daito.osaka.jp\0baltimore.museum\0" +"minamioguni.kumamoto.jp\0" +"tarui.gifu.jp\0*.sch.uk\0cfd\0" +"matsushima.miyagi.jp\0" +"kerrylogistics\0" +"numata.gunma.jp\0" +"buy\0" +"hachioji.tokyo.jp\0us.na\0" +"flanders.museum\0irkutsk.ru\0seven\0" +"matta-varjjat.no\0" +"fr\xc3\xa6na.no\0chtr.k12.ma.us\0" +"blanco\0emerson\0" +"matsubushi.saitama.jp\0t.se\0" +"shintoku.hokkaido.jp\0" +"z.bg\0" +"vinnica.ua\0" +"\xe7\xbb\x84\xe7\xbb\x87\xe6\x9c\xba\xe6\x9e\x84\0" +"soka.saitama.jp\0" +"cal.it\0" +"cc.sc.us\0" +"wroclaw.pl\0" +"*.cryptonomic.net\0" +"sejny.pl\0deals\0\xd9\x85\xd9\x88\xd8\xa8\xd8\xa7\xd9\x8a\xd9\x84\xd9\x8a\0" +"ve.it\0\xe7\xa7\x8b\xe7\x94\xb0.jp\0matsubara.osaka.jp\0americanantiques.museum\0" +"\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\xd9\x87\0" +"ham-radio-op.net\0" +"forum.hu\0otaru.hokkaido.jp\0s\xc3\xa1l\xc3\xa1t.no\0skjervoy.no\0" +"mitsuke.niigata.jp\0jevnaker.no\0iki.fi\0" +"company\0" +"kami.miyagi.jp\0" +"va.us\0is-a-green.com\0" "call\0" -"historisches.museum\0" -"asker.no\0hornindal.no\0from-tx.com\0" -"jgora.pl\0" -"barrell-of-knowledge.info\0" -"l\xc3\xa6rdal.no\0" -"rzeszow.pl\0" -"izu.shizuoka.jp\0" -"jewish.museum\0aejrie.no\0" -"blogspot.co.at\0priv.at\0" -"lombardy.it\0" -"minamiise.mie.jp\0school\0" -"botanicalgarden.museum\0freemasonry.museum\0lur\xc3\xb8y.no\0" -"omihachiman.shiga.jp\0" -"tr.it\0hokkaido.jp\0miyoshi.hiroshima.jp\0klodzko.pl\0camp\0" -"suisse.museum\0\xe5\x81\xa5\xe5\xba\xb7\0" -"denmark.museum\0" -"in.net\0" -"trysil.no\0is-a-green.com\0" -"lib.ia.us\0" -"minamiboso.chiba.jp\0" -"karmoy.no\0k12.nm.us\0" -"mil.ac\0a.bg\0film\0" -"liaison\0" -"mil.ae\0" -"bologna.it\0museum.mv\0from-co.net\0" -"museum.mw\0" -"kaneyama.fukushima.jp\0" -"mil.al\0" -"val-daosta.it\0" -"okaya.nagano.jp\0pol.tr\0" -"mil.ba\0museum.no\0business\0uno\0" -"mil.ar\0macerata.it\0" -"government.aero\0cc.me.us\0" -"toba.mie.jp\0watarai.mie.jp\0meguro.tokyo.jp\0help\0" -"shiksha\0" -"mil.az\0abruzzo.it\0" -"barclaycard\0" -"uol\0" -"mil.bo\0museum.om\0lib.ca.us\0" -"naval.museum\0" -"mil.br\0abashiri.hokkaido.jp\0" -"dyndns-work.com\0" -"fot.br\0" -"s\xc3\xb8rfold.no\0" -"mus.br\0" -"mil.by\0website\0from-dc.com\0" -"\xe6\x96\xb0\xe6\xbd\x9f.jp\0" -"mil.cl\0" -"scholarships\0" -"mil.cn\0" -"aero\0mil.co\0" -"avocat.fr\0kawahara.tottori.jp\0" -"heroy.nordland.no\0" -"arakawa.tokyo.jp\0" +"ballooning.aero\0hirogawa.wakayama.jp\0taipei\0" +"aogashima.tokyo.jp\0nationalheritage.museum\0aarp\0" +"lund.no\0loten.no\0tirol\0" +"dell-ogliastra.it\0" +"dental\0" +"kitamoto.saitama.jp\0" +"aseral.no\0" +"miyake.nara.jp\0orenburg.ru\0" +"kamaishi.iwate.jp\0camp\0" +"bzh\0" +"nic.tj\0" +"\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\xd8\xa9\0" +"is-a-designer.com\0" +"fylkesbibl.no\0" +"tochigi.jp\0" +"sevastopol.ua\0k12.me.us\0" +"from-ks.com\0" +"k12.as.us\0" +"sobetsu.hokkaido.jp\0oyamazaki.kyoto.jp\0\xd9\xbe\xd8\xa7\xd9\x83\xd8\xb3\xd8\xaa\xd8\xa7\xd9\x86\0" +"nhs.uk\0" +"awaji.hyogo.jp\0" +"\xe6\xb2\x96\xe7\xb8\x84.jp\0" +"trysil.no\0" +"kariwa.niigata.jp\0" +"tajiri.osaka.jp\0" +"calvinklein\0genting\0fbx-os.fr\0" +"pp.az\0" +"traeumtgerade.de\0" +"nedre-eiker.no\0amica\0" +"bykle.no\0" +"tsuwano.shimane.jp\0arteducation.museum\0" +"tanohata.iwate.jp\0nose.osaka.jp\0" +"pohl\0z-1.compute-1.amazonaws.com\0" +"tromso.no\0" +"venice.it\0noip.me\0" +"builders\0" +"eu.com\0" +"asso.eu.org\0" +"toray\0" +"nagaokakyo.kyoto.jp\0" +"flights\0" +"kumamoto.kumamoto.jp\0" +"cc.az.us\0" +"journalism.museum\0" +"\xe8\xaf\xba\xe5\x9f\xba\xe4\xba\x9a\0" +"omi.niigata.jp\0" +"lodi.it\0pn.it\0" +"usuki.oita.jp\0helsinki.museum\0" +"\xed\x95\x9c\xea\xb5\xad\0" +"moriyoshi.akita.jp\0" +"ikeda.nagano.jp\0" "care\0" -"austrheim.no\0her\xc3\xb8y.m\xc3\xb8re-og-romsdal.no\0" -"tur.ar\0" -"humanities.museum\0" -"showa.fukushima.jp\0monash\0" -"tr.no\0" -"yoita.niigata.jp\0" -"mil.do\0" -"nakatsugawa.gifu.jp\0" -"mil.ec\0mt.us\0nd.us\0casa\0" -"sirdal.no\0cars\0iki.fi\0" -"mil.eg\0youth.museum\0k12.mn.us\0sa.com\0" -"tur.br\0cash\0" -"h.bg\0" -"tsubame.niigata.jp\0" -"davvenjarga.no\0" -"shimizu.hokkaido.jp\0" -"budapest\0" -"sagae.yamagata.jp\0" +"naturhistorisches.museum\0" +"friuli-vgiulia.it\0cruises\0" +"hikone.shiga.jp\0" +"paragliding.aero\0hirata.fukushima.jp\0chiyoda.gunma.jp\0sumoto.hyogo.jp\0" +"noda.chiba.jp\0texas.museum\0love\0" +"scientist.aero\0hurum.no\0" +"casa\0ubank\0" +"esurance\0goip.de\0" +"sakaiminato.tottori.jp\0burghof.museum\0cars\0" +"shiogama.miyagi.jp\0" +"case\0" +"webhop.info\0gr.eu.org\0" +"com\0\xe3\x82\xb9\xe3\x83\x88\xe3\x82\xa2\0" +"school.na\0cash\0" +"toyoake.aichi.jp\0" +"discovery.museum\0" +"uppo.gov.pl\0" +"frosta.no\0" +"author.aero\0" +"gotemba.shizuoka.jp\0nesodden.no\0" +"asker.no\0fhv.se\0\xe7\xbd\x91\xe5\xba\x97\0" +"obuse.nagano.jp\0aarborte.no\0" +"museet.museum\0golffan.us\0" +"altai.ru\0komvux.se\0\xd0\xbe\xd0\xbd\xd0\xbb\xd0\xb0\xd0\xb9\xd0\xbd\0" +"marche.it\0guovdageaidnu.no\0" +"grong.no\0" +"*.kawasaki.jp\0" +"itoigawa.niigata.jp\0travel.pl\0" +"pfizer\0" +"\xd0\xb4\xd0\xb5\xd1\x82\xd0\xb8\0" +"dad\0" +"hanggliding.aero\0shimabara.nagasaki.jp\0environment.museum\0" +"etc.br\0" +"school.nz\0statefarm\0" +"satte.saitama.jp\0gol.no\0" +"cherkassy.ua\0" +"lier.no\0" +"laz.it\0" +"matsuyama.ehime.jp\0kamchatka.ru\0wales\0" +"shiroishi.saga.jp\0" +"tokke.no\0" +"dyndns-web.com\0" +"day\0" +"quebec\0" +"cri.nz\0x.se\0report\0" +"lib.fl.us\0able\0" +"l\xc3\xb8ten.no\0" +"art.museum\0crs\0csc\0" +"pl.ua\0samsung\0" +"cc.mn.us\0securitytactics.com\0" +"yonaguni.okinawa.jp\0rennebu.no\0cc.gu.us\0" +"vi.it\0" +"*.alwaysdata.net\0" +"en.it\0wedding\0" +"mutuelle\0" +"sorum.no\0kiev.ua\0" +"office-on-the.net\0" +"hadano.kanagawa.jp\0krager\xc3\xb8.no\0" +"journalist.aero\0ogata.akita.jp\0" +"sciencecenters.museum\0" +"barcelona\0kuokgroup\0" +"shingu.wakayama.jp\0" +"trentinoaltoadige.it\0gallery.museum\0game\0" +"\xe6\x94\xbf\xe5\xba\x9c.hk\0" +"dds\0" +"uvic.museum\0from-me.org\0" +"odo.br\0\xe7\xbd\x91\xe7\xbb\x9c.cn\0\xe9\x9d\x99\xe5\xb2\xa1.jp\0nordreisa.no\0engineer\0" +"kaizuka.osaka.jp\0trolley.museum\0" +"travel.tt\0" +"vda.it\0" +"bible.museum\0" +"miyoshi.hiroshima.jp\0kg.kr\0" +"dabur\0" +"toyoura.hokkaido.jp\0udmurtia.ru\0" +"leksvik.no\0bentley\0jprs\0" +"dev\0" +"trader.aero\0kochi.kochi.jp\0" +"kamifurano.hokkaido.jp\0" +"australia.museum\0k12.ma.us\0" +"tenkawa.nara.jp\0" +"bizen.okayama.jp\0" +"oumu.hokkaido.jp\0" +"from-ma.com\0" +"wiki.br\0porn\0" +"vads\xc3\xb8.no\0" +"leirvik.no\0" +"yasu.shiga.jp\0" +"tank.museum\0k\xc3\xa5""fjord.no\0" +"yufu.oita.jp\0" +"se.net\0hopto.me\0" +"okinoshima.shimane.jp\0" +"mino.gifu.jp\0bo.telemark.no\0" +"fukuroi.shizuoka.jp\0" +"nes.akershus.no\0post\0" +"lib.va.us\0" +"z.se\0" +"uryu.hokkaido.jp\0" +"dhl\0" +"gon.pk\0" +"fin.ec\0adult.ht\0" +"doesntexist.com\0" +"kaisei.kanagawa.jp\0" +"sk\xc3\xa5nland.no\0" +"versailles.museum\0olayan\0" +"tendo.yamagata.jp\0" +"pr.it\0gs.mr.no\0" +"room\0" +"serveexchange.com\0" +"beauxarts.museum\0" +"dynns.com\0" +"baidu\0" +"\xe7\xbd\x91\xe7\xbb\x9c.hk\0" +"newspaper.museum\0" +"historical.museum\0\xe7\xbd\x91\xe7\xbb\x9c\0" +"odate.akita.jp\0diy\0" +"railway.museum\0masoy.no\0" +"is-a-player.com\0" +"sport.hu\0sciencecenter.museum\0" +"saltdal.no\0" +"playstation\0" +"atami.shizuoka.jp\0" +"download\0" +"chambagri.fr\0sar.it\0hvaler.no\0" +"haboro.hokkaido.jp\0tranoy.no\0" +"lapy.pl\0" +"iselect\0yamaxun\0" +"vestre-toten.no\0phone\0" +"bryansk.su\0" +"navuotna.no\0" +"dscloud.me\0" +"oyer.no\0bielawa.pl\0" +"pp.ru\0pp.se\0volvo\0" +"kuki.saitama.jp\0free\0" +"newport.museum\0" +"fujiyoshida.yamanashi.jp\0" +"amsterdam\0" +"sund.no\0" +"urayasu.chiba.jp\0" +"nflfan.org\0" +"uki.kumamoto.jp\0" +"etisalat\0" +"fuchu.hiroshima.jp\0" +"logoip.com\0" +"gop.pk\0" +"asago.hyogo.jp\0higashimatsuyama.saitama.jp\0cbre\0" +"pp.ua\0" +"nakagawa.fukuoka.jp\0luxembourg.museum\0" +"cc.hi.us\0" +"dnp\0" +"kurotaki.nara.jp\0ogose.saitama.jp\0\xd0\xbe\xd0\xb1\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0" +"naha.okinawa.jp\0" +"pt.it\0kasamatsu.gifu.jp\0" +"dog\0" +"minamiminowa.nagano.jp\0" +"tcm.museum\0is-uberleet.com\0" +"depot.museum\0" +"bryansk.ru\0" +"vi.us\0" +"gov.ac\0web.co\0anquan\0" +"maibara.shiga.jp\0dot\0" +"gov.ae\0kyotanabe.kyoto.jp\0" +"gov.af\0tadaoka.osaka.jp\0codes\0" +"keymachine.de\0" +"gov.al\0" +"from-ct.com\0from-la.net\0" +"kofu.yamanashi.jp\0" +"baseball.museum\0" +"gov.ba\0" +"gov.ar\0gov.bb\0fujikawa.yamanashi.jp\0" +"gov.as\0web.do\0" +"\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4\0rexroth\0" +"gov.au\0" +"gov.bf\0" +"hamburg.museum\0" +"gov.bh\0copenhagen.museum\0" +"namsos.no\0" +"gov.az\0saku.nagano.jp\0" +"gov.bm\0" +"shimane.jp\0" +"gov.bo\0" +"k12.nm.us\0" +"gov.br\0" +"gov.bs\0film.museum\0maif\0yodobashi\0" +"gov.bt\0gov.cd\0eat\0" +"gbiz\0" +"eti.br\0" +"gov.by\0" +"ecn.br\0gov.bz\0" +"wa.au\0" +"gov.cl\0" +"gov.cm\0tsuno.kochi.jp\0" +"gov.cn\0endofinternet.org\0" +"gov.co\0maison\0" +"\xc3\xb8ygarden.no\0" +"rogers\0" +"iwafune.tochigi.jp\0" +"photo\0" +"gov.cu\0\xd8\xa8\xd8\xa7\xd8\xb2\xd8\xa7\xd8\xb1\0" +"calabria.it\0fuso.aichi.jp\0" +"g\xc3\xa1ivuotna.no\0" +"council.aero\0gov.cx\0" +"gov.cy\0kusatsu.gunma.jp\0kikonai.hokkaido.jp\0" +"kitayama.wakayama.jp\0" +"shinshinotsu.hokkaido.jp\0\xe7\xb5\x84\xe7\xb9\x94.tw\0" +"gov.dm\0timekeeping.museum\0" +"communications.museum\0" +"gov.do\0pacific.museum\0eco\0" +"imabari.ehime.jp\0" +"gov.ec\0" +"qh.cn\0gov.ee\0" +"salangen.no\0" +"gov.eg\0" +"boleslawiec.pl\0" +"cc.mt.us\0cc.nd.us\0" +"gov.dz\0" +"computerhistory.museum\0nes.buskerud.no\0" +"eidsvoll.no\0" +"pv.it\0\xe5\x95\x86\xe6\xa0\x87\0" +"gs.hm.no\0" +"qld.au\0gov.et\0" +"edu\0scotland.museum\0" +"takatsuki.shiga.jp\0dtv\0" +"web.id\0" +"pr.us\0pantheonsite.io\0" "kirov.ru\0" -"br.it\0cb.it\0mie.jp\0" -"bd.se\0" -"\xe6\x9d\xb1\xe4\xba\xac.jp\0" -"game-host.org\0" -"yachiyo.ibaraki.jp\0" -"h\xc3\xa1pmir.no\0" -"otake.hiroshima.jp\0" -"blogspot.co.il\0" -"marylhurst.museum\0" +"fujioka.gunma.jp\0" +"nesseby.no\0" +"narita.chiba.jp\0" +"hurdal.no\0" +"travelersinsurance\0" +"baidar.no\0" +"\xc3\xb8yer.no\0" +"gov.ge\0n\xc3\xa5\xc3\xa5mesjevuemie.no\0" +"writesthisblog.com\0" +"gov.gh\0" +"gov.gi\0california.museum\0" +"kushima.miyazaki.jp\0" +"house\0zuerich\0" +"shinjo.yamagata.jp\0" +"gov.gn\0" +"servebbs.com\0" +"crafts.museum\0" +"gov.gr\0dvr\0" +"photos\0" +"dwg\0town\0" +"friuliv-giulia.it\0accenture\0" +"gov.gy\0gujo.gifu.jp\0minamiaiki.nagano.jp\0" +"konan.shiga.jp\0" +"gov.hk\0lamer\0" +"okoppe.hokkaido.jp\0grocery\0" +"honjyo.akita.jp\0" +"catering.aero\0eniwa.hokkaido.jp\0adac\0" +"higashiizumo.shimane.jp\0oyabe.toyama.jp\0" +"\xc3\xa5rdal.no\0" +"alpha.bounty-full.com\0" +"pgafan.net\0" +"sanofi\0" +"gov.ie\0osaka\0" +"\xc3\xa5s.no\0" +"minamata.kumamoto.jp\0is.gov.pl\0" +"scrapping.cc\0" +"skaun.no\0" +"pictet\0" +"gov.il\0fin.tn\0" +"gov.in\0" +"web.lk\0" +"shiroi.chiba.jp\0" +"gov.iq\0" +"gov.ir\0" +"gov.is\0" +"gov.it\0" +"fukudomi.saga.jp\0boston.museum\0frog.museum\0moskenes.no\0" +"gamagori.aichi.jp\0fuchu.tokyo.jp\0vote\0" +"lib.pr.us\0" +"toys\0" +"gov.jo\0birthplace.museum\0" +"minamiuonuma.niigata.jp\0" +"huissier-justice.fr\0luxury\0" +"voto\0" +"community.museum\0silk.museum\0namsskogan.no\0" +"higashiagatsuma.gunma.jp\0" +"gov.kg\0\xe4\xbc\x81\xe4\xb8\x9a\0" +"gov.ki\0" +"web.nf\0" +"aramco\0" +"gov.km\0web.ni\0" +"gov.kn\0bodo.no\0dyndns-pics.com\0" +"makurazaki.kagoshima.jp\0" +"fukusaki.hyogo.jp\0gov.kp\0" +"cesena-forli.it\0gov.la\0" +"mifune.kumamoto.jp\0gov.lb\0" +"gov.lc\0systems\0" +"tr\xc3\xa6na.no\0" +"gov.ky\0salem.museum\0" +"saroma.hokkaido.jp\0gov.kz\0" +"gov.lk\0" +"kunneppu.hokkaido.jp\0pila.pl\0fareast.ru\0" +"gaivuotna.no\0" +"investments\0\xe3\x81\xbf\xe3\x82\x93\xe3\x81\xaa\0" +"shibata.niigata.jp\0kongsvinger.no\0" +"gov.ma\0tickets\0" +"gov.lr\0" +"mulhouse.museum\0nuernberg.museum\0" +"gov.lt\0b\xc3\xa1hcavuotna.no\0" +"gov.me\0" +"gov.lv\0" +"gov.mg\0kommunalforbund.se\0is-very-evil.org\0" +"l\xc3\xb8""dingen.no\0" +"gov.ly\0" +"gov.mk\0" +"gov.ml\0" +"total\0" +"gov.mn\0" +"gov.mo\0web.pk\0" +"gov.mr\0\xd8\xa8\xda\xbe\xd8\xa7\xd8\xb1\xd8\xaa\0" +"gov.ms\0jefferson.museum\0" +"tuscany.it\0" +"friulivegiulia.it\0kitahata.saga.jp\0gov.mu\0" +"gov.mv\0" +"gov.mw\0gov.ng\0zgrad.ru\0physio\0" +"istanbul\0secure\0" +"isahaya.nagasaki.jp\0gov.my\0lebork.pl\0" +"veterinaire.km\0gov.mz\0" +"kanagawa.jp\0" +"sado.niigata.jp\0fineart.museum\0" +"kashihara.nara.jp\0" +"gov.nr\0" +"narviika.no\0" +"kunigami.okinawa.jp\0agakhan\0" +"alessandria.it\0" +"tolga.no\0" +"izumisano.osaka.jp\0contact\0" +"\xe5\xaf\x8c\xe5\xb1\xb1.jp\0namegawa.saitama.jp\0" +"miyoshi.aichi.jp\0finearts.museum\0" +"gov.om\0" +"zone\0" +"neues.museum\0" +"syzran.ru\0bargains\0" +"daegu.kr\0" +"lib.wi.us\0" +"ambulance.aero\0gov.ph\0" +"hsbc\0icbc\0" +"kusatsu.shiga.jp\0gov.pk\0" +"gov.pl\0krasnoyarsk.ru\0fr.eu.org\0" +"fj.cn\0" +"showa.fukushima.jp\0gov.pn\0km.ua\0" +"cc.nh.us\0" +"gov.qa\0" +"gov.pr\0jp.net\0poznan.pl\0" +"gov.ps\0safe\0" +"mil.ac\0archaeological.museum\0gov.pt\0r.cdn77.net\0" +"vs.it\0" +"mil.ae\0pz.it\0" +"guardian\0" +"c.cdn77.org\0" +"gov.py\0airtel\0" +"gjerdrum.no\0" +"mil.al\0" +"web.tj\0" +"veterinaire.fr\0chanel\0" +"mil.ba\0" +"mil.ar\0" +"lviv.ua\0" +"web.tr\0" +"kiwi.nz\0" +"sand\xc3\xb8y.no\0" +"mil.az\0\xe0\xa6\xad\xe0\xa6\xbe\xe0\xa6\xb0\xe0\xa6\xa4\0" +"sarpsborg.no\0fan\0" +"mil.bo\0poivron.org\0" +"gov.sa\0" +"gov.sb\0" +"mil.br\0gov.rs\0gov.sc\0" +"gov.sd\0" +"gov.ru\0lanxess\0" +"gov.rw\0gov.sg\0is-a-socialist.com\0" +"gov.sh\0intuit\0" +"web.ve\0" +"mil.by\0" +"gov.sl\0" +"mil.cl\0gangwon.kr\0rivne.ua\0" +"shimamaki.hokkaido.jp\0glas.museum\0" +"mil.cn\0" +"ac.ae\0mil.co\0honai.ehime.jp\0" +"narusawa.yamanashi.jp\0k12.ms.us\0k12.nc.us\0" +"k12.il.us\0\xe9\xa6\x99\xe6\xa0\xbc\xe9\x87\x8c\xe6\x8b\x89\0" +"gov.st\0" +"services.aero\0gov.sx\0" +"gov.sy\0" +"gov.tj\0" +"gov.tl\0" +"gov.tm\0" +"gov.tn\0" +"ac.at\0gov.to\0" +"ac.be\0mil.do\0steigen.no\0" +"gov.ua\0esq\0vacations\0" +"taki.mie.jp\0gov.tr\0" +"mil.ec\0tsuruga.fukui.jp\0stockholm.museum\0gov.tt\0" +"gov.tw\0" +"mil.eg\0landes.museum\0" +"murayama.yamagata.jp\0" +"b\xc3\xb8.telemark.no\0" +"kanzaki.saga.jp\0gov.uk\0" +"mypsx.net\0" +"per.la\0" +"lib.ky.us\0baseball\0" +"miyada.nagano.jp\0lib.ak.us\0gov.vc\0" +"1.bg\0ac.ci\0jeonbuk.kr\0" +"gov.ve\0is-lost.org\0" +"tushu\0\xe4\xbf\xa1\xe6\x81\xaf\0" +"ac.cn\0nasushiobara.tochigi.jp\0hyundai\0" +"cc.nj.us\0" +"cc.ia.us\0" +"exhibition.museum\0" +"ac.cr\0" +"gov.vn\0ferrari\0lilly\0" +"fortmissoula.museum\0" +"gs.nl.no\0bearalv\xc3\xa1hki.no\0passagens\0" +"lc.it\0missile.museum\0" +"eus\0sale\0select\0" +"ac.cy\0hasvik.no\0" +"andebu.no\0web.za\0memorial\0" "mil.ge\0" -"shikama.miyagi.jp\0" -"mini\0" -"mil.gh\0tobishima.aichi.jp\0podzone.net\0" -"avoues.fr\0" -"here\0lifeinsurance\0is-an-engineer.com\0" -"komagane.nagano.jp\0fish\0endofinternet.net\0" -"lajolla.museum\0" -"dlugoleka.pl\0" -"mol.it\0" -"mil.gt\0" -"museum\0castle.museum\0udm.ru\0" -"katsuura.chiba.jp\0" -"arts.museum\0" -"kuromatsunai.hokkaido.jp\0minowa.nagano.jp\0" -"hadano.kanagawa.jp\0lawyer\0" -"oryol.ru\0guru\0" -"mil.hn\0mifune.kumamoto.jp\0" -"yaizu.shizuoka.jp\0" -"lecce.it\0" +"marshalls\0" +"mil.gh\0wa.us\0" +"shirakawa.gifu.jp\0" +"spreadbetting\0yahoo\0" +"coloradoplateau.museum\0" +"medizinhistorisches.museum\0loab\xc3\xa1t.no\0" +"\xe7\xb5\x84\xe7\xb9\x94.hk\0theater.museum\0\xe8\x81\x94\xe9\x80\x9a\0" +"zao.miyagi.jp\0taketomi.okinawa.jp\0from-ak.com\0" +"gov.ws\0" +"nakaniikawa.toyama.jp\0per.nf\0" +"mil.gt\0bungoono.oita.jp\0bo.nordland.no\0" +"skodje.no\0dnsfor.me\0" +"westfalen.museum\0" +"naples.it\0\xe5\x8d\x83\xe8\x91\x89.jp\0toyotomi.hokkaido.jp\0tsuyama.okayama.jp\0bugatti\0" +"mil.hn\0" +"kadena.okinawa.jp\0" +"balat.no\0" "mil.id\0" -"m\xc3\xa1latvuopmi.no\0\xe5\x9c\xa8\xe7\xba\xbf\0" -"vet\0" -"olecko.pl\0" -"newjersey.museum\0" -"celtic.museum\0delivery\0" -"\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xdb\x8c\xd8\xa9\0" -"mil.in\0" -"k12.ok.us\0supplies\0\xd0\xbe\xd1\x80\xd0\xb3\0" -"mil.iq\0" -"ouda.nara.jp\0chihayaakasaka.osaka.jp\0iwi.nz\0" -"o.bg\0skjak.no\0" -"travel.pl\0" -"for-our.info\0" -"mobi.gp\0embetsu.hokkaido.jp\0" -"rennesoy.no\0" -"aomori.jp\0hiroshima.jp\0" -"monzaedellabrianza.it\0" -"mil.jo\0" -"ci.it\0trento.it\0coop.tt\0" -"cc.al.us\0academy\0" -"seika.kyoto.jp\0hyuga.miyazaki.jp\0" -"design.museum\0cc.ms.us\0cc.nc.us\0is-certified.com\0" -"\xe5\xa8\xb1\xe4\xb9\x90\0" -"mil.kg\0za.org\0" -"norfolk.museum\0" +"gildeskal.no\0" +"promo\0" +"l\xc3\xa4ns.museum\0k12.ne.us\0" +"homeunix.com\0" +"mil.in\0tara.saga.jp\0" +"gov.za\0" +"mil.iq\0war.museum\0" +"dynalias.com\0" +"yanagawa.fukuoka.jp\0skoczow.pl\0misconfused.org\0" +"jolster.no\0" +"ac.gn\0minamimaki.nagano.jp\0iwi.nz\0fh.se\0" +"g12.br\0clock.museum\0" +"is-a-landscaper.com\0" +"gov.zm\0" +"shiojiri.nagano.jp\0hotmail\0" +"mil.jo\0\xe5\xbe\xb3\xe5\xb3\xb6.jp\0lierne.no\0" +"dyndns.info\0" +"arakawa.saitama.jp\0" +"fit\0" +"dubai\0" +"ethnology.museum\0\xe3\x82\xb0\xe3\x83\xbc\xe3\x82\xb0\xe3\x83\xab\0" +"mil.kg\0" +"rocher\0" +"salvadordali.museum\0" +"sapo\0" "mil.km\0" -"naturalhistory.museum\0lib.dc.us\0" -"wales.museum\0" -"mil.kr\0coop.mv\0" -"coop.mw\0" -"nagasaki.nagasaki.jp\0" -"toyokawa.aichi.jp\0imari.saga.jp\0landrover\0" -"fhv.se\0" +"3.bg\0ac.id\0aa.no\0" +"karasuyama.tochigi.jp\0" +"mil.kr\0" +"abiko.chiba.jp\0daiwa.hiroshima.jp\0" +"bas.it\0oryol.ru\0" +"ac.il\0shimokitayama.nara.jp\0" +"ac.im\0" +"ac.in\0" "mil.kz\0" -"roros.no\0java\0" -"toki.gifu.jp\0ina.saitama.jp\0" -"for-more.biz\0" -"vip\0" -"\xe4\xb8\xaa\xe4\xba\xba.hk\0careers\0" -"idrett.no\0kustanai.ru\0" +"ac.ir\0le.it\0" +"school.za\0gripe\0" +"svizzera.museum\0" +"b\xc3\xa6rum.no\0" +"gyeongbuk.kr\0" +"saskatchewan.museum\0per.sg\0mysecuritycamera.net\0" +"la.us\0" "mil.lv\0" -"mil.mg\0" -"chofu.tokyo.jp\0\xd9\x81\xd9\x84\xd8\xb3\xd8\xb7\xd9\x8a\xd9\x86\0" -"writesthisblog.com\0" -"oirase.aomori.jp\0olkusz.pl\0" -"com.ac\0ballooning.aero\0" -"com.af\0\xe7\xbd\x91\xe7\xbb\x9c\0" -"airline.aero\0com.ag\0" -"nakijin.okinawa.jp\0" -"com.ai\0vossevangen.no\0" -"shinichi.hiroshima.jp\0marumori.miyagi.jp\0" -"com.al\0mil.mv\0" +"\xe7\xb6\xb2\xe7\xb5\xa1.cn\0nagato.yamaguchi.jp\0mil.mg\0" +"takehara.hiroshima.jp\0sarl\0" +"ac.jp\0" +"gjovik.no\0" +"historyofscience.museum\0" +"chiryu.aichi.jp\0broadway\0" +"not.br\0" +"mil.mv\0" "mil.ng\0" -"com.an\0" -"\xe6\x94\xbf\xe5\xba\x9c.hk\0mil.my\0paris\0tips\0" -"trentinos-tirol.it\0kashima.ibaraki.jp\0" -"com.ba\0v.bg\0degree\0" -"com.ar\0com.bb\0caserta.it\0tranibarlettaandria.it\0" -"lebtimnetz.de\0" -"joboji.iwate.jp\0takatsuki.osaka.jp\0gniezno.pl\0travel.tt\0" -"com.au\0mil.no\0" -"in-the-band.net\0" -"com.aw\0" -"com.bh\0" -"com.bi\0" -"com.az\0mito.ibaraki.jp\0" -"coop.py\0" -"kashima.kumamoto.jp\0pomorskie.pl\0" -"com.bm\0" -"shiki.saitama.jp\0sandvikcoromant\0" -"com.bo\0cc.as.us\0" -"minato.tokyo.jp\0mil.nz\0" -"labour.museum\0coffee\0" -"com.br\0pg.it\0shintomi.miyazaki.jp\0" -"com.bs\0cc.nj.us\0" -"com.bt\0bytom.pl\0" -"ichiba.tokushima.jp\0" -"qc.com\0" -"kakamigahara.gifu.jp\0" -"com.by\0com.ci\0" -"com.bz\0ichihara.chiba.jp\0" +"nis.za\0fly\0" +"yaotsu.gifu.jp\0osaki.miyagi.jp\0mil.my\0mil.ni\0" +"kagami.kochi.jp\0mil.mz\0" +"davvenj\xc3\xa1rga.no\0no-ip.biz\0" +"ac.kr\0" +"hazu.aichi.jp\0" +"mil.no\0kobierzyce.pl\0boutique\0" +"\xe4\xb8\x80\xe5\x8f\xb7\xe5\xba\x97\0" +"ac.lk\0lanbib.se\0" +"\xe5\xb2\x90\xe9\x98\x9c.jp\0" +"k12.mo.us\0" +"isa-geek.org\0" +"operaunite.com\0" +"seiro.niigata.jp\0mil.nz\0" +"ofunato.iwate.jp\0ac.ma\0" +"nara.jp\0" +"modalen.no\0" +"ac.me\0" +"epost\0" +"alta.no\0" "mil.pe\0" -"uji.kyoto.jp\0" -"com.cm\0nesna.no\0" -"com.cn\0mil.ph\0" -"com.co\0\xc4\x8d\xc3\xa1hcesuolo.no\0k12.id.us\0\xe8\x87\xba\xe7\x81\xa3\0melbourne\0" -"kahoku.yamagata.jp\0" +"freemasonry.museum\0" +"mil.ph\0" +"\xd8\xa7\xd9\x84\xd9\x85\xd8\xba\xd8\xb1\xd8\xa8\0dyndns-at-work.com\0" +"shimoji.okinawa.jp\0" "mil.pl\0" -"selje.no\0" -"tatebayashi.gunma.jp\0shinjo.okayama.jp\0\xe9\x9b\x86\xe5\x9b\xa2\0" -"com.cu\0com.de\0" -"higashikurume.tokyo.jp\0" -"com.cw\0mil.qa\0club.tw\0" -"v\xc3\xa5ler.hedmark.no\0" -"town.museum\0" -"nagasu.kumamoto.jp\0\xd8\xa7\xd9\x85\xd8\xa7\xd8\xb1\xd8\xa7\xd8\xaa\0" -"com.dm\0" -"ninomiya.kanagawa.jp\0so.gov.pl\0\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\x82\xe0\xa6\xb2\xe0\xa6\xbe\0" -"com.do\0coop.km\0mil.py\0" -"elasticbeanstalk.com\0" -"nachikatsuura.wakayama.jp\0" -"com.ec\0" -"cim.br\0ogata.akita.jp\0" -"com.ee\0" -"komoro.nagano.jp\0" -"com.eg\0a.se\0" -"priv.pl\0" -"com.dz\0yuki.ibaraki.jp\0utazu.kagawa.jp\0geisei.kochi.jp\0" -"city.hu\0dovre.no\0energy\0" -"ny.us\0" -"com.es\0" -"com.et\0tsurugi.ishikawa.jp\0nakagusuku.okinawa.jp\0" -"bajddar.no\0shouji\0" -"blogspot.co.uk\0" -"meeres.museum\0mil.ru\0" -"chita.aichi.jp\0" -"mil.rw\0naturbruksgymn.se\0" -"mil.sh\0" -"seto.aichi.jp\0vision\0" -"agents.aero\0" -"com.fr\0verbania.it\0" -"com.ge\0" -"shiriuchi.hokkaido.jp\0" -"cc.az.us\0" -"com.gh\0creditcard\0" -"com.gi\0" -"pn.it\0mil.st\0" -"maritime.museum\0priv.no\0" -"jus.br\0genova.it\0" -"haugesund.no\0" -"com.gn\0pesaro-urbino.it\0" -"rubtsovsk.ru\0mil.sy\0" -"com.gp\0kyowa.hokkaido.jp\0mil.tj\0" -"com.gr\0" +"barlettatraniandria.it\0" +"foo\0" +"ac.mu\0stargard.pl\0" +"schokoladen.museum\0ac.mw\0mil.qa\0" +"verdal.no\0save\0" +"\xe7\x86\x8a\xe6\x9c\xac.jp\0ac.ni\0" +"ac.mz\0naturbruksgymn.se\0" +"b\xc3\xa5tsfjord.no\0\xe0\xa4\x95\xe0\xa5\x89\xe0\xa4\xae\0" +"fox\0" +"tysv\xc3\xa6r.no\0" +"5.bg\0mil.py\0" +"eidsberg.no\0" +"barcelona.museum\0" +"ks.ua\0" +"dni.us\0" +"\xe7\xb6\xb2\xe7\xb5\xa1.hk\0ac.nz\0embaixada.st\0gov.nc.tr\0" +"mutsu.aomori.jp\0figueres.museum\0" +"tsukumi.oita.jp\0diskstation.me\0" +"ujiie.tochigi.jp\0" +"halsa.no\0" +"flakstad.no\0ac.pa\0gal\0" +"realtor\0dyndns-remote.com\0" +"gap\0" +"inawashiro.fukushima.jp\0ks.us\0" +"\xe0\xa8\xad\xe0\xa8\xbe\xe0\xa8\xb0\xe0\xa8\xa4\0" +"tsunan.niigata.jp\0" +"lg.jp\0" +"mil.ru\0" +"tvedestrand.no\0" +"mil.rw\0" +"asso.fr\0mil.sh\0" +"village.museum\0" +"minakami.gunma.jp\0" +"frl\0" +"ac.pr\0saxo\0" +"hidaka.wakayama.jp\0" +"kamiizumi.saitama.jp\0" +"jar.ru\0" +"gouv.fr\0" +"kahoku.ishikawa.jp\0habikino.osaka.jp\0" +"mil.st\0" +"etne.no\0verm\xc3\xb6gensberater\0" +"asso.gp\0kani.gifu.jp\0prod\0" +"uk.com\0" +"allstate\0international\0prof\0" +"mil.sy\0" +"mil.tj\0wang\0\xe6\x97\xb6\xe5\xb0\x9a\0" "mil.tm\0" -"com.gt\0ishikawa.jp\0android\0" -"kazan.ru\0mil.to\0" -"k12.ia.us\0" -"izumi.kagoshima.jp\0mil.tr\0" -"com.gy\0is-a-libertarian.com\0" -"noshiro.akita.jp\0" -"com.hk\0" -"mil.tw\0" -"com.hn\0est.pr\0management\0se.net\0" -"mil.tz\0" -"com.hr\0" -"grane.no\0" -"experts-comptables.fr\0com.ht\0" -"bauern.museum\0nkz.ru\0" -"webcam\0" -"iwanai.hokkaido.jp\0okinoshima.shimane.jp\0" -"mil.vc\0" -"hamura.tokyo.jp\0" -"sorreisa.no\0mil.ve\0" -"com.im\0brussels.museum\0juif.museum\0cc.ia.us\0sa-east-1.compute.amazonaws.com\0" -"com.io\0h.se\0mil.uy\0" -"com.iq\0priv.me\0cc.tx.us\0from-ca.com\0" -"hitoyoshi.kumamoto.jp\0" -"com.is\0" -"salvadordali.museum\0" -"ishikawa.okinawa.jp\0" -"\xe7\xb6\xb2\xe7\xbb\x9c.hk\0algard.no\0ris\xc3\xb8r.no\0" +"milan.it\0xihuan\0is-a-libertarian.com\0" +"mil.to\0\xe6\x9c\xba\xe6\x9e\x84\0" +"milano.it\0" +"imamat\0" +"mil.tr\0" +"nakama.fukuoka.jp\0malopolska.pl\0" +"noboribetsu.hokkaido.jp\0cultural.museum\0mil.tw\0from-md.com\0" +"nishinoshima.shimane.jp\0" +"kazuno.akita.jp\0celtic.museum\0" +"asso.ht\0mil.tz\0" +"yokaichiba.chiba.jp\0" +"shizukuishi.iwate.jp\0ac.rs\0gdn\0" +"natura\0" +"durham.museum\0ac.ru\0ac.se\0" +"gea\0" +"ac.rw\0ftr\0" +"gouv.ht\0" +"tokai.ibaraki.jp\0mil.vc\0apartments\0" +"kouhoku.saga.jp\0mil.ve\0" +"gen.in\0" +"mil.uy\0" +"piemonte.it\0krokstadelva.no\0enterprises\0" +"reggioemilia.it\0duck\0" +"sayama.osaka.jp\0fun\0" +"hyuga.miyazaki.jp\0" +"localhistory.museum\0lib.wa.us\0" +"asso.bj\0koto.shiga.jp\0doesntexist.org\0" +"lib.ks.us\0pimienta.org\0" +"ac.th\0" +"barefoot\0pgfog.com\0" +"7.bg\0gj\xc3\xb8vik.no\0ac.sz\0ac.tj\0" +"stavropol.ru\0" +"suifu.ibaraki.jp\0" +"gouv.bj\0illustration.museum\0" +"sn\xc3\xa5sa.no\0" +"asso.ci\0hatogaya.saitama.jp\0maryland.museum\0dnshome.de\0" +"dev-myqnapcloud.com\0" +"ac.ug\0neat-url.com\0" +"li.it\0" +"virginia.museum\0kosher\0" +"ag.it\0ac.tz\0" +"ac.uk\0watches\0" +"\xd0\xba\xd0\xbe\xd0\xbc\0" +"gouv.ci\0" +"hasura-app.io\0" +"galsa.no\0kddi\0teaches-yoga.com\0" +"freeboxos.com\0" +"fl.us\0rackmaze.com\0" +"jur.pro\0" +"tozsde.hu\0sp.leg.br\0" +"collection.museum\0" +"\xe0\xa4\xb8\xe0\xa4\x82\xe0\xa4\x97\xe0\xa4\xa0\xe0\xa4\xa8\0" +"ac.vn\0" +"!city.sendai.jp\0convent.museum\0suzuki\0" +"kamo.kyoto.jp\0" +"morioka.iwate.jp\0" +"asso.dz\0" +"mil.za\0" +"kawaue.gifu.jp\0" +"email\0fitness\0" +"film.hu\0" +"chirurgiens-dentistes.fr\0fidelity\0" +"monster\0" +"skien.no\0" +"fyi\0" +"aero\0nrw.museum\0wolomin.pl\0" +"project.museum\0" +"eng.pro\0" +"k12.ok.us\0\xd8\xb9\xd9\x85\xd8\xa7\xd9\x86\0mil.zm\0" +"k12.id.us\0" "k12.ca.us\0" -"homeip.net\0" -"k12.or.us\0\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xdb\x8c\xdb\x83\0docs\0frogans\0" -"com.jo\0groks-the.info\0" -"askvoll.no\0aver\xc3\xb8y.no\0" -"ogose.saitama.jp\0gliwice.pl\0" -"sakhalin.ru\0\xe0\xb0\xad\xe0\xb0\xbe\xe0\xb0\xb0\xe0\xb0\xa4\xe0\xb1\x8d\0" -"otsuchi.iwate.jp\0" -"com.kg\0" -"keisen.fukuoka.jp\0" -"com.ki\0" -"yonaguni.okinawa.jp\0" -"from-ma.com\0" -"wed\0" -"com.km\0" -"kv\xc3\xa6""fjord.no\0cherkassy.ua\0cc.ca.us\0" -"chikuzen.fukuoka.jp\0com.kp\0" -"com.la\0nyc.museum\0" -"pu.it\0hirata.fukushima.jp\0suzaka.nagano.jp\0com.lb\0" -"com.lc\0cc.oh.us\0" -"dnsalias.net\0" -"zhitomir.ua\0" -"midori.gunma.jp\0kawai.nara.jp\0" -"com.ky\0masfjorden.no\0" -"wazuka.kyoto.jp\0gotemba.shizuoka.jp\0com.kz\0" -"com.lk\0" -"fujieda.shizuoka.jp\0opole.pl\0" -"lib.fl.us\0homelinux.com\0" -"sar.it\0bydgoszcz.pl\0" -"bristol.museum\0parts\0photos\0" -"ogawa.saitama.jp\0" -"com.lr\0" -"shibetsu.hokkaido.jp\0" -"party\0" -"liguria.it\0com.lv\0" -"com.mg\0m\xc3\xa5lselv.no\0herokussl.com\0" -"adv.br\0oga.akita.jp\0" -"com.ly\0" -"com.mk\0north.museum\0" -"com.ml\0agrinet.tn\0prod\0" -"gs.vf.no\0" -"prof\0" -"com.mo\0yolasite.com\0" -"com.na\0" -"com.ms\0" -"com.mt\0" -"com.mu\0ar.com\0" -"com.mv\0com.nf\0" -"com.mw\0com.ng\0o.se\0" -"com.mx\0swidnica.pl\0" -"com.my\0" -"yamada.iwate.jp\0" -"landes.museum\0stathelle.no\0doha\0" -"togitsu.nagasaki.jp\0" -"trani-andria-barletta.it\0sr.gov.pl\0" -"asakawa.fukushima.jp\0joyo.kyoto.jp\0" -"laz.it\0com.nr\0" -"usculture.museum\0" -"yamaguchi.jp\0" -"tottori.jp\0ota.gunma.jp\0" -"midsund.no\0" -"sannohe.aomori.jp\0" -"lancashire.museum\0com.om\0" -"olsztyn.pl\0" -"com.pa\0\xd9\x87\xd9\x85\xd8\xb1\xd8\xa7\xd9\x87\0" -"eisenbahn.museum\0paroch.k12.ma.us\0s3-us-gov-west-1.amazonaws.com\0no.com\0from-vt.com\0" -"dgca.aero\0com.pe\0vn.ua\0" -"com.pf\0win\0blogspot.co.nz\0" -"bykle.no\0" -"oshima.yamaguchi.jp\0com.ph\0" -"honjo.saitama.jp\0nishikawa.yamagata.jp\0" -"lakas.hu\0com.pk\0" -"*.nagoya.jp\0fuji.shizuoka.jp\0com.pl\0" -"com.qa\0" -"xj.cn\0tomari.hokkaido.jp\0com.pr\0" -"j\xc3\xb8lster.no\0com.ps\0" -"sumoto.hyogo.jp\0com.pt\0" -"kuriyama.hokkaido.jp\0nasushiobara.tochigi.jp\0" -"barcelona.museum\0aurskog-h\xc3\xb8land.no\0" -"com.py\0marketing\0s3-website-sa-east-1.amazonaws.com\0" -"kayabe.hokkaido.jp\0" -"minamata.kumamoto.jp\0shima.mie.jp\0" -"mulhouse.museum\0gs.svalbard.no\0" -"red.sv\0" -"ngo.lk\0com.re\0" -"hachirogata.akita.jp\0kanoya.kagoshima.jp\0" -"massacarrara.it\0anjo.aichi.jp\0chijiwa.nagasaki.jp\0" -"from-hi.com\0" -"is-into-games.com\0" -"\xe6\x96\xb0\xe5\x8a\xa0\xe5\x9d\xa1\0" -"ina.ibaraki.jp\0" -"com.ro\0" -"com.sa\0" -"com.sb\0mobi.tt\0" -"com.sc\0neat-url.com\0" -"com.sd\0" -"drobak.no\0lillehammer.no\0com.ru\0com.se\0" -"kiho.mie.jp\0" -"com.rw\0com.sg\0" -"com.sh\0mobi.tz\0xbox\0" -"k12.co.us\0" -"lease\0" -"com.sl\0" -"wme\0" -"com.sn\0" -"l\xc3\xb8renskog.no\0com.so\0" -"com.st\0" -"cosenza.it\0com.sv\0" -"masoy.no\0" -"sasaguri.fukuoka.jp\0" -"com.sy\0" -"assabu.hokkaido.jp\0kanmaki.nara.jp\0com.tj\0" -"zaporizhzhe.ua\0" -"tamakawa.fukushima.jp\0faith\0" -"com.tm\0" -"ug.gov.pl\0com.tn\0" -"com.to\0cc.co.us\0" -"voronezh.ru\0com.ua\0" -"rc.it\0com.tr\0" -"hokksund.no\0\xc3\xa1k\xc5\x8boluokta.no\0" -"com.tt\0" -"mel\xc3\xb8y.no\0" -"\xe6\x84\x9b\xe5\xaa\x9b.jp\0shichinohe.aomori.jp\0" -"com.tw\0com.ug\0" -"kisofukushima.nagano.jp\0" -"kepno.pl\0" -"artgallery.museum\0zgrad.ru\0" -"nome.pt\0" -"inc.hk\0" -"control.aero\0" -"gamagori.aichi.jp\0ngo.ph\0" -"sa.au\0""2.bg\0com.vc\0" -"biratori.hokkaido.jp\0matsushige.tokushima.jp\0" -"topology.museum\0com.ve\0" -"ichinomiya.aichi.jp\0" -"semine.miyagi.jp\0saarland\0" -"com.uy\0com.vi\0" -"valle-aosta.it\0nakayama.yamagata.jp\0com.uz\0" -"dn.ua\0" -"ws.na\0" -"com.vn\0" -"act.edu.au\0durham.museum\0" -"reggio-emilia.it\0bizen.okayama.jp\0yamada.toyama.jp\0" -"mansions.museum\0podzone.org\0" -"tomobe.ibaraki.jp\0minamiyamashiro.kyoto.jp\0matsubushi.saitama.jp\0" -"glas.museum\0" -"lc.it\0rikubetsu.hokkaido.jp\0engineer\0" -"com.vu\0" -"nishitosa.kochi.jp\0" -"yaroslavl.ru\0" -"fj.cn\0" -"makinohara.shizuoka.jp\0" -"saka.hiroshima.jp\0" -"mobi.na\0vagsoy.no\0sevastopol.ua\0" -"sa.cr\0" -"lib.mi.us\0com.ws\0" -"naoshima.kagawa.jp\0" -"mobi.ng\0hobby-site.org\0" -"tokai.ibaraki.jp\0" -"catania.it\0shinagawa.tokyo.jp\0" -"sannan.hyogo.jp\0" -"rotorcraft.aero\0amot.no\0" -"sanofi\0" -"tas.gov.au\0" -"fc.it\0kochi.kochi.jp\0" -"kemerovo.ru\0" -"leangaviika.no\0" -"gyeongnam.kr\0consulado.st\0" -"leirfjord.no\0" -"hayashima.okayama.jp\0koka.shiga.jp\0" -"autos\0is-by.us\0" -"smile\0" -"conf.au\0" -"9.bg\0wtc\0" -"wtf\0" -"nsw.edu.au\0aurland.no\0chrome\0" -"otaki.saitama.jp\0" -"yosemite.museum\0parti.se\0" -"kawanishi.nara.jp\0" -"baltimore.museum\0yoga\0" -"es.kr\0" -"heroy.more-og-romsdal.no\0" -"omotego.fukushima.jp\0" -"british.museum\0" -"ishinomaki.miyagi.jp\0" -"game.tw\0cc.vt.us\0" -"umi.fukuoka.jp\0ikusaka.nagano.jp\0" -"sh.cn\0" -"judaica.museum\0gjemnes.no\0itau\0" -"slupsk.pl\0" -"musashino.tokyo.jp\0" -"k\xc3\xa1r\xc3\xa1\xc5\xa1johka.no\0" -"malatvuopmi.no\0from-pa.com\0" -"tomakomai.hokkaido.jp\0" -"\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86\0" -"unbi.ba\0nid.io\0" -"szex.hu\0" -"wassamu.hokkaido.jp\0naka.ibaraki.jp\0" -"kawasaki.miyagi.jp\0" -"daiwa.hiroshima.jp\0" -"is-very-sweet.org\0" -"naganohara.gunma.jp\0" -"solund.no\0" -"gose.nara.jp\0" -"juegos\0" -"sa.it\0" -"emergency.aero\0hawaii.museum\0" -"\xd0\xbc\xd0\xbe\xd1\x81\xd0\xba\xd0\xb2\xd0\xb0\0" -"medio-campidano.it\0hiroo.hokkaido.jp\0" -"svizzera.museum\0doomdns.org\0" -"hioki.kagoshima.jp\0" -"edu.ac\0" -"yokosuka.kanagawa.jp\0" -"ipiranga\0" -"edu.af\0tono.iwate.jp\0takagi.nagano.jp\0" -"edu.al\0nuoro.it\0\xe5\xb3\xb6\xe6\xa0\xb9.jp\0inagi.tokyo.jp\0" -"sogndal.no\0room\0endofinternet.org\0" -"edu.an\0\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86.ir\0yuasa.wakayama.jp\0" -"berlev\xc3\xa5g.no\0" -"edu.ba\0" -"edu.ar\0edu.bb\0taketomi.okinawa.jp\0" -"crimea.ua\0" -"edu.au\0" -"video\0" -"edu.bh\0" -"edu.bi\0" -"edu.az\0" -"anthropology.museum\0is-a-anarchist.com\0" -"kartuzy.pl\0xin\0" -"edu.bm\0" -"watari.miyagi.jp\0" -"edu.bo\0flatanger.no\0roan.no\0" -"edu.br\0" -"edu.bs\0homedns.org\0" -"edu.bt\0" -"imabari.ehime.jp\0" -"edu.ci\0\xd1\x80\xd1\x83\xd1\x81\0" -"edu.bz\0kumiyama.kyoto.jp\0" +"saotome.st\0" +"honjo.saitama.jp\0" +"h\xc3\xb8nefoss.no\0" +"b\xc3\xb8mlo.no\0" +"living.museum\0" +"dnsiskinky.com\0" +"lig.it\0" +"auto.pl\0" +"niikappu.hokkaido.jp\0" +"seaport.museum\0" +"vibo-valentia.it\0" +"mari.ru\0homeftp.org\0" +"costume.museum\0sydney\0" +"gen.nz\0" +"aioi.hyogo.jp\0" +"oguchi.aichi.jp\0alaska.museum\0pinb.gov.pl\0" +"nnov.ru\0" +"ac.za\0" +"lib.la.us\0" +"isa-geek.com\0" +"9.bg\0hokkaido.jp\0kitadaito.okinawa.jp\0technology.museum\0fuettertdasnetz.de\0" +"gangaviika.no\0" +"gd.cn\0samukawa.kanagawa.jp\0bahcavuotna.no\0" +"miasta.pl\0lg.ua\0gle\0shopping\0de.com\0" +"money.museum\0jpmorgan\0" +"ac.zm\0" +"kumiyama.kyoto.jp\0izumo.shimane.jp\0agency\0" +"linde\0" +"kamikawa.saitama.jp\0" +"asuke.aichi.jp\0gs.tm.no\0" +"gs.nt.no\0juegos\0" +"ltda\0" +"fr.it\0fishing\0" "is-a-financialadvisor.com\0" -"izhevsk.ru\0" -"edu.cn\0" -"edu.co\0sandnessj\xc3\xb8""en.no\0" -"sardegna.it\0" -"awaji.hyogo.jp\0" -"soni.nara.jp\0" -"edu.cu\0" -"edu.cw\0clinton.museum\0\xc3\xa5mli.no\0ks.ua\0" -"\xe7\xbb\x84\xe7\xbb\x87\xe6\x9c\xba\xe6\x9e\x84\0" -"gol.no\0" -"pisz.pl\0" -"monmouth.museum\0" -"edu.dm\0z-1.compute-1.amazonaws.com\0" -"edu.do\0" -"ah.cn\0" -"edu.ec\0" -"mo.cn\0izumiotsu.osaka.jp\0" -"edu.ee\0" -"dental\0" -"edu.eg\0cartoonart.museum\0" -"trentinoalto-adige.it\0" -"ks.us\0" -"edu.dz\0homelinux.net\0" -"epilepsy.museum\0" -"nakanoto.ishikawa.jp\0shiraoka.saitama.jp\0" -"stateofdelaware.museum\0k12.ks.us\0" -"izumozaki.niigata.jp\0" -"kamisu.ibaraki.jp\0" -"edu.es\0discovery.museum\0" -"edu.et\0airtel\0" -"palermo.it\0" -"yura.wakayama.jp\0" -"\xd0\xb4\xd0\xb5\xd1\x82\xd0\xb8\0" -"go.ci\0romsa.no\0" -"omigawa.chiba.jp\0niihama.ehime.jp\0" -"villas\0" -"edu.ge\0" -"pug.it\0matsuura.nagasaki.jp\0" -"comunica\xc3\xa7\xc3\xb5""es.museum\0dyndns-ip.com\0" -"edu.gh\0" -"edu.gi\0br\xc3\xb8nn\xc3\xb8y.no\0rahkkeravju.no\0sn\xc3\xa5sa.no\0" -"go.cr\0ulsan.kr\0" -"agency\0" -"edu.gn\0" -"stavanger.no\0" -"edu.gp\0" -"edu.gr\0" -"artcenter.museum\0" -"edu.gt\0" -"fitjar.no\0" -"aosta.it\0" -"yoshino.nara.jp\0publ.pt\0" -"edu.hk\0" -"edu.hn\0higashiizu.shizuoka.jp\0" -"nf.ca\0investments\0" -"trentinosued-tirol.it\0imakane.hokkaido.jp\0" -"naie.hokkaido.jp\0" -"illustration.museum\0" -"edu.ht\0fujiyoshida.yamanashi.jp\0" -"chiyoda.gunma.jp\0" -"science-fiction.museum\0" -"so.it\0" -"kamikoani.akita.jp\0" -"edu.in\0" -"gv.ao\0" -"kyotanabe.kyoto.jp\0nabari.mie.jp\0" -"edu.iq\0" -"edu.is\0" -"gv.at\0edu.it\0" -"stuff-4-sale.us\0" -"yamagata.yamagata.jp\0" -"pasadena.museum\0" -"kawai.iwate.jp\0ryuoh.shiga.jp\0" -"saltdal.no\0stokke.no\0" -"tychy.pl\0makeup\0" -"surnadal.no\0gos.pk\0" -"edu.jo\0" -"fermo.it\0fujimi.saitama.jp\0" -"wakkanai.hokkaido.jp\0" -"nara.nara.jp\0" -"edu.kg\0\xe0\xa4\xa8\xe0\xa5\x87\xe0\xa4\x9f\0" -"edu.ki\0aa.no\0" -"mo.it\0" -"kvinnherad.no\0" -"oamishirasato.chiba.jp\0sumita.iwate.jp\0" -"edu.km\0from-nm.com\0" -"edu.kn\0" -"cc.wy.us\0" -"fukui.fukui.jp\0koryo.nara.jp\0edu.kp\0" -"edu.la\0" -"edu.lb\0" -"edu.lc\0" -"kounosu.saitama.jp\0fuchu.toyama.jp\0" -"dominic.ua\0lib.ar.us\0" -"\xe7\xae\x87\xe4\xba\xba.hk\0edu.ky\0" -"edu.kz\0" -"edu.lk\0" -"go.id\0mantova.it\0funahashi.toyama.jp\0" -"chippubetsu.hokkaido.jp\0" -"hamburg.museum\0\xc3\xa5snes.no\0" -"tsuga.tochigi.jp\0" -"sciences.museum\0" -"edu.lr\0" -"luster.no\0vinnica.ua\0" -"edu.me\0" -"edu.lv\0" -"edu.mg\0" -"edu.ly\0cultural.museum\0ftpaccess.cc\0" -"kagamino.okayama.jp\0" -"edu.mk\0rygge.no\0" -"go.it\0hirono.fukushima.jp\0daito.osaka.jp\0edu.ml\0" -"salangen.no\0tromsa.no\0reviews\0" -"edu.mn\0" -"edu.mo\0" -"sv.it\0" -"cymru.museum\0e-burg.ru\0cc.ri.us\0" -"tsumagoi.gunma.jp\0gorlice.pl\0" -"edu.ms\0" -"nm.cn\0\xe5\x8d\x83\xe8\x91\x89.jp\0nonoichi.ishikawa.jp\0edu.mt\0" -"ayagawa.kagawa.jp\0edu.mv\0" -"edu.mw\0edu.ng\0b\xc3\xa5""d\xc3\xa5""ddj\xc3\xa5.no\0poltava.ua\0" -"go.jp\0edu.mx\0" -"edu.my\0ma.us\0k12.al.us\0" -"kyotamba.kyoto.jp\0" -"k12.mi.us\0" -"onna.okinawa.jp\0" -"stryn.no\0" -"pescara.it\0edu.nr\0" -"county.museum\0" -"\xe5\x95\x86\xe6\xa0\x87\0" -"tm.fr\0komae.tokyo.jp\0" -"msk.ru\0" -"bialowieza.pl\0" -"haram.no\0\xd1\x81\xd1\x80\xd0\xb1\0sells-for-u.com\0" -"go.kr\0" -"trapani.it\0takahama.fukui.jp\0nayoro.hokkaido.jp\0ibaraki.ibaraki.jp\0" -"forde.no\0edu.om\0" -"ao.it\0" -"ah.no\0edu.pa\0" -"trentino-suedtirol.it\0" -"mesaverde.museum\0cc.ky.us\0" -"taishin.fukushima.jp\0erimo.hokkaido.jp\0" -"edu.pe\0" -"como.it\0edu.pf\0" -"edu.ph\0" -"yamada.fukuoka.jp\0" -"edu.pk\0ga.us\0" -"edu.pl\0" -"edu.pn\0" -"production.aero\0sk\xc3\xa1nit.no\0" -"lucania.it\0" -"sandnes.no\0edu.qa\0" -"edu.pr\0garden\0" -"nt.au\0edu.ps\0" -"mar.it\0edu.pt\0" -"fukagawa.hokkaido.jp\0toyosato.shiga.jp\0" -"tm.hu\0edu.py\0" -"friulivenezia-giulia.it\0hiphop\0" -"coastaldefence.museum\0" -"chiyoda.tokyo.jp\0mragowo.pl\0" -"nt.ca\0" -"valle-daosta.it\0" -"hinode.tokyo.jp\0" -"lacaixa\0" -"watches\0" -"xxx\0" -"field.museum\0missoula.museum\0d\xc3\xb8nna.no\0science\0hu.com\0" -"tadaoka.osaka.jp\0" -"hayakawa.yamanashi.jp\0" -"dnsalias.org\0" -"edu.sa\0" -"edu.sb\0" -"edu.rs\0edu.sc\0lib.id.us\0" -"ogori.fukuoka.jp\0notogawa.shiga.jp\0edu.sd\0" -"repbody.aero\0id.au\0edu.ru\0k12.nj.us\0" -"loyalist.museum\0edu.rw\0edu.sg\0" -"xyz\0" -"moka.tochigi.jp\0dynathome.net\0" -"kimino.wakayama.jp\0edu.sl\0nissan\0" -"veterinaire.km\0" -"kokubunji.tokyo.jp\0edu.sn\0" -"os.hordaland.no\0" -"tm.km\0artsandcrafts.museum\0is-a-musician.com\0" -"*.kitakyushu.jp\0iitate.fukushima.jp\0" -"edu.st\0" -"av.it\0urayasu.chiba.jp\0edu.sv\0" -"florida.museum\0ninja\0" -"edu.sy\0" -"nemuro.hokkaido.jp\0edu.tj\0" -"s\xc3\xb8rum.no\0" -"yawatahama.ehime.jp\0oyamazaki.kyoto.jp\0moroyama.saitama.jp\0" -"edu.tm\0" -"shinyoshitomi.fukuoka.jp\0\xd1\x80\xd1\x84\0" -"fuel.aero\0hellas.museum\0go.pw\0edu.to\0" -"edu.ua\0" -"edu.tr\0" -"zlg.br\0edu.tt\0" -"tm.mc\0edu.tw\0fitness\0s3-us-west-2.amazonaws.com\0" -"iwaizumi.iwate.jp\0kitakata.miyazaki.jp\0" -"hembygdsforbund.museum\0" -"kumano.hiroshima.jp\0" -"tm.mg\0sec.ps\0" -"cremona.it\0" -"railway.museum\0" -"r\xc3\xa5""de.no\0is-a-lawyer.com\0" -"nishiizu.shizuoka.jp\0wajiki.tokushima.jp\0" -"edu.vc\0" -"shimonoseki.yamaguchi.jp\0" -"edu.ve\0" -"tt.im\0edu.uy\0bingo\0" -"ibestad.no\0" -"komatsu.ishikawa.jp\0meiwa.mie.jp\0\xd8\xa7\xd9\x84\xd9\x8a\xd9\x85\xd9\x86\0" -"cadaques.museum\0" -"edu.vn\0" -"cyber.museum\0" -"ud.it\0aki.kochi.jp\0" -"veterinaire.fr\0" -"tm.no\0royrvik.no\0boats\0youtube\0" -"toshima.tokyo.jp\0" -"edu.vu\0" -"hazu.aichi.jp\0yoka.hyogo.jp\0" -"mo.us\0k12.az.us\0boldlygoingnowhere.org\0" -"shimamaki.hokkaido.jp\0" -"mizuho.tokyo.jp\0conf.lv\0go.th\0" -"c.bg\0" -"go.tj\0" -"indiana.museum\0edu.ws\0" -"kamifurano.hokkaido.jp\0ryugasaki.ibaraki.jp\0" -"giske.no\0safe\0" -"miyagi.jp\0" -"matta-varjjat.no\0" -"caa.aero\0firmdale\0" -"ojiya.niigata.jp\0" -"go.ug\0" -"tm.pl\0" -"go.tz\0" -"sakegawa.yamagata.jp\0" -"alvdal.no\0" -"os.hedmark.no\0" -"hizen.saga.jp\0" -"pb.ao\0chicago.museum\0fuossko.no\0" -"srv.br\0azurewebsites.net\0" -"or.at\0" -"br\xc3\xb8nn\xc3\xb8ysund.no\0" -"or.bi\0" -"higashimatsuyama.saitama.jp\0" -"l\xc3\xa1hppi.no\0" -"\xe5\x85\xac\xe5\x8f\xb8.cn\0koga.fukuoka.jp\0cern\0" -"notodden.no\0" -"katano.osaka.jp\0" -"dinosaur.museum\0windmill.museum\0" -"yonezawa.yamagata.jp\0" -"id.ir\0kasahara.gifu.jp\0" -"tm.ro\0" -"sex.hu\0college\0" -"or.ci\0starnberg.museum\0hm.no\0bloomberg\0" -"cal.it\0rns.tn\0" -"\xe5\x85\xac\xe5\x8f\xb8.hk\0tm.se\0" -"web.co\0" -"land\0" -"saga.saga.jp\0" -"or.cr\0" -"navuotna.no\0" -"onojo.fukuoka.jp\0" -"global\0" -"lib.va.us\0" -"j.bg\0" -"web.do\0" -"kagoshima.jp\0misato.akita.jp\0" -"webhop.info\0" -"nagahama.shiga.jp\0" -"bt.it\0taku.saga.jp\0" -"kraanghke.no\0" -"sakurai.nara.jp\0" -"cc.mn.us\0" -"culture.museum\0guernsey.museum\0nt.no\0" -"tachiarai.fukuoka.jp\0" -"plc.co.im\0historisch.museum\0" -"aisho.shiga.jp\0" -"coldwar.museum\0" -"motobu.okinawa.jp\0ibaraki.osaka.jp\0" -"news.hu\0sale\0" -"id.lv\0" -"anthro.museum\0" -"sondrio.it\0" -"id.ly\0lib.pa.us\0" -"finearts.museum\0" -"matsuno.ehime.jp\0yun\0" -"t\xc3\xb8nsberg.no\0" -"sciencecenter.museum\0baidar.no\0muosat.no\0" -"lind\xc3\xa5s.no\0v\xc3\xa1rgg\xc3\xa1t.no\0kiev.ua\0" -"scrapping.cc\0" -"av.tr\0" -"\xe0\xaa\xad\xe0\xaa\xbe\xe0\xaa\xb0\xe0\xaa\xa4\0" -"kitagata.gifu.jp\0ota.tokyo.jp\0" -"j\xc3\xb8rpeland.no\0" -"krakow.pl\0" -"zt.ua\0" -"kirovograd.ua\0" -"vb.it\0\xe0\xae\x87\xe0\xae\xb2\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xaf\x88\0kicks-ass.net\0" -"telefonica\0" -"fundacio.museum\0" -"tomika.gifu.jp\0" -"bodo.no\0" -"cuneo.it\0!city.nagoya.jp\0" -"neues.museum\0bryansk.ru\0nm.us\0" -"mielno.pl\0" -"elburg.museum\0" -"american.museum\0" -"skanit.no\0" -"web.id\0sakawa.kochi.jp\0" -"q.bg\0" -"or.id\0" -"lavagis.no\0tydal.no\0" -"hachijo.tokyo.jp\0" -"gs.nl.no\0vestvagoy.no\0yekaterinburg.ru\0" -"uchihara.ibaraki.jp\0" -"trentino-aadige.it\0pesarourbino.it\0masaki.ehime.jp\0sukagawa.fukushima.jp\0" -"c.la\0" -"nt.ro\0homelinux.org\0" -"pordenone.it\0chuo.fukuoka.jp\0okegawa.saitama.jp\0" -"\xe3\x83\x9d\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x88\0" -"voyage\0\xe5\xa4\xa7\xe6\x8b\xbf\0" -"or.it\0isumi.chiba.jp\0takehara.hiroshima.jp\0" -"cc.ne.us\0" -"soja.okayama.jp\0naruto.tokushima.jp\0" -"\xd0\xbf\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0" -"exchange\0" -"kaho.fukuoka.jp\0tosa.kochi.jp\0" -"asago.hyogo.jp\0kawatana.nagasaki.jp\0sex.pl\0kred\0" -"or.jp\0zip\0" -"sapo\0" -"honjyo.akita.jp\0" -"skaun.no\0knowsitall.info\0" -"stuttgart.museum\0\xc3\xb8rsta.no\0k12.tn.us\0" -"tcm.museum\0" -"kani.gifu.jp\0" -"eu.com\0" -"pp.az\0milan.it\0hikari.yamaguchi.jp\0buzz\0" -"gs.hl.no\0enterprises\0" -"miho.ibaraki.jp\0" -"codespot.com\0" -"milano.it\0" -"perso.ht\0" -"kunstsammlung.museum\0od.ua\0" -"oyama.tochigi.jp\0or.kr\0" -"estate.museum\0" -"cc.gu.us\0" -"web.lk\0" -"balsan.it\0vi.it\0shikaoi.hokkaido.jp\0" -"quebec.museum\0" -"sarl\0" -"moriguchi.osaka.jp\0" -"leikanger.no\0safety\0\xe6\x96\xb0\xe9\x97\xbb\0" -"hangout\0" -"yamashina.kyoto.jp\0yoshida.saitama.jp\0" -"research.aero\0" -"x.bg\0from-ct.com\0" -"kimobetsu.hokkaido.jp\0" -"artdeco.museum\0levanger.no\0" -"b\xc3\xb8mlo.no\0skanland.no\0" -"pro.az\0" -"or.na\0" -"kanie.aichi.jp\0" -"web.nf\0" -"or.mu\0donetsk.ua\0" -"russia.museum\0" -"pro.br\0cr.it\0mizumaki.fukuoka.jp\0" -"*.nom.br\0hara.nagano.jp\0inami.wakayama.jp\0" -"uscountryestate.museum\0" -"pi.it\0ujiie.tochigi.jp\0" -"is-a-guru.com\0" -"creation.museum\0" -"higashishirakawa.gifu.jp\0\xe5\x85\xab\xe5\x8d\xa6\0" -"sciencesnaturelles.museum\0" -"bonn.museum\0sondre-land.no\0s\xc3\xb8r-aurdal.no\0" -"ham-radio-op.net\0" -"id.us\0" -"oki.fukuoka.jp\0" -"b\xc3\xa1hccavuotna.no\0" -"katowice.pl\0" -"\xe5\xa4\xa7\xe5\x88\x86.jp\0takayama.nagano.jp\0nishinoshima.shimane.jp\0nyc.mn\0" -"folkebibl.no\0vladivostok.ru\0" -"halden.no\0" -"ninohe.iwate.jp\0" -"\xe6\x95\x99\xe8\x82\xb2.hk\0" -"ebiz.tw\0" -"gujo.gifu.jp\0rebun.hokkaido.jp\0dentist\0" -"lindesnes.no\0" -"s\xc3\xb8ndre-land.no\0" -"tamamura.gunma.jp\0akashi.hyogo.jp\0toda.saitama.jp\0" -"pro.ec\0web.pk\0blackfriday\0" -"zara\0" -"for-the.biz\0" -"vadso.no\0" -"chocolate.museum\0c.se\0" -"chikuhoku.nagano.jp\0" -"or.pw\0" -"e164.arpa\0tushu\0" -"komono.mie.jp\0" -"ok.us\0is-a-photographer.com\0" -"nuernberg.museum\0is-slick.com\0" -"\xe4\xba\xac\xe9\x83\xbd.jp\0tonosho.kagawa.jp\0" -"k12.ec\0" -"mikasa.hokkaido.jp\0" -"tom.ru\0viva\0" -"a\xc3\xa9roport.ci\0" -"umb.it\0iwafune.tochigi.jp\0mazowsze.pl\0\xd1\x83\xd0\xba\xd1\x80\0" -"bel.tr\0" -"rakkestad.no\0" -"bievat.no\0" -"saxo\0" -"fuefuki.yamanashi.jp\0" -"research.museum\0" -"ragusa.it\0nadex\0" -"jar.ru\0" -"busan.kr\0" +"kitagawa.miyazaki.jp\0plc.ly\0workisboring.com\0" +"*.sendai.jp\0" +"tohnosho.chiba.jp\0" +"wi.us\0" +"blogdns.com\0" +"ozora.hokkaido.jp\0\xe7\x8f\xa0\xe5\xae\x9d\0" +"davvenjarga.no\0" +"shichinohe.aomori.jp\0meiwa.mie.jp\0gmo\0" +"yao.osaka.jp\0kms.ru\0" +"otake.hiroshima.jp\0" +"somna.no\0tours\0publishproxy.com\0" +"chintai\0" +"s3-sa-east-1.amazonaws.com\0" +"toyotsu.fukuoka.jp\0busan.kr\0df.leg.br\0" +"botanical.museum\0gmx\0" +"fbxos.fr\0" +"hekinan.aichi.jp\0" +"philately.museum\0" +"dodge\0" +"otaki.saitama.jp\0" +"kinokawa.wakayama.jp\0" +"trentino-sudtirol.it\0motosu.gifu.jp\0cern\0" +"asahi.yamagata.jp\0from-il.com\0" +"lasalle\0" +"hitachiota.ibaraki.jp\0" +"student.aero\0" +"kakuda.miyagi.jp\0" +"mmafan.biz\0" +"florist\0goo\0" +"gop\0pramerica\0" +"omuta.fukuoka.jp\0got\0" +"gov\0" +"indianapolis.museum\0" +"finland.museum\0likes-pie.com\0" +"gotsu.shimane.jp\0" +"sling\0" +"gen.tr\0" +"r\xc3\xb8""d\xc3\xb8y.no\0" +"hokksund.no\0" +"\xe5\x92\x8c\xe6\xad\x8c\xe5\xb1\xb1.jp\0" +"am.br\0duns\0" +"odesa.ua\0myeffect.net\0" +"sch.ae\0" +"es.eu.org\0" +"realestate.pl\0" +"telecity\0" +"harvestcelebration.museum\0" +"etnedal.no\0krasnodar.su\0" +"hirakata.osaka.jp\0" +"castres.museum\0" +"lucania.it\0tainai.niigata.jp\0" +"gs.of.no\0hemne.no\0skype\0" +"matsuzaki.shizuoka.jp\0\xe0\xaa\xad\xe0\xaa\xbe\xe0\xaa\xb0\xe0\xaa\xa4\0" +"saga.jp\0" +"ieee\0" +"amursk.ru\0" +"hbo\0" +"akita.akita.jp\0netbank\0" +"ky.us\0" +"nov.ru\0" +"omega\0" +"fudai.iwate.jp\0furniture\0" +"sanagochi.tokushima.jp\0turen.tn\0dvag\0" +"asakawa.fukushima.jp\0" +"egyptian.museum\0" +"natuurwetenschappen.museum\0" +"xperia\0est-mon-blogueur.com\0" +"cymru.museum\0" +"moroyama.saitama.jp\0hikari.yamaguchi.jp\0" +"nov.su\0" +"hagebostad.no\0" +"trentino.it\0shirahama.wakayama.jp\0" +"fauske.no\0" +"sopot.pl\0" +"plc.uk\0" +"usa.museum\0" +"chernovtsy.ua\0" +"vefsn.no\0" +"asso.re\0android\0" +"iveco\0" +"latina.it\0kitaaiki.nagano.jp\0" +"tsuno.miyazaki.jp\0fund\0" +"unnan.shimane.jp\0" +"philadelphiaarea.museum\0" +"nomi.ishikawa.jp\0sumita.iwate.jp\0" +"lugansk.ua\0" +"mansion.museum\0" +"media.museum\0" +"chungbuk.kr\0" +"gausdal.no\0slupsk.pl\0" +"troms\xc3\xb8.no\0" +"gent\0hobby-site.com\0" +"vaga.no\0" +"stackspace.space\0" +"fresenius\0" +"ullensvang.no\0gouv.rw\0" +"us.eu.org\0" +"sor-odal.no\0" +"cc.nv.us\0" +"fujikawaguchiko.yamanashi.jp\0gouv.sn\0global.prod.fastly.net\0" +"inashiki.ibaraki.jp\0sebastopol.ua\0cc.ct.us\0" +"togitsu.nagasaki.jp\0omaha.museum\0buzz\0" +"tateshina.nagano.jp\0edu.eu.org\0" +"lo.it\0" +"goodhands\0" +"mysecuritycamera.org\0" +"tysvar.no\0" +"democrat\0" +"adachi.tokyo.jp\0" +"delivery\0" +"\xe8\x8c\xa8\xe5\x9f\x8e.jp\0" +"greta.fr\0szkola.pl\0" +"iitate.fukushima.jp\0hida.gifu.jp\0" +"sch.id\0tonami.toyama.jp\0" +"asso.nc\0odda.no\0" +"dgca.aero\0" +"kommune.no\0" +"build\0scor\0" +"scot\0" +"kimitsu.chiba.jp\0lunner.no\0salat.no\0\xd2\x9b\xd0\xb0\xd0\xb7\0coupons\0" +"sch.ir\0" +"hiv\0" +"gotdns.com\0" +"koza.wakayama.jp\0" +"ro.com\0" +"otsuchi.iwate.jp\0k12.ny.us\0" +"edogawa.tokyo.jp\0" +"sch.jo\0algard.no\0" +"hasama.oita.jp\0" +"hara.nagano.jp\0" +"kitakata.miyazaki.jp\0elblag.pl\0" +"horology.museum\0" +"arboretum.museum\0sciencehistory.museum\0" +"commbank\0" +"kounosu.saitama.jp\0" +"arq.br\0" +"ikeda.osaka.jp\0" +"conference.aero\0" +"shinonsen.hyogo.jp\0hkt\0" +"tynset.no\0" +"okawa.kochi.jp\0" +"meland.no\0" +"\xc3\xa5seral.no\0" +"kl\xc3\xa6""bu.no\0" +"lib.wy.us\0" +"canada.museum\0" +"sch.lk\0" +"protonet.io\0" +"haga.tochigi.jp\0allfinanz\0" +"shiroishi.miyagi.jp\0jetzt\0" +"miyazu.kyoto.jp\0" +"tagawa.fukuoka.jp\0zoology.museum\0" +"prd.fr\0mishima.fukushima.jp\0" +"choyo.kumamoto.jp\0cc.oh.us\0" +"kharkiv.ua\0" +"yatsushiro.kumamoto.jp\0" +"sch.ly\0fi.eu.org\0" +"business\0" +"estate\0" +"ao.it\0bari.it\0antiques.museum\0" +"property\0" +"!city.kitakyushu.jp\0" +"svalbard.no\0" +"happou.akita.jp\0skedsmokorset.no\0" +"kumakogen.ehime.jp\0" +"taketa.oita.jp\0" +"sch.ng\0ak.us\0" +"graz.museum\0krakow.pl\0" +"meet\0" +"ulsan.kr\0" +"asso.km\0cartoonart.museum\0" +"teramo.it\0" +"matsumoto.kagoshima.jp\0" +"iheya.okinawa.jp\0" +"\xd9\xbe\xd8\xa7\xda\xa9\xd8\xb3\xd8\xaa\xd8\xa7\xd9\x86\0" +"gouv.km\0" +"is-into-anime.com\0" +"yawara.ibaraki.jp\0" +"sic.it\0" "rovno.ua\0" -"pilot.aero\0" -"dell-ogliastra.it\0" -"space.museum\0" -"asakuchi.okayama.jp\0" -"kafjord.no\0" -"sakado.saitama.jp\0" -"k12.ut.us\0" -"matsushima.miyagi.jp\0" -"or.th\0web.tj\0" -"communication.museum\0naturalsciences.museum\0" -"pro.ht\0rawa-maz.pl\0" -"ashiya.hyogo.jp\0" -"udmurtia.ru\0ck.ua\0" -"eastcoast.museum\0gs.va.no\0motorcycles\0praxi\0" -"web.tr\0" -"cechire.com\0" -"choshi.chiba.jp\0" -"avellino.it\0kuchinotsu.nagasaki.jp\0" -"or.ug\0" -"or.tz\0" -"ap-southeast-2.compute.amazonaws.com\0" -"kusatsu.gunma.jp\0okawa.kochi.jp\0yamaga.kumamoto.jp\0hikone.shiga.jp\0" -"selfip.info\0" -"urausu.hokkaido.jp\0taki.mie.jp\0" -"essex.museum\0" -"group\0" -"or.us\0web.ve\0" -"tama.tokyo.jp\0" -"l\xc3\xb8""dingen.no\0today\0likescandy.com\0" -"iizuka.fukuoka.jp\0" -"\xe4\xb8\xad\xe4\xbf\xa1\0" -"takamori.kumamoto.jp\0" -"kibichuo.okayama.jp\0" +"asahikawa.hokkaido.jp\0nagatoro.saitama.jp\0hot\0" +"how\0" +"everbank\0" +"asso.mc\0getmyip.com\0" +"campania.it\0" +"capital\0" +"kawanishi.yamagata.jp\0rsvp\0" +"\xe9\xb9\xbf\xe5\x85\x90\xe5\xb3\xb6.jp\0" +"glogow.pl\0recht.pro\0sch.qa\0" +"jpn.com\0" +"is-a-candidate.org\0" +"i234.me\0" +"ws.na\0" +"gouv.ml\0" +"mydissent.net\0" +"prd.km\0" +"qld.gov.au\0" +"bc.ca\0" +"ogi.saga.jp\0" +"arts.museum\0mosj\xc3\xb8""en.no\0isa-geek.net\0" +"is-a-caterer.com\0" +"lib.mi.us\0gb.com\0" +"katsushika.tokyo.jp\0naustdal.no\0" +"nanao.ishikawa.jp\0" +"yoshida.shizuoka.jp\0ibm\0" +"\xd0\xbc\xd0\xba\xd0\xb4\0" +"austin.museum\0outsystemscloud.com\0" +"ichihara.chiba.jp\0" +"cookingchannel\0" +"sch.sa\0corsica\0" +"ice\0" +"kiso.nagano.jp\0" +"gs.ol.no\0from-wi.com\0" +"friuli-venezia-giulia.it\0mc.it\0" +"prd.mg\0software\0" +"aq.it\0ba.it\0" +"toho.fukuoka.jp\0" +"fjaler.no\0" +"hareid.no\0" +"dnsalias.com\0" +"stange.no\0" +"htc\0" +"nanto.toyama.jp\0icu\0" "kristiansund.no\0" -"dallas.museum\0diamonds\0" -"daegu.kr\0" -"svalbard.no\0" -"rocher\0" -"chonan.chiba.jp\0" -"evenassi.no\0" -"cinema.museum\0bardu.no\0" -"midori.chiba.jp\0starostwo.gov.pl\0" -"balestrand.no\0" -"homeunix.net\0" -"forsand.no\0" -"\xe3\x82\xb3\xe3\x83\xa0\0" -"steiermark.museum\0" -"kamiizumi.saitama.jp\0fukumitsu.toyama.jp\0" -"from-ar.com\0" -"gosen.niigata.jp\0" -"s\xc3\xb8gne.no\0chernivtsi.ua\0vi.us\0" -"takahama.aichi.jp\0kamiichi.toyama.jp\0" -"memorial.museum\0k12.va.us\0" -"hitachiota.ibaraki.jp\0taiwa.miyagi.jp\0" -"odo.br\0minamiuonuma.niigata.jp\0\xe5\x85\xac\xe5\x8f\xb8\0" -"shimada.shizuoka.jp\0" -"mobi\0oyer.no\0cr.ua\0" -"\xe6\xb2\x96\xe7\xb8\x84.jp\0" -"pro.na\0b\xc3\xa1hcavuotna.no\0\xd7\xa7\xd7\x95\xd7\x9d\0" -"ogano.saitama.jp\0" -"\xe6\xb8\xb8\xe6\x88\x8f\0" -"pro.mv\0" -"environmentalconservation.museum\0" -"takatsuki.shiga.jp\0" -"www.ro\0" -"furukawa.miyagi.jp\0" -"balat.no\0cc.va.us\0" -"h\xc3\xb8ylandet.no\0schule\0" -"\xd8\xa7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86.ir\0" -"aostavalley.it\0ferrara.it\0kashiwazaki.niigata.jp\0" -"consulting.aero\0n\xc3\xa5\xc3\xa5mesjevuemie.no\0" -"k12.ct.us\0" -"forli-cesena.it\0warszawa.pl\0" -"media.aero\0moda\0" -"kuki.saitama.jp\0" -"b\xc3\xa1jddar.no\0vikna.no\0k12.pa.us\0" -"pro.om\0boutique\0" -"katsuragi.wakayama.jp\0" -"esashi.hokkaido.jp\0urakawa.hokkaido.jp\0hamatama.saga.jp\0" -"kg.kr\0" -"appspot.com\0" -"mashiko.tochigi.jp\0" -"kuban.ru\0" -"kawanehon.shizuoka.jp\0" -"africa\0" -"suldal.no\0pp.ru\0pp.se\0cc.pa.us\0" -"modena.it\0" -"krym.ua\0" -"pro.pr\0" -"goshiki.hyogo.jp\0" -"sasebo.nagasaki.jp\0" +"yekaterinburg.ru\0" +"certification.aero\0" +"harstad.no\0" +"ichinomiya.aichi.jp\0" +"ibestad.no\0" +"logistics.aero\0" +"arendal.no\0" +"yaese.okinawa.jp\0hoylandet.no\0midsund.no\0" +"endoftheinternet.org\0" +"ohtawara.tochigi.jp\0" +"koeln.museum\0" +"kyonan.chiba.jp\0" +"meme\0to.leg.br\0" +"hashikami.aomori.jp\0" +"k12.tx.us\0" +"association.aero\0" +"k12.dc.us\0" +"gorizia.it\0dealer\0" +"miho.ibaraki.jp\0kotoura.tottori.jp\0" +"takazaki.miyazaki.jp\0" +"asaminami.hiroshima.jp\0skierva.no\0ifm\0" +"homeftp.net\0" +"naval.museum\0" +"histoire.museum\0mango\0" +"bristol.museum\0" +"vologda.su\0" +"ontario.museum\0" +"\xd0\xbc\xd0\xbe\xd0\xbd\0" +"*.compute.estate\0" +"higashiyoshino.nara.jp\0alt.za\0" +"chino.nagano.jp\0" +"gjerstad.no\0menu\0" +"rl.no\0" +"\xe3\x82\xbb\xe3\x83\xbc\xe3\x83\xab\0zappos\0s3-external-1.amazonaws.com\0from-sc.com\0" +"chelyabinsk.ru\0" +"haram.no\0" +"fujikawa.shizuoka.jp\0" +"microlight.aero\0" +"automotive.museum\0virtual.museum\0" +"yurihonjo.akita.jp\0akiruno.tokyo.jp\0plantation.museum\0" +"myqnapcloud.com\0" +"rn.it\0tuxfamily.org\0" +"lu.it\0me.it\0noto.ishikawa.jp\0laakesvuemie.no\0" +"bokn.no\0" +"takaoka.toyama.jp\0" +"is-an-anarchist.com\0" +"yakumo.hokkaido.jp\0ogano.saitama.jp\0" +"bestbuy\0" +"ayabe.kyoto.jp\0ma.us\0theater\0" +"mosjoen.no\0" +"rissa.no\0" +"amagasaki.hyogo.jp\0" +"taishi.osaka.jp\0snillfjord.no\0vologda.ru\0s3-us-west-2.amazonaws.com\0" +"macerata.it\0" +"stj\xc3\xb8rdalshalsen.no\0" +"dazaifu.fukuoka.jp\0" +"\xd8\xa7\xd9\x84\xd8\xac\xd8\xb2\xd8\xa7\xd8\xa6\xd8\xb1\0" +"sch.zm\0ventures\0" +"florence.it\0brasil.museum\0" +"rzeszow.pl\0homedepot\0" +"piw.gov.pl\0design\0" +"sardegna.it\0alibaba\0" +"arna.no\0" +"tsuga.tochigi.jp\0" +"shichikashuku.miyagi.jp\0" +"ddns.me\0" +"kumano.hiroshima.jp\0nakatane.kagoshima.jp\0k12.de.us\0seat\0" +"pa.gov.pl\0" +"rennes\xc3\xb8y.no\0" +"nishiaizu.fukushima.jp\0" +"avellino.it\0" +"cnt.br\0eu.int\0bolzano.it\0" +"kiyama.saga.jp\0\xe3\x83\x9d\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x88\0" +"heroy.nordland.no\0" +"ggee\0" +"from-ne.com\0" +"chuo.chiba.jp\0kyoto\0" +"shinto.gunma.jp\0" +"network\0" +"*.platform.sh\0" +"science\0" +"hasami.nagasaki.jp\0" +"lib.me.us\0" "marine.ru\0" -"nanporo.hokkaido.jp\0" -"sa.gov.au\0frogn.no\0is-a-cpa.com\0" -"vaksdal.no\0" -"tomiya.miyagi.jp\0" -"orskog.no\0" -"\xe5\x9f\xbc\xe7\x8e\x89.jp\0" -"missile.museum\0theater.museum\0" -"nanto.toyama.jp\0jeonbuk.kr\0" -"unj\xc3\xa1rga.no\0" -"crotone.it\0" -"2000.hu\0\xe7\x8f\xa0\xe5\xae\x9d\0" -"pp.ua\0" -"broker\0" -"kui.hiroshima.jp\0" -"aerobatic.aero\0x.se\0lugansk.ua\0" -"perso.sn\0" -"palace.museum\0hob\xc3\xb8l.no\0plo.ps\0" -"agriculture.museum\0" -"nozawaonsen.nagano.jp\0mitsuke.niigata.jp\0parliament.nz\0" -"hattfjelldal.no\0" -"jeonnam.kr\0mielec.pl\0" -"wallonie.museum\0" -"shimabara.nagasaki.jp\0" -"higashimurayama.tokyo.jp\0" -"k12.pr.us\0works\0" -"sado.niigata.jp\0world\0" -"eid.no\0" -"nishiwaki.hyogo.jp\0minamisanriku.miyagi.jp\0perso.tn\0" -"hanamigawa.chiba.jp\0" -"mikawa.yamagata.jp\0" -"odesa.ua\0" -"obuse.nagano.jp\0" -"from-md.com\0" -"en.it\0koga.ibaraki.jp\0" -"lincoln.museum\0aure.no\0gildeskal.no\0belgorod.ru\0" -"pro.tt\0" +"rackmaze.net\0" +"baths.museum\0uscountryestate.museum\0damnserver.com\0" +"ing\0" +"kvinnherad.no\0siellak.no\0" +"chat\0" +"net.ac\0tambov.ru\0ink\0" +"net.ae\0toyono.osaka.jp\0nishiazai.shiga.jp\0" +"net.af\0niki.hokkaido.jp\0" +"net.ag\0r\xc3\xa1isa.no\0\xd1\x83\xd0\xbf\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0" +"net.ai\0" +"harima.hyogo.jp\0" +"net.al\0int\0dinosaur.museum\0" +"liguria.it\0" +"net.ba\0health.nz\0seek\0" +"net.ar\0net.bb\0" +"net.au\0router.management\0" +"net.bh\0" +"net.az\0" +"tabuse.yamaguchi.jp\0ae.org\0" +"tokai.aichi.jp\0khv.ru\0" +"net.bm\0zoological.museum\0" +"net.bo\0wegrow.pl\0" +"fantasyleague.cc\0" +"net.br\0" +"net.bs\0" +"net.bt\0" +"fortworth.museum\0" +"net.ci\0" +"net.bz\0luxe\0" +"serveblog.net\0" +"pistoia.it\0" +"net.cm\0uchiko.ehime.jp\0" +"net.cn\0" +"net.co\0izena.okinawa.jp\0iwata.shizuoka.jp\0" +"r\xc3\xa6lingen.no\0zp.gov.pl\0" +"nagano.jp\0" +"net.cu\0monzaedellabrianza.it\0k12.co.us\0\xec\x82\xbc\xec\x84\xb1\0" +"tube\0" +"net.cw\0" +"net.cy\0time.no\0" +"aerobatic.aero\0" +"net.dm\0" +"press.cy\0net.do\0" +"komono.mie.jp\0" +"cim.br\0" +"net.ec\0" +"kagoshima.jp\0rochester.museum\0plo.ps\0myvnc.com\0" +"net.eg\0" +"ruhr\0" +"leka.no\0" +"net.dz\0obu.aichi.jp\0jcb\0" +"and.museum\0" +"krym.ua\0" +"ako.hyogo.jp\0" +"oketo.hokkaido.jp\0" +"helsinki\0" +"net.et\0misato.akita.jp\0bbs.tr\0" +"sd.cn\0kostroma.ru\0" +"\xe5\xae\xae\xe5\x9f\x8e.jp\0jcp\0" +"hb.cn\0" +"ist\0" +"onyourside\0" +"ba.leg.br\0" +"mi.it\0toyama.jp\0me.tz\0" +"aver\xc3\xb8y.no\0k-uralsk.ru\0me.uk\0" +"net.ge\0bg.it\0" +"net.gg\0hyllestad.no\0" +"singles\0" +"yasaka.nagano.jp\0" +"security\0from-az.net\0" +"net.gl\0sardinia.it\0sakai.osaka.jp\0me.us\0" +"ushiku.ibaraki.jp\0r\xc3\xa5holt.no\0" +"net.gn\0as.us\0itv\0" +"net.gp\0" +"educator.aero\0net.gr\0dsmynas.org\0" +"net.gt\0technology\0" +"vennesla.no\0dunlop\0" +"takayama.gifu.jp\0" +"net.gy\0" +"\xe5\xb2\xa1\xe5\xb1\xb1.jp\0" +"net.hk\0" +"\xd7\x99\xd7\xa8\xd7\x95\xd7\xa9\xd7\x9c\xd7\x99\xd7\x9d.museum\0\xc3\xa5lg\xc3\xa5rd.no\0ferrero\0" +"net.hn\0" +"minamiyamashiro.kyoto.jp\0" +"unicom\0" +"massa-carrara.it\0" +"net.ht\0net.id\0" +"health.vn\0" +"iwc\0" +"net.il\0hizen.saga.jp\0" +"net.im\0owani.aomori.jp\0k12.tn.us\0" +"net.in\0os.hedmark.no\0" +"trieste.it\0mc.eu.org\0" +"net.iq\0" +"net.ir\0" +"passenger-association.aero\0net.is\0" +"stokke.no\0" +"net.je\0us.org\0" +"sweetpepper.org\0" +"iwakura.aichi.jp\0" +"lardal.no\0" +"lancashire.museum\0eidskog.no\0" +"blogsyte.com\0" +"net.jo\0" +"broke-it.net\0" +"channel\0from-ok.com\0" +"net.kg\0" +"net.ki\0vista\0" +"sakyo.kyoto.jp\0" +"akaiwa.okayama.jp\0verisign\0" +"lib.ma.us\0" +"net.kn\0is-into-cars.com\0" +"lib.as.us\0lt.eu.org\0" +"grainger\0" +"maniwa.okayama.jp\0net.la\0" +"net.lb\0" +"net.lc\0" +"usui.fukuoka.jp\0nagi.okayama.jp\0" +"cc.or.us\0" +"amur.ru\0tom.ru\0jio\0" +"ryugasaki.ibaraki.jp\0jeju.kr\0sko.gov.pl\0" +"net.ky\0" +"asti.it\0net.kz\0" +"net.lk\0" +"montreal.museum\0" "sibenik.museum\0" -"re.it\0" -"storage\0" -"kinokawa.wakayama.jp\0" -"sci.eg\0" -"manchester.museum\0" -"rs.ba\0" -"4.bg\0" -"k12.tr\0" -"minamioguni.kumamoto.jp\0" -"pro.vn\0chat\0dyndns.tv\0" -"dp.ua\0" -"nom.ad\0" -"nom.ag\0fed.us\0" -"kanna.gunma.jp\0inabe.mie.jp\0izumi.osaka.jp\0re.kr\0" -"dielddanuorri.no\0" -"le.it\0" -"firm.ht\0" -"modalen.no\0" -"hitachiomiya.ibaraki.jp\0taishi.osaka.jp\0" -"kin.okinawa.jp\0" -"windows\0" -"sc.cn\0" -"k12.vi\0" -"qld.gov.au\0lib.al.us\0" -"firm.in\0yashiro.hyogo.jp\0" -"manno.kagawa.jp\0" -"\xe9\xa4\x90\xe5\x8e\x85\0" -"kuroiso.tochigi.jp\0" -"abogado\0" -"okinawa\0kicks-ass.org\0" -"ford\0" -"bellevue.museum\0" -"shizuoka.jp\0" -"misaki.osaka.jp\0" -"fe.it\0karuizawa.nagano.jp\0" -"wa.edu.au\0nom.co\0dyndns.ws\0" -"miyako.fukuoka.jp\0earth\0" -"film.hu\0" +"gr.it\0sakuragawa.ibaraki.jp\0" +"bi.it\0" +"net.ma\0oceanographique.museum\0" +"net.lr\0" +"kamioka.akita.jp\0" +"ikaruga.nara.jp\0epson\0" +"net.me\0wy.us\0" +"net.lv\0hoyanger.no\0" +"net.ly\0" +"lakas.hu\0gr.jp\0takagi.nagano.jp\0net.mk\0" +"net.ml\0" +"stadt.museum\0school\0" +"kahoku.yamagata.jp\0karmoy.no\0" +"net.mo\0" +"kawajima.saitama.jp\0" +"treviso.it\0kamiamakusa.kumamoto.jp\0net.ms\0pittsburgh.museum\0" +"net.mt\0" +"koganei.tokyo.jp\0net.mu\0" +"net.mv\0net.nf\0\xe3\x83\x95\xe3\x82\xa1\xe3\x83\x83\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3\0" +"net.mw\0net.ng\0" +"yazu.tottori.jp\0net.mx\0" +"net.my\0net.ni\0" +"net.mz\0" +"jlc\0" +"hichiso.gifu.jp\0tatarstan.ru\0" +"am.leg.br\0" +"shinichi.hiroshima.jp\0onagawa.miyagi.jp\0net.nr\0" +"jll\0" +"togo.aichi.jp\0" +"lipsy\0" +"net.nz\0k12.in.us\0" +"ishikawa.jp\0net.om\0" +"naklo.pl\0globo\0" +"gv.ao\0" +"net.pa\0" +"yamanouchi.nagano.jp\0koebenhavn.museum\0" +"gv.at\0net.pe\0" +"mihama.mie.jp\0net.ph\0jmp\0" +"theatre\0" +"sa.edu.au\0" +"net.pk\0" +"wildlife.museum\0vanylven.no\0net.pl\0" +"sagae.yamagata.jp\0botany.museum\0" +"net.pn\0abbott\0" +"nishikawa.yamagata.jp\0" +"selfip.net\0" +"net.qa\0" +"net.pr\0aigo\0jnj\0" +"net.ps\0ryukyu\0" +"austrheim.no\0net.pt\0" "takahashi.okayama.jp\0" -"suita.osaka.jp\0" -"\xe5\xb2\xa1\xe5\xb1\xb1.jp\0toyota.yamaguchi.jp\0" -"firm.co\0" -"xz.cn\0sakae.nagano.jp\0" -"fareast.ru\0is-a-soxfan.org\0" -"la-spezia.it\0tempio-olbia.it\0" -"radoy.no\0" -"shimofusa.chiba.jp\0" -"issmarterthanyou.com\0" -"okuma.fukushima.jp\0" -"is-an-entertainer.com\0" -"ustka.pl\0" -"nexus\0" -"is-into-anime.com\0" -"kadogawa.miyazaki.jp\0" -"gc.ca\0mj\xc3\xb8ndalen.no\0holmestrand.no\0divttasvuotna.no\0" -"art.br\0puglia.it\0maniwa.okayama.jp\0" -"workinggroup.aero\0" -"yoshimi.saitama.jp\0" -"channel\0" -"ac.ae\0" -"nom.es\0" -"storfjord.no\0" -"owariasahi.aichi.jp\0hotmail\0" -"astronomy.museum\0" -"losangeles.museum\0" -"trentino-sud-tirol.it\0" -"ac.at\0" -"ac.be\0crafts.museum\0" -"nom.fr\0rishirifuji.hokkaido.jp\0kamikawa.saitama.jp\0" -"kouhoku.saga.jp\0akiruno.tokyo.jp\0" -"art.do\0pubol.museum\0" -"not.br\0vallee-aoste.it\0" -"hanggliding.aero\0" -"ravenna.it\0" -"katsuyama.fukui.jp\0kitahata.saga.jp\0" -"builders\0" -"art.dz\0" -"ac.ci\0" -"choyo.kumamoto.jp\0" -"ac.cn\0kawajima.saitama.jp\0" -"shimoichi.nara.jp\0global.ssl.fastly.net\0" -"rl.no\0" -"ac.cr\0za.bz\0" -"tobe.ehime.jp\0" -"scor\0" -"leasing.aero\0presse.km\0" -"scot\0" -"makurazaki.kagoshima.jp\0tome.miyagi.jp\0" -"andriatranibarletta.it\0" -"takarazuka.hyogo.jp\0" -"air.museum\0" -"kanra.gunma.jp\0" -"sumoto.kumamoto.jp\0" -"ambulance.museum\0" -"motorcycle.museum\0isteingeek.de\0" -"sc.kr\0" -"journal.aero\0" -"wiki.br\0mc.it\0kusu.oita.jp\0" -"cloudcontrolapp.com\0" -"inami.toyama.jp\0" -"presse.ml\0" -"broke-it.net\0" -"assn.lk\0montreal.museum\0" -"egyptian.museum\0" -"legal\0" -"nom.km\0its.me\0" -"art.ht\0" -"kotoura.tottori.jp\0" -"lutsk.ua\0" -"chino.nagano.jp\0" -"mitou.yamaguchi.jp\0" -"ujitawara.kyoto.jp\0yomitan.okinawa.jp\0" -"rieti.it\0sera.hiroshima.jp\0joetsu.niigata.jp\0" -"unjarga.no\0" -"ac.gn\0watch\0" -"nishihara.okinawa.jp\0*.platform.sh\0" -"beauxarts.museum\0" -"kviteseid.no\0rissa.no\0" -"toei.aichi.jp\0" -"nom.mg\0" -"piedmont.it\0" -"kongsberg.no\0" -"kunstunddesign.museum\0flakstad.no\0rennebu.no\0" -"campobasso.it\0nowaruda.pl\0gdansk.pl\0" -"lib.hi.us\0" -"events\0" -"ac.id\0" -"touch.museum\0narviika.no\0" -"kamitsue.oita.jp\0" -"gon.pk\0" -"ac.im\0" -"ac.in\0" -"glass\0" -"ac.ir\0" -"firm.ve\0" -"murakami.niigata.jp\0" -"furano.hokkaido.jp\0" -"melhus.no\0" -"ha.cn\0andria-trani-barletta.it\0computer\0" -"gives\0" -"saku.nagano.jp\0" -"sx.cn\0ac.jp\0" -"coloradoplateau.museum\0livinghistory.museum\0is-a-candidate.org\0" -"flog.br\0" -"rsvp\0" -"nom.pa\0" -"nom.pe\0" -"sweden.museum\0namsos.no\0" -"tanabe.wakayama.jp\0" +"mi.th\0lib.sd.us\0" +"nishiawakura.okayama.jp\0net.py\0" +"sh.cn\0" +"mo.cn\0tempio-olbia.it\0gamo.shiga.jp\0weir\0" +"org.ac\0sb.ua\0" +"org.ae\0hotels\0" +"org.af\0" +"org.ag\0fetsund.no\0" +"takatori.nara.jp\0" +"org.ai\0" +"orange\0" +"mihama.wakayama.jp\0tuva.su\0" +"org.al\0seoul.kr\0" +"active\0" +"lerdal.no\0servehumour.com\0" +"jot\0" +"org.ba\0ingatlan.hu\0" +"org.ar\0org.bb\0" +"po.gov.pl\0" +"yasugi.shimane.jp\0is-an-actor.com\0" +"org.au\0net.sa\0barclays\0joy\0" +"net.sb\0mi.us\0" +"net.sc\0" +"org.bh\0echizen.fukui.jp\0net.sd\0nissan\0" +"org.bi\0net.ru\0" +"org.az\0\xe7\xb5\x84\xe7\xbb\x87.hk\0" +"net.rw\0net.sg\0" +"a\xc3\xa9roport.ci\0net.sh\0" +"org.bm\0" +"tateyama.chiba.jp\0" +"org.bo\0" +"uji.kyoto.jp\0net.sl\0" +"org.br\0mantova.it\0" +"org.bs\0s\xc3\xb8r-odal.no\0net.so\0nissay\0" +"org.bt\0" +"org.bw\0" +"aosta.it\0net.st\0*.triton.zone\0" +"org.ci\0" +"org.bz\0hakusan.ishikawa.jp\0kudoyama.wakayama.jp\0leirfjord.no\0" +"tos.it\0space.museum\0" +"ikeda.hokkaido.jp\0net.th\0iamallama.com\0" +"net.sy\0" +"org.cn\0langevag.no\0net.tj\0" +"org.co\0hirono.iwate.jp\0" +"shunan.yamaguchi.jp\0net.tm\0" +"rikubetsu.hokkaido.jp\0net.tn\0inc.hk\0" +"net.to\0ap.leg.br\0" +"org.cu\0kameyama.mie.jp\0net.ua\0" +"iwaizumi.iwate.jp\0losangeles.museum\0hob\xc3\xb8l.no\0net.tr\0" +"org.cw\0" +"net.tt\0" +"org.cy\0" +"afamilycompany\0" +"ggf.br\0tuva.ru\0net.tw\0" +"wada.nagano.jp\0" +"org.dm\0" +"schweiz.museum\0" +"org.do\0net.uk\0nikon\0" +"govt.nz\0\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0\0" +"org.ec\0sexy\0" +"org.ee\0chesapeakebay.museum\0bingo\0" +"org.eg\0kamijima.ehime.jp\0net.vc\0" +"tenei.fukushima.jp\0\xc3\xa5""fjord.no\0net.ve\0" +"org.dz\0izumiotsu.osaka.jp\0" +"yamagata.ibaraki.jp\0obninsk.su\0" +"net.uy\0net.vi\0" +"kuji.iwate.jp\0net.uz\0" +"net.vn\0hdfcbank\0ftpaccess.cc\0" +"org.es\0" +"org.et\0" +"trentinosudtirol.it\0nakasatsunai.hokkaido.jp\0" +"franziskaner.museum\0sf.no\0lib.nm.us\0" +"net.vu\0" +"shibuya.tokyo.jp\0funahashi.toyama.jp\0" +"gx.cn\0" +"press.se\0mk.ua\0" +"esashi.hokkaido.jp\0" +"gamvik.no\0" +"abr.it\0" +"org.ge\0" +"gs.va.no\0" +"org.gg\0net.ws\0" +"org.gh\0mo.it\0lomza.pl\0zhitomir.ua\0cupcake.is\0" +"org.gi\0" "beiarn.no\0" -"\xe7\xa5\x9e\xe5\xa5\x88\xe5\xb7\x9d.jp\0handa.aichi.jp\0edogawa.tokyo.jp\0nom.pl\0" -"snoasa.no\0" -"ac.kr\0abb\0" -"tokigawa.saitama.jp\0" -"surgery\0" -"nakanojo.gunma.jp\0takino.hyogo.jp\0" -"construction\0" -"tinn.no\0" -"ta.it\0\xe6\x97\xb6\xe5\xb0\x9a\0" -"kitadaito.okinawa.jp\0" -"ac.ma\0" -"vlog.br\0" -"kirkenes.no\0" -"urbino-pesaro.it\0town\0" -"ac.me\0solutions\0" -"gouv.fr\0novara.it\0" -"gs.jan-mayen.no\0" -"mat.br\0" -"nom.re\0" -"filatelia.museum\0" -"aco\0" -"pistoia.it\0" -"versailles.museum\0" -"community.museum\0rennes\xc3\xb8y.no\0nom.ro\0" -"agr.br\0chikugo.fukuoka.jp\0" -"ac.mu\0stavern.no\0homeunix.org\0" -"ac.mw\0" -"mutsuzawa.chiba.jp\0" -"virtual.museum\0" -"intl.tn\0art.pl\0" -"dnepropetrovsk.ua\0" -"ppg.br\0" -"firm.ro\0" -"tas.au\0kautokeino.no\0" -"na.it\0" -"kvanangen.no\0pub.sa\0sc.ug\0" -"ads\0" -"gx.cn\0sc.tz\0" -"gouv.ht\0" -"somna.no\0fl.us\0toys\0" -"kutchan.hokkaido.jp\0ac.nz\0" -"iveland.no\0nordkapp.no\0" -"rovigo.it\0" -"\xc3\xa5""fjord.no\0sc.us\0" -"veneto.it\0report\0" -"nalchik.ru\0lib.ok.us\0" -"iwaki.fukushima.jp\0yatsuka.shimane.jp\0" -"lindas.no\0tvedestrand.no\0ac.pa\0nom.tm\0k12.sc.us\0omega\0" -"mjondalen.no\0" -"obihiro.hokkaido.jp\0cri.nz\0" -"matsumoto.kagoshima.jp\0" -"state.museum\0fl\xc3\xa5.no\0rauma.no\0vennesla.no\0tires\0" -"afl\0" -"gouv.bj\0" -"ac.pr\0" -"usuki.oita.jp\0" -"oregon.museum\0" -"matsusaka.mie.jp\0tochio.niigata.jp\0lebork.pl\0" -"stat.no\0" -"balsfjord.no\0karlsoy.no\0" -"mugi.tokushima.jp\0art.sn\0" -"freight.aero\0gouv.ci\0" -"coach\0" -"marche.it\0nishiawakura.okayama.jp\0" -"kids.us\0" -"shimonita.gunma.jp\0kitagawa.miyazaki.jp\0" -"tv.bb\0firm.nf\0" -"udine.it\0" -"nagasaki.jp\0" -"dni.us\0" -"luroy.no\0" -"tv.bo\0education.museum\0cooking\0" -"kagawa.jp\0" -"ac.rs\0" -"tv.br\0aq.it\0ba.it\0" -"usgarden.museum\0ac.ru\0ac.se\0" -"ac.rw\0aig\0" -"panama.museum\0bahcavuotna.no\0stord.no\0" -"shibuya.tokyo.jp\0" -"rehab\0" -"consultant.aero\0harstad.no\0" -"spjelkavik.no\0moareke.no\0" -"ono.fukui.jp\0" -"ac.th\0" -"imageandsound.museum\0" -"ac.sz\0ac.tj\0" -"malbork.pl\0" -"usa.oita.jp\0" -"bahn.museum\0educational.museum\0" -"stjordalshalsen.no\0" -"kozagawa.wakayama.jp\0" -"uozu.toyama.jp\0" -"ac.ug\0s3-us-west-1.amazonaws.com\0" -"education\0" -"ac.tz\0" -"pharmaciens.km\0ac.uk\0" -"hachinohe.aomori.jp\0" -"of.by\0ha.no\0" -"qsl.br\0to.it\0okayama.jp\0higashi.okinawa.jp\0" +"org.gl\0" +"is-by.us\0" +"ip6.arpa\0org.gn\0" +"org.gp\0sd.us\0" +"org.gr\0otofuke.hokkaido.jp\0" +"org.gt\0kfh\0" +"alsace\0exposed\0" +"nogi.tochigi.jp\0london.museum\0" +"aircraft.aero\0org.gy\0" +"courses\0" +"org.hk\0" +"org.hn\0" +"dlugoleka.pl\0" +"sorreisa.no\0mk.eu.org\0" +"org.ht\0" +"org.hu\0nishiizu.shizuoka.jp\0net.za\0" +"shimizu.shizuoka.jp\0" +"shiwa.iwate.jp\0natori.miyagi.jp\0haebaru.okinawa.jp\0" +"eu-central-1.compute.amazonaws.com\0" +"bern.museum\0" +"org.il\0mihara.hiroshima.jp\0" +"org.im\0higashishirakawa.gifu.jp\0aviation.museum\0" +"org.in\0" +"from-mn.com\0" +"org.iq\0net.zm\0" +"org.ir\0" +"org.is\0" +"jewelry\0static.land\0" +"org.je\0youtube\0" +"trentinosuedtirol.it\0" +"\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xdb\x8c\xd8\xa9\0" +"donetsk.ua\0\xd0\xbe\xd1\x80\xd0\xb3\0" +"salerno.it\0shoo.okayama.jp\0stockholm\0" +"shibata.miyagi.jp\0" +"kia\0" +"beeldengeluid.museum\0" +"org.jo\0levanger.no\0" +"touch.museum\0" +"tsukigata.hokkaido.jp\0no-ip.ca\0qa2.com\0" +"takahata.yamagata.jp\0" +"shirosato.ibaraki.jp\0" +"org.kg\0mlbfan.org\0" +"abashiri.hokkaido.jp\0higashisumiyoshi.osaka.jp\0" +"org.ki\0kim\0" +"org.km\0" +"org.kn\0boldlygoingnowhere.org\0" +"org.kp\0" +"org.la\0vikna.no\0" +"org.lb\0" +"org.lc\0porsgrunn.no\0consulado.st\0" +"tsubata.ishikawa.jp\0" +"tur.ar\0gz.cn\0org.ky\0rv.ua\0" +"org.kz\0cc.va.us\0" +"org.lk\0press.ma\0" +"camera\0" +"org.ma\0\xc3\xb8ystre-slidre.no\0yalta.ua\0" +"org.lr\0" +"na.it\0org.ls\0lu.eu.org\0me.eu.org\0" +"bo.it\0org.me\0sauherad.no\0" +"org.lv\0" +"org.mg\0" +"columbus.museum\0kazimierz-dolny.pl\0e12.ve\0cloudns.pro\0" +"tur.br\0toon.ehime.jp\0org.ly\0" +"org.mk\0watchandclock.museum\0kvafjord.no\0" +"seirou.niigata.jp\0org.ml\0" +"org.mn\0rj.leg.br\0" +"org.mo\0" +"mine.nu\0" +"org.na\0" +"bifuka.hokkaido.jp\0volkenkunde.museum\0" +"org.ms\0" +"org.mt\0" +"org.mu\0" +"org.mv\0dyndns.biz\0" +"org.mw\0org.ng\0" +"urbinopesaro.it\0org.mx\0fedex\0" +"org.my\0org.ni\0varggat.no\0" +"org.mz\0" +"lindesnes.no\0mandal.no\0" +"volyn.ua\0" +"aoste.it\0" +"hakone.kanagawa.jp\0org.nr\0" +"date.hokkaido.jp\0money\0nokia\0lv.eu.org\0" +"toga.toyama.jp\0" +"yamanobe.yamagata.jp\0org.nz\0" +"itako.ibaraki.jp\0skole.museum\0" +"maritimo.museum\0org.om\0" +"from-ny.net\0" +"nosegawa.nara.jp\0org.pa\0" +"org.pe\0" +"org.pf\0" +"kamitsue.oita.jp\0blogspot.com.cy\0" +"satx.museum\0org.ph\0" +"zgorzelec.pl\0" +"mill.museum\0" +"ishikari.hokkaido.jp\0minami.tokushima.jp\0org.pk\0better-than.tv\0" +"org.pl\0gift\0" +"\xe4\xb8\xaa\xe4\xba\xba.hk\0" +"org.pn\0" +"*.api.githubcloud.com\0" +"watch\0" +"meldal.no\0org.qa\0" +"org.pr\0is-a-bulls-fan.com\0" +"org.ps\0blogspot.com.ee\0" +"org.pt\0events\0" +"finance\0blogspot.com.eg\0" +"codespot.com\0" +"beppu.oita.jp\0bytom.pl\0" +"org.py\0" +"izhevsk.ru\0" +"h\xc3\xa1pmir.no\0" +"blogspot.com.ar\0" +"sn.cn\0" +"mw.gov.pl\0education\0blogspot.com.au\0" +"hl.cn\0" +"circus.museum\0" +"shinshiro.aichi.jp\0" +"suwalki.pl\0" +"kijo.miyazaki.jp\0sunndal.no\0snz.ru\0kpn\0" +"citi\0target\0" +"exchange\0" +"uchinomi.kagawa.jp\0" +"ms.it\0" +"shiki.saitama.jp\0org.ro\0" +"ca.it\0tokashiki.okinawa.jp\0blogspot.com.br\0" +"org.sa\0cn-north-1.compute.amazonaws.com.cn\0" +"org.sb\0" +"org.rs\0org.sc\0" +"moma.museum\0org.sd\0" +"yugawara.kanagawa.jp\0org.ru\0org.se\0" +"org.sg\0mo.us\0blogspot.com.by\0" +"mad.museum\0even\xc3\xa1\xc5\xa1\xc5\xa1i.no\0org.sh\0" +"yatomi.aichi.jp\0" +"limanowa.pl\0" +"city\0" +"org.sl\0ddns.net\0" +"recreation.aero\0blogspot.com.co\0" +"org.sn\0" +"horokanai.hokkaido.jp\0org.so\0" +"krd\0lat\0" +"bolt.hu\0ojiya.niigata.jp\0" +"childrensgarden.museum\0law\0" +"fribourg.museum\0org.st\0" +"org.sv\0" +"kaminoyama.yamagata.jp\0dali.museum\0" +"higashiura.aichi.jp\0org.sy\0" +"rieti.it\0org.sz\0org.tj\0" +"v\xc3\xa6r\xc3\xb8y.no\0" +"taiji.wakayama.jp\0ms.kr\0" +"machida.tokyo.jp\0org.tm\0" +"org.tn\0" +"neyagawa.osaka.jp\0org.to\0" +"wiw.gov.pl\0" +"org.ua\0" +"org.tr\0" +"zagan.pl\0mex.com\0" +"org.tt\0" +"org.tw\0org.ug\0caseih\0" +"tec.ve\0" +"ikusaka.nagano.jp\0" +"jeonnam.kr\0org.uk\0" +"ascoli-piceno.it\0" +"homesecuritymac.com\0" +"miyako.iwate.jp\0yoshino.nara.jp\0" +"lupin\0blogspot.com.es\0" +"org.vc\0" +"is-a-anarchist.com\0" +"org.ve\0" +"chizu.tottori.jp\0monash\0" +"dscloud.biz\0" +"tananger.no\0" +"org.uy\0org.vi\0" +"org.uz\0" +"ca.na\0myshopblocks.com\0" +"ing.pa\0org.vn\0" +"stalbans.museum\0lds\0" +"kr.eu.org\0" +"isernia.it\0" +"matsue.shimane.jp\0org.vu\0dev.static.land\0" +"tomobe.ibaraki.jp\0" +"xenapponazure.com\0" +"hn.cn\0farmequipment.museum\0" +"\xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xdb\x8c\xdb\x83\0" +"org.ws\0forgot.her.name\0" +"catania.it\0" +"fukumitsu.toyama.jp\0koya.wakayama.jp\0" +"agents.aero\0" +"bs.it\0" +"hidaka.kochi.jp\0" +"konsulat.gov.pl\0" +"aso.kumamoto.jp\0walmart\0" +"froland.no\0" +"hughes\0" +"ne.jp\0onga.fukuoka.jp\0" +"yamanashi.yamanashi.jp\0" +"presse.km\0" +"watarai.mie.jp\0" +"ass.km\0" +"h\xc3\xa6gebostad.no\0" +"bandai.fukushima.jp\0" +"org.za\0" +"is-into-cartoons.com\0" +"tochio.niigata.jp\0" +"futaba.fukushima.jp\0" +"production.aero\0ne.kr\0" +"monzaebrianza.it\0" +"lel.br\0" +"frosinone.it\0is-a-therapist.com\0" +"org.zm\0" +"futtsu.chiba.jp\0" +"tamakawa.fukushima.jp\0" +"nankoku.kochi.jp\0fuji.shizuoka.jp\0" +"dsmynas.net\0" +"myphotos.cc\0" +"\xe4\xb8\x89\xe9\x87\x8d.jp\0presse.ml\0pvt.k12.ma.us\0" +"bnpparibas\0" +"karuizawa.nagano.jp\0" +"irish\0" +"*.transurl.be\0" +"hitachi.ibaraki.jp\0kalisz.pl\0" +"beep.pl\0" +"kushimoto.wakayama.jp\0cc.na\0" +"yk.ca\0" +"kawanishi.nara.jp\0" +"nanbu.yamanashi.jp\0" +"tagajo.miyagi.jp\0" +"chikushino.fukuoka.jp\0ikeda.gifu.jp\0eu-west-1.compute.amazonaws.com\0cloudns.org\0" +"lib.ne.us\0" +"lib.il.us\0" +"hl.no\0akdn\0liaison\0" +"ota.gunma.jp\0\xd8\xa7\xd8\xaa\xd8\xb5\xd8\xa7\xd9\x84\xd8\xa7\xd8\xaa\0" +"suedtirol.it\0shitara.aichi.jp\0jinsekikogen.hiroshima.jp\0" +"szczytno.pl\0nc.tr\0" +"usculture.museum\0sochi.su\0" +"rr.leg.br\0" +"shaw\0" +"blogspot.com.mt\0" +"sp.it\0" +"flesberg.no\0blogspot.com.ng\0" +"ce.it\0olsztyn.pl\0" +"achi.nagano.jp\0" +"go.dyndns.org\0" +"shoes\0" +"geometre-expert.fr\0ms.us\0nc.us\0" +"ca.us\0" +"virtueeldomein.nl\0" "online\0" -"maebashi.gunma.jp\0" -"valleaosta.it\0kushimoto.wakayama.jp\0" -"pomorze.pl\0" -"salat.no\0" -"surrey.museum\0" -"ichinoseki.iwate.jp\0seat\0" -"tokai.aichi.jp\0abiko.chiba.jp\0numata.gunma.jp\0for-better.biz\0" -"tas.edu.au\0nationalheritage.museum\0" -"ac.vn\0sopot.pl\0" -"tambov.ru\0" -"redstone\0" -"mx.na\0est-le-patron.com\0" -"amli.no\0" -"higashiosaka.osaka.jp\0auto.pl\0" -"omitama.ibaraki.jp\0" -"dynalias.com\0" -"no.it\0" -"bir.ru\0" -"haibara.shizuoka.jp\0" -"suwa.nagano.jp\0" -"recreation.aero\0jewishart.museum\0rade.no\0" -"shingu.fukuoka.jp\0warmia.pl\0" -"flesberg.no\0hemne.no\0" -"minamidaito.okinawa.jp\0" -"station.museum\0bo.telemark.no\0" -"kitanakagusuku.okinawa.jp\0" -"nesodden.no\0vologda.ru\0casino\0" -"itoigawa.niigata.jp\0" -"misawa.aomori.jp\0tsubata.ishikawa.jp\0maibara.shiga.jp\0" -"exchange.aero\0" -"tv.im\0seek\0" -"toon.ehime.jp\0" -"kyiv.ua\0" -"tirol\0" -"tv.it\0" -"phoenix.museum\0" -"stjordal.no\0" -"yonabaru.okinawa.jp\0" -"akabira.hokkaido.jp\0aguni.okinawa.jp\0" -"yugawara.kanagawa.jp\0" -"kiyose.tokyo.jp\0" -"powiat.pl\0lomza.pl\0" -"lans.museum\0mex.com\0" -"gifu.gifu.jp\0" -"sel.no\0lib.ut.us\0" -"e.bg\0film.museum\0" -"fortmissoula.museum\0" -"itano.tokushima.jp\0yamanobe.yamagata.jp\0" -"honjo.akita.jp\0ginan.gifu.jp\0" -"r\xc3\xa1hkker\xc3\xa1vju.no\0" -"bar\0" -"presse.ci\0bbc\0" -"bo.it\0" -"minakami.gunma.jp\0" -"hapmir.no\0cc.mi.us\0is-a-teacher.com\0" +"alto-adige.it\0opencraft.hosting\0" +"naturalhistorymuseum.museum\0" +"\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\x82\xe0\xa6\xb2\xe0\xa6\xbe\0" +"\xe5\x81\xa5\xe5\xba\xb7\0" +"!www.ck\0valle-aosta.it\0ne.pw\0rns.tn\0" +"cincinnati.museum\0" +"rs.leg.br\0sc.leg.br\0*.transurl.eu\0" +"gateway.museum\0" +"roan.no\0" +"togakushi.nagano.jp\0oshima.tokyo.jp\0" +"higashi.fukushima.jp\0musashimurayama.tokyo.jp\0" +"is-certified.com\0" +"kaga.ishikawa.jp\0quicksytes.com\0" +"k12.ut.us\0" +"christiansburg.museum\0vindafjord.no\0k12.pa.us\0" +"kazan.ru\0blogspot.com.tr\0" +"claims\0knightpoint.systems\0" +"ueda.nagano.jp\0ringebu.no\0" +"leikanger.no\0" +"lol\0works\0" +"chiba.jp\0science-fiction.museum\0murmansk.su\0world\0" +"nago.okinawa.jp\0" +"jelenia-gora.pl\0goldpoint\0" +"nahari.kochi.jp\0estate.museum\0" +"mysecuritycamera.com\0" +"hanamaki.iwate.jp\0ube.yamaguchi.jp\0sorfold.no\0" +"fermo.it\0" +"lincoln\0" +"lpl\0" +"country\0" +"whoswho\0" +"hioki.kagoshima.jp\0musashino.tokyo.jp\0muosat.no\0lib.ms.us\0lib.nc.us\0" +"my.id\0" +"bu.no\0" +"north.museum\0is-a-soxfan.org\0" +"blackfriday\0" +"parma.it\0" +"group\0" +"cc.vi.us\0" +"masfjorden.no\0" +"trentino-sued-tirol.it\0\xd9\x81\xd9\x84\xd8\xb3\xd8\xb7\xd9\x8a\xd9\x86\0" +"iizuna.nagano.jp\0sor-varanger.no\0engineering\0" +"man\0" +"nishihara.kumamoto.jp\0" +"sveio.no\0ne.ug\0map\0microsoft\0" +"her\xc3\xb8y.nordland.no\0mba\0" +"sr.it\0kouyama.kagoshima.jp\0" +"ne.tz\0" +"canon\0" "kasugai.aichi.jp\0" -"jewelry.museum\0gulen.no\0dvag\0" -"engerdal.no\0" -"achi.nagano.jp\0serveftp.net\0" -"khv.ru\0" -"morotsuka.miyazaki.jp\0tarama.okinawa.jp\0ruhr\0" -"laakesvuemie.no\0is-a-caterer.com\0" -"onga.fukuoka.jp\0" -"khmelnytskyi.ua\0" -"messina.it\0bcn\0" -"fhs.no\0" -"berlin.museum\0alipay\0infiniti\0" -"adult.ht\0" -"tv.na\0name\0" -"vao.it\0zachpomor.pl\0" -"\xc3\xa5rdal.no\0herokuapp.com\0" -"karatsu.saga.jp\0gov.nc.tr\0" -"sydney\0uy.com\0" -"imperia.it\0turen.tn\0" -"time.museum\0" -"\xd9\x85\xd9\x88\xd8\xa8\xd8\xa7\xd9\x8a\xd9\x84\xd9\x8a\0" -"lighting\0" -"matsubara.osaka.jp\0rnu.tn\0" -"seaport.museum\0" -"assassination.museum\0" -"ikeda.fukui.jp\0iinet\0" -"doosan\0" -"it.ao\0idv.hk\0e12.ve\0" -"shari.hokkaido.jp\0nahari.kochi.jp\0" -"trader.aero\0nh.us\0" -"takatori.nara.jp\0" -"columbia.museum\0" -"city\0is-a-player.com\0" -"presse.fr\0shimoji.okinawa.jp\0numazu.shizuoka.jp\0upow.gov.pl\0" -"arna.no\0" -"muroto.kochi.jp\0" -"l.bg\0" -"kamogawa.chiba.jp\0" -"mosvik.no\0" -"frankfurt.museum\0mo-i-rana.no\0" -"nichinan.miyazaki.jp\0" -"kitagawa.kochi.jp\0" -"kr\xc3\xb8""dsherad.no\0skierv\xc3\xa1.no\0us.com\0from-oh.com\0" -"arao.kumamoto.jp\0" -"ryazan.ru\0" -"hurum.no\0" -"kitashiobara.fukushima.jp\0ichinohe.iwate.jp\0" -"louvre.museum\0moma.museum\0of.no\0" -"\xe4\xb8\x89\xe9\x87\x8d.jp\0shingu.wakayama.jp\0" -"cupcake.is\0" -"limanowa.pl\0zuerich\0" -"decorativearts.museum\0" -"gouv.rw\0lib.ct.us\0" -"andria-barletta-trani.it\0market\0" -"nomi.ishikawa.jp\0nakano.nagano.jp\0" -"irish\0" -"logistics.aero\0molde.no\0axa\0industries\0" -"nagano.jp\0gouv.sn\0" -"technology.museum\0" -"press.museum\0s3-fips-us-gov-west-1.amazonaws.com\0" -"munakata.fukuoka.jp\0" -"rodoy.no\0" -"bolt.hu\0" -"flor\xc3\xb8.no\0khabarovsk.ru\0" -"yachiyo.chiba.jp\0miyama.fukuoka.jp\0" -"sanuki.kagawa.jp\0" -"im.it\0" -"bid\0" -"kitaura.miyazaki.jp\0tv.sd\0" -"shizukuishi.iwate.jp\0" -"corsica\0" -"pavia.it\0usui.fukuoka.jp\0" -"chesapeakebay.museum\0bio\0" -"atami.shizuoka.jp\0" -"nanae.hokkaido.jp\0" -"saitama.jp\0" -"ggf.br\0" -"s.bg\0" -"shobara.hiroshima.jp\0himi.toyama.jp\0" -"biz\0takko.aomori.jp\0" -"guovdageaidnu.no\0" -"shishikui.tokushima.jp\0" -"massa-carrara.it\0shimokawa.hokkaido.jp\0" -"erotika.hu\0oppeg\xc3\xa5rd.no\0" -"sayo.hyogo.jp\0" -"bentley\0" -"eidfjord.no\0hamaroy.no\0" -"bv.nl\0tv.tr\0" -"smola.no\0" -"ohira.tochigi.jp\0" -"botanicgarden.museum\0" -"ot.it\0pd.it\0" -"halsa.no\0troms\xc3\xb8.no\0\xd2\x9b\xd0\xb0\xd0\xb7\0" -"fr\xc3\xa6na.no\0" -"niigata.jp\0takayama.gifu.jp\0koshimizu.hokkaido.jp\0tv.tz\0" -"\xc3\xa5l.no\0" -"solar\0" -"belluno.it\0" -"interactive.museum\0lib.co.us\0us-west-2.compute.amazonaws.com\0" -"shikatsu.aichi.jp\0" -"nobeoka.miyazaki.jp\0" -"torsken.no\0" -"\xe9\x95\xb7\xe9\x87\x8e.jp\0iki.nagasaki.jp\0" -"express.aero\0" -"nysa.pl\0" -"miyawaka.fukuoka.jp\0gbiz\0" -"catanzaro.it\0" -"kiyosu.aichi.jp\0ikaruga.nara.jp\0" +"guitars\0" +"oarai.ibaraki.jp\0selfip.org\0serveminecraft.net\0" +"teo.br\0kochi.jp\0berlev\xc3\xa5g.no\0ne.us\0" +"murmansk.ru\0" +"mel\xc3\xb8y.no\0shia\0" +"grp.lk\0" +"mcd\0" +"ome.tokyo.jp\0" +"izunokuni.shizuoka.jp\0" +"dyndns-work.com\0" +"rnu.tn\0" +"okawa.fukuoka.jp\0misaki.okayama.jp\0" +"hakuba.nagano.jp\0" +"owariasahi.aichi.jp\0s\xc3\xb8rfold.no\0" +"rn.leg.br\0" +"clinique\0" +"gmail\0ltd\0" +"state.museum\0" +"readmyblog.org\0" +"blogspot.com.uy\0" +"niiza.saitama.jp\0" +"v\xc3\xa5gan.no\0williamhill\0" +"rawa-maz.pl\0" +"historisches.museum\0" +"abira.hokkaido.jp\0" +"audible\0med\0" +"from-mi.com\0" +"insurance.aero\0hita.oita.jp\0" +"is-a-techie.com\0" +"id.au\0" +"men\0" +"kr\xc3\xa5""anghke.no\0meo\0" +"ro.leg.br\0" +"takaishi.osaka.jp\0www.ro\0" +"himeji.hyogo.jp\0" +"sakuho.nagano.jp\0*.transurl.nl\0" +"priv.hu\0" +"aki.kochi.jp\0" +"arida.wakayama.jp\0" +"nm.cn\0" +"kawagoe.mie.jp\0" +"pubol.museum\0" +"cc.pr.us\0mini\0" +"square.museum\0chernihiv.ua\0" +"church\0" +"spb.ru\0" +"contractors\0" +"ci.it\0ulan-ude.ru\0" +"avoues.fr\0mint\0" +"trentino-stirol.it\0" +"lincoln.museum\0" +"tottori.jp\0" +"campidano-medio.it\0oamishirasato.chiba.jp\0spb.su\0" +"aichi.jp\0" +"hisamitsu\0" +"kurobe.toyama.jp\0mopar\0drud.io\0" +"hisayama.fukuoka.jp\0" +"time.museum\0" +"skjerv\xc3\xb8y.no\0from-de.com\0" +"ehime.jp\0biei.hokkaido.jp\0" +"koriyama.fukushima.jp\0" +"mugi.tokushima.jp\0idrett.no\0" +"mil\0" +"shop\0\xd8\xb9\xd8\xb1\xd8\xa8\0" +"mit\0" +"show\0us-gov-west-1.compute.amazonaws.com\0" +"takko.aomori.jp\0" +"kamoenai.hokkaido.jp\0tadotsu.kagawa.jp\0kiwi\0" +"jamison.museum\0dupont\0" +"flora.no\0" +"tokushima.jp\0" +"bounceme.net\0" +"garden.museum\0paderborn.museum\0hjelmeland.no\0" +"priv.at\0" +"glass.museum\0plumbing\0" +"training\0compute.amazonaws.com.cn\0" +"*.yokohama.jp\0g\xc3\xa1\xc5\x8bgaviika.no\0" +"stj\xc3\xb8rdal.no\0v\xc3\xa5gs\xc3\xb8y.no\0" +"vlaanderen\0" +"rebun.hokkaido.jp\0cyon.site\0" +"hiraya.nagano.jp\0mlb\0hu.com\0" +"sakae.nagano.jp\0" +"kitashiobara.fukushima.jp\0" +"chernigov.ua\0" +"ce.leg.br\0" +"st.no\0lib.mo.us\0radio\0za.bz\0" +"engineer.aero\0matsuura.nagasaki.jp\0toyosato.shiga.jp\0" +"lib.ca.us\0" +"bunkyo.tokyo.jp\0\xd1\x80\xd1\x83\xd1\x81\0" +"sx.cn\0" +"cloudns.eu\0" +"keisen.fukuoka.jp\0webhop.me\0" +"mma\0" +"actor\0mls\0" +"karpacz.pl\0is-a-conservative.com\0" +"ninja\0" +"misasa.tottori.jp\0rightathome\0" +"id.ir\0sv.it\0" +"buyshouses.net\0" +"oceanographic.museum\0aurskog-holand.no\0" +"uonuma.niigata.jp\0" +"\xe9\xa3\x9e\xe5\x88\xa9\xe6\xb5\xa6\0" +"telefonica\0" +"monza-e-della-brianza.it\0snasa.no\0" +"kozagawa.wakayama.jp\0" +"kragero.no\0" +"isteingeek.de\0" +"sandiego.museum\0" +"agematsu.nagano.jp\0" +"kitahiroshima.hokkaido.jp\0toyonaka.osaka.jp\0" +"bergbau.museum\0" +"moe\0" +"trentino-suedtirol.it\0ralingen.no\0" +"jewelry.museum\0lenug.su\0" +"presse.ci\0" +"shirakawa.fukushima.jp\0takashima.shiga.jp\0moi\0wroc.pl\0" +"norton\0" +"mom\0" +"takino.hyogo.jp\0kviteseid.no\0waw.pl\0" +"google\0" +"dvrdns.org\0is-leet.com\0" +"market\0" +"co.ae\0" +"lenvik.no\0" , -"\xd0\xbe\xd0\xb1\xd1\x80.\xd1\x81\xd1\x80\xd0\xb1\0" -"kitahiroshima.hokkaido.jp\0" -"\xe9\x95\xb7\xe5\xb4\x8e.jp\0" -"student.aero\0kopervik.no\0hof.no\0" -"tula.ru\0" -"izumizaki.fukushima.jp\0" -"g\xc3\xa1ivuotna.no\0cc.tn.us\0" -"fyresdal.no\0bms\0media\0ryukyu\0" -"miyakonojo.miyazaki.jp\0" -"mosj\xc3\xb8""en.no\0nv.us\0bmw\0navy\0" -"iwakura.aichi.jp\0" -"\xe4\xbd\x9b\xe5\xb1\xb1\0" -"bnl\0" -"lib.wa.us\0" -"sabae.fukui.jp\0motosu.gifu.jp\0" -"z.bg\0" +"co.ag\0hanawa.fukushima.jp\0" +"gmina.pl\0" +"mov\0" +"kihoku.ehime.jp\0bir.ru\0cloudns.in\0" +"onna.okinawa.jp\0" +"bygland.no\0" +"far.br\0kongsberg.no\0" +"co.ao\0act.au\0id.lv\0" +"aetna\0" +"co.bb\0id.ly\0" +"co.at\0" +"nab\0" +"utashinai.hokkaido.jp\0" +"obama.nagasaki.jp\0elverum.no\0" +"co.bi\0ato.br\0soni.nara.jp\0" +"homelinux.com\0" +"omitama.ibaraki.jp\0" +"motobu.okinawa.jp\0cloudns.cc\0" +"fujisawa.kanagawa.jp\0boots\0co.ca\0" +"bauern.museum\0" +"nba\0" +"se.leg.br\0" +"co.bw\0lib.id.us\0starhub\0support\0" +"co.ci\0" +"tj.cn\0seki.gifu.jp\0" +"co.cl\0yuza.yamagata.jp\0" +"co.cm\0" +"scienceandhistory.museum\0" +"co.cr\0alesund.no\0from-va.com\0" +"abu.yamaguchi.jp\0" +"presse.fr\0shiriuchi.hokkaido.jp\0" +"storage\0" +"county.museum\0" +"no.it\0tula.su\0msd\0" +"yamanashi.jp\0bod\xc3\xb8.no\0" +"nagareyama.chiba.jp\0larvik.no\0co.cz\0" +"konyvelo.hu\0co.dk\0" +"from.hr\0laspezia.it\0" +"chuvashia.ru\0" +"m\xc3\xa5s\xc3\xb8y.no\0" +"sakata.yamagata.jp\0" +"kishiwada.osaka.jp\0synology.me\0" +"suli.hu\0sakai.ibaraki.jp\0pisz.pl\0" +"ally\0" +"susono.shizuoka.jp\0" +"komae.tokyo.jp\0" +"takasaki.gunma.jp\0" +"nature.museum\0" +"mtn\0" +"valle-daosta.it\0" +"black\0" +"mtr\0xerox\0" +"nec\0" +"tokyo.jp\0shimosuwa.nagano.jp\0hamaroy.no\0drud.us\0" +"nichinan.miyazaki.jp\0" +"championship.aero\0surnadal.no\0" +"jor.br\0ichiba.tokushima.jp\0" +"yandex\0" +"tsukuba.ibaraki.jp\0" +"sa.com\0" +"honefoss.no\0" +"biz.bb\0" +"museum.tt\0" +"lewismiller.museum\0biz.at\0" +"skierv\xc3\xa1.no\0\xd9\x85\xd9\x88\xd9\x82\xd8\xb9\0" +"co.gg\0net\0tula.ru\0" +"fhsk.se\0new\0" +"biz.az\0niimi.okayama.jp\0orland.no\0" +"co.gl\0shimane.shimane.jp\0silk\0" +"capetown\0" +"iwakuni.yamaguchi.jp\0" +"pordenone.it\0nfl\0" +"gifu.gifu.jp\0" +"sula.no\0" +"pointto.us\0" +"orskog.no\0porsanger.no\0" +"co.gy\0hemnes.no\0" +"ns.ca\0tonosho.kagawa.jp\0" +"realty\0" +"fujisato.akita.jp\0" +"comunica\xc3\xa7\xc3\xb5""es.museum\0" +"lib.ok.us\0" +"ngo\0sina\0" +"co.id\0" +"co.hu\0hiraizumi.iwate.jp\0mitoyo.kagawa.jp\0firmdale\0" +"toyota\0" +"inabe.mie.jp\0karelia.ru\0" +"cq.cn\0cc.wa.us\0" +"biz.cy\0" +"naoshima.kagawa.jp\0rzgw.gov.pl\0ck.ua\0" +"co.il\0iijima.nagano.jp\0biz.dk\0" +"co.im\0historicalsociety.museum\0" +"co.in\0nhk\0" +"numazu.shizuoka.jp\0\xd1\x81\xd1\x80\xd0\xb1\0observer\0" +"szczecin.pl\0ricoh\0" +"co.ir\0wodzislaw.pl\0" +"iida.nagano.jp\0zaporizhzhe.ua\0" +"co.it\0" +"co.je\0horonobe.hokkaido.jp\0" +"est-le-patron.com\0" +"\xe5\xb2\xa9\xe6\x89\x8b.jp\0karelia.su\0" +"atm.pl\0" +"is-a-doctor.com\0" +"kainan.tokushima.jp\0" +"himi.toyama.jp\0nm.us\0barrell-of-knowledge.info\0" +"utazu.kagawa.jp\0id.us\0\xe6\xb7\xa1\xe9\xa9\xac\xe9\x94\xa1\0" +"tomioka.gunma.jp\0russia.museum\0kutno.pl\0" +"tran\xc3\xb8y.no\0" +"co.jp\0lillehammer.no\0" +"minamiboso.chiba.jp\0" +"news.hu\0" +"group.aero\0" +"tochigi.tochigi.jp\0maritime.museum\0" +"biz.et\0net.eu.org\0" +"kibichuo.okayama.jp\0" +"management\0dyndns-home.com\0" +"ina.nagano.jp\0service.gov.uk\0" +"shriram\0" +"from-ar.com\0" +"co.kr\0" +"co.lc\0" +"wien\0" +"mukawa.hokkaido.jp\0bedzin.pl\0express\0" +"hokuto.hokkaido.jp\0" +"nakadomari.aomori.jp\0" +"frontdoor\0" +"amami.kagoshima.jp\0kisosaki.mie.jp\0" +"birdart.museum\0seljord.no\0" +"artgallery.museum\0" +"co.ma\0" +"co.ls\0dating\0reliance\0" +"mckinsey\0" +"obama.fukui.jp\0kaneyama.fukushima.jp\0co.me\0" +"omihachiman.shiga.jp\0co.mg\0" +"ushuaia.museum\0" +"morimachi.shizuoka.jp\0namdalseid.no\0" +"iwanuma.miyagi.jp\0limited\0" +"hellas.museum\0cloudns.us\0" +"co.na\0\xc3\xa5snes.no\0" +"yasuda.kochi.jp\0" "miharu.fukushima.jp\0" -"higashiyama.kyoto.jp\0" -"skierva.no\0" -"laspezia.it\0" +"nu.ca\0biz.id\0co.mu\0preservation.museum\0" +"amex\0" +"minamiise.mie.jp\0co.mw\0nerdpol.ovh\0" +"co.ni\0" +"co.mz\0gniezno.pl\0archi\0" +"lib.ny.us\0co.nl\0" +"a.bg\0co.no\0" +"res.aero\0aremark.no\0" +"air-traffic-control.aero\0aizumisato.fukushima.jp\0" +"exeter.museum\0priv.pl\0" "if.ua\0" -"himeshima.oita.jp\0" -"imb.br\0caravan\0" -"ct.it\0utashinai.hokkaido.jp\0" -"bom\0" -"pictet\0" -"boo\0" -"biella.it\0" -"gouv.km\0risor.no\0" -"bot\0" -"\xc3\xa5s.no\0gotdns.org\0" -"oskol.ru\0dyndns-blog.com\0" -"gokase.miyazaki.jp\0tonaki.okinawa.jp\0" -"salon\0" -"averoy.no\0press\0" -"halloffame.museum\0h\xc3\xa1""bmer.no\0" -"*.sendai.jp\0" -"oseto.nagasaki.jp\0" -"usantiques.museum\0" -"cab\0" -"download\0" -"nord-odal.no\0" -"unsa.ba\0museet.museum\0galsa.no\0gb.com\0" -"muko.kyoto.jp\0" -"zero\0" -"yasugi.shimane.jp\0cal\0" -"torino.museum\0" -"kami.kochi.jp\0gouv.ml\0" -"idv.tw\0cba\0network\0" -"yokawa.hyogo.jp\0car\0" -"cat\0" -"americana.museum\0e.se\0" -"vr.it\0" -"omi.niigata.jp\0" -"togane.chiba.jp\0toyako.hokkaido.jp\0" -"samara.ru\0" -"nakagawa.fukuoka.jp\0urasoe.okinawa.jp\0cbn\0" -"nordre-land.no\0" -"aquila.it\0gonohe.aomori.jp\0fukusaki.hyogo.jp\0" -"yodobashi\0" -"rimini.it\0sakaiminato.tottori.jp\0" -"plc.ly\0" -"erotica.hu\0" -"eurovision\0" -"jefferson.museum\0gs.bu.no\0" -"uki.kumamoto.jp\0augustow.pl\0" -"gs.ol.no\0sexy\0" -"v\xc3\xa5ler.\xc3\xb8stfold.no\0" -"ayase.kanagawa.jp\0" -"vard\xc3\xb8.no\0" -"recipes\0" -"varese.it\0asahi.mie.jp\0" -"yuzhno-sakhalinsk.ru\0" -"pr.it\0nango.fukushima.jp\0" -"oharu.aichi.jp\0wakasa.fukui.jp\0" -"avianca\0" -"govt.nz\0" -"ruovat.no\0" -"kujukuri.chiba.jp\0" -"weather\0" -"ut.us\0" -"odawara.kanagawa.jp\0" -"shriram\0" -"niiza.saitama.jp\0" -"siljan.no\0" -"ae.org\0" -"latina.it\0iwamizawa.hokkaido.jp\0" -"itami.hyogo.jp\0" -"stange.no\0ceo\0" -"gifu.jp\0yamato.fukushima.jp\0toyo.kochi.jp\0" -"cfa\0" -"kamakura.kanagawa.jp\0" -"cfd\0" -"otago.museum\0" -"baghdad.museum\0" -"buy\0" -"vicenza.it\0" -"ip6.arpa\0" -"skedsmo.no\0l.se\0" -"okinawa.jp\0marugame.kagawa.jp\0" -"\xc3\xb8yer.no\0" -"aukra.no\0" -"luzern.museum\0" -"mihama.mie.jp\0" -"fukushima.hokkaido.jp\0kembuchi.hokkaido.jp\0\xe6\x85\x88\xe5\x96\x84\0" -"gsm.pl\0" -"savannahga.museum\0" -"sanjo.niigata.jp\0\xd8\xb9\xd9\x85\xd8\xa7\xd9\x86\0" -"lesja.no\0vik.no\0" -"minamiizu.shizuoka.jp\0" -"tran\xc3\xb8y.no\0" -"lgbt\0" -"joshkar-ola.ru\0" -"hemsedal.no\0sarpsborg.no\0" -"gob.ar\0calabria.it\0kurashiki.okayama.jp\0" -"irkutsk.ru\0" -"osaki.miyagi.jp\0ginowan.okinawa.jp\0neustar\0" -"higashinaruse.akita.jp\0taketa.oita.jp\0nagatoro.saitama.jp\0" -"ventures\0from-mo.com\0" -"mishima.shizuoka.jp\0" -"vaga.no\0" -"sano.tochigi.jp\0" -"k12.in.us\0" -"gob.bo\0partners\0" -"mediocampidano.it\0kumakogen.ehime.jp\0" -"dyr\xc3\xb8y.no\0lier.no\0groks-this.info\0" -"tsuruta.aomori.jp\0" -"tosu.saga.jp\0office-on-the.net\0" -"bzh\0" -"grong.no\0" -"attorney\0" -"oji.nara.jp\0" -"gob.cl\0" -"froland.no\0meloy.no\0" -"taranto.it\0uk.net\0" -"\xe8\x8c\xa8\xe5\x9f\x8e.jp\0" -"school.museum\0cc.il.us\0" -"s.se\0" -"marketplace.aero\0plc.uk\0" -"ontario.museum\0" -"ranzan.saitama.jp\0" -"ct.us\0" -"memorial\0" -"gob.do\0media.hu\0lib.ks.us\0" -"reise\0" -"horonobe.hokkaido.jp\0" -"gob.ec\0" -"yamal.ru\0" -"yamato.kanagawa.jp\0" -"dr.na\0" -"spydeberg.no\0" -"zgora.pl\0" -"verona.it\0" -"gob.es\0" -"jeju.kr\0" -"chiropractic.museum\0doomdns.com\0" -"kozaki.chiba.jp\0" -"monza-brianza.it\0isen.kagoshima.jp\0glogow.pl\0" -"uchiko.ehime.jp\0yasu.shiga.jp\0" -"sandvik\0eu-west-1.compute.amazonaws.com\0" -"suedtirol.it\0czest.pl\0" -"kashiba.nara.jp\0yuza.yamagata.jp\0" -"tondabayashi.osaka.jp\0toyama.toyama.jp\0" -"\xe6\x95\x8e\xe8\x82\xb2.hk\0k12.vt.us\0" -"astrakhan.ru\0nfshost.com\0" -"!city.kobe.jp\0\xd1\x81\xd0\xb0\xd0\xb9\xd1\x82\0" -"enebakk.no\0" -"travel\0" -"sandiego.museum\0yokohama\0" -"valleeaoste.it\0parma.it\0kochi.jp\0kunohe.iwate.jp\0" -"izumisano.osaka.jp\0szczecin.pl\0" -"sellsyourhome.org\0" -"gob.gt\0" -"dyndns-remote.com\0" -"pippu.hokkaido.jp\0" -"com\0z.se\0is-a-bookkeeper.com\0" -"kotohira.kagawa.jp\0" -"is-found.org\0" -"gob.hn\0radom.pl\0" -"christiansburg.museum\0" -"tomigusuku.okinawa.jp\0swiebodzin.pl\0" -"bihoro.hokkaido.jp\0minato.osaka.jp\0" -"firenze.it\0" -"pr.us\0" -"takanabe.miyazaki.jp\0" -"jinsekikogen.hiroshima.jp\0" +"cc.la.us\0infiniti\0site\0" +"blogspot.com\0" +"yamato.fukushima.jp\0" +"co.nz\0" +"iiyama.nagano.jp\0" +"botanicgarden.museum\0co.om\0" +"minoh.osaka.jp\0gs.aa.no\0" +"for-our.info\0" +"ogimi.okinawa.jp\0" +"usarts.museum\0nextdirect\0" +"oi.kanagawa.jp\0" +"university.museum\0museum.mv\0\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86\0" +"pharmacien.fr\0museum.mw\0andoy.no\0pictures\0taifun-dns.de\0" +"delta\0" +"newhampshire.museum\0" +"biz.ki\0" +"rec.br\0co.pl\0" +"puglia.it\0" +"co.pn\0" +"nanyo.yamagata.jp\0museum.no\0" +"nikaho.akita.jp\0" +"handa.aichi.jp\0" +"priv.no\0co.pw\0" +"rec.co\0herokussl.com\0" +"mo\xc3\xa5reke.no\0now\0viajes\0go.leg.br\0" +"okayama.okayama.jp\0museum.om\0" +"wiki\0" +"aguni.okinawa.jp\0" "computer.museum\0" -"dad\0" -"kikuchi.kumamoto.jp\0sakura.tochigi.jp\0" +"jp.eu.org\0" +"k12.al.us\0club\0" +"ozu.kumamoto.jp\0" +"og.ao\0" +"hayashima.okayama.jp\0" +"karasjohka.no\0" +"co.rs\0" +"usdecorativearts.museum\0nra\0" +"wajima.ishikawa.jp\0" +"yahaba.iwate.jp\0biz.mv\0co.rw\0" +"biz.mw\0" +"zama.kanagawa.jp\0kr.com\0" +"biz.ni\0" +"malvik.no\0obi\0" +"priv.me\0" +"ujitawara.kyoto.jp\0malselv.no\0orsta.no\0doctor\0" +"matsushige.tokushima.jp\0" +"biz.nr\0" +"co.st\0" +"dance\0" +"yoshida.saitama.jp\0" +"co.th\0" +"kamisunagawa.hokkaido.jp\0from-ri.com\0" +"c.bg\0co.sz\0co.tj\0nrw\0" +"wine\0" +"co.tm\0" +"cc.ks.us\0co.ua\0" +"sicilia.it\0catering\0" +"okegawa.saitama.jp\0" +"elk.pl\0co.tt\0" +"assisi.museum\0nagoya\0" +"kiho.mie.jp\0" +"tn.it\0co.ug\0" +"nu.it\0" +"ismaili\0" +"cs.it\0co.tz\0" +"co.uk\0" +"decorativearts.museum\0naumburg.museum\0biz.pk\0" +"botanicalgarden.museum\0biz.pl\0" +"computer\0" +"\xe6\x95\x99\xe8\x82\xb2.hk\0" +"stuff-4-sale.us\0" +"biz.pr\0co.us\0" +"co.ve\0caravan\0" +"ntt\0" +"co.vi\0" +"toyo.kochi.jp\0co.uz\0" +"izumozaki.niigata.jp\0sel.no\0" +"uzs.gov.pl\0" +"quebec.museum\0" +"funagata.yamagata.jp\0" +"yoka.hyogo.jp\0" +"brand.se\0" +"ryokami.saitama.jp\0dscloud.mobi\0" +"uy.com\0" +"trentino-aadige.it\0ide.kyoto.jp\0saarland\0" +"off\0" +"aland.fi\0" +"rocks\0" +"slask.pl\0" +"nore-og-uvdal.no\0" +"semboku.akita.jp\0" +"k\xc3\xa1r\xc3\xa1\xc5\xa1johka.no\0" +"\xd8\xa7\xd9\x84\xd8\xb9\xd9\x84\xd9\x8a\xd8\xa7\xd9\x86\0" +"chijiwa.nagasaki.jp\0" +"eastafrica.museum\0radom.pl\0" +"motegi.tochigi.jp\0" +"aya.miyazaki.jp\0ariake.saga.jp\0spy.museum\0" +"shinagawa.tokyo.jp\0" +"utsunomiya.tochigi.jp\0" +"higashi.fukuoka.jp\0izumi.kagoshima.jp\0solund.no\0" +"kagoshima.kagoshima.jp\0" +"homelinux.net\0" +"cloudns.pw\0" +"olbia-tempio.it\0" +"from-ms.com\0from-nc.com\0" +"soccer\0" +"biz.tj\0" +"egersund.no\0yuzhno-sakhalinsk.ru\0" +"science.museum\0" +"bryne.no\0paroch.k12.ma.us\0" +"s3.eu-central-1.amazonaws.com\0" +"co.za\0" +"biz.ua\0" +"yoro.gifu.jp\0biz.tr\0" +"spydeberg.no\0" +"e.bg\0biz.tt\0" +"nyc\0" +"conf.au\0" +"cleaning\0" +"yuki.ibaraki.jp\0" +"cc.fl.us\0co.zm\0" +"wellbeingzone.eu\0" +"tp.it\0" +"og.it\0" +"parliament.nz\0" +"gmbh\0" +"ando.nara.jp\0" +"\xe6\x95\x8e\xe8\x82\xb2.hk\0" +"biz.vn\0" +"rec.nf\0" +"jerusalem.museum\0selfip.biz\0" +"azumino.nagano.jp\0grimstad.no\0" +"kamikawa.hyogo.jp\0wiih.gov.pl\0" +"olbiatempio.it\0" +"sango.nara.jp\0" +"store\0" +"notaires.km\0" +"inuyama.aichi.jp\0" +"is-gone.com\0" +"shakotan.hokkaido.jp\0" +"\xe5\x8c\x97\xe6\xb5\xb7\xe9\x81\x93.jp\0" +"jus.br\0fhapp.xyz\0" +"rovigo.it\0yamagata.jp\0" +"reg.dk\0" +"k12.vt.us\0" +"kamitonda.wakayama.jp\0turystyka.pl\0" +"children.museum\0" +"c.la\0" +"kyiv.ua\0" +"weatherchannel\0" +"okinawa.okinawa.jp\0" +"lotte\0" +"in.na\0" +"ivgu.no\0from-nj.com\0" +"basketball\0" +"is-a-hunter.com\0" +"imageandsound.museum\0" +"lotto\0one\0" +"in.ni\0osen.no\0" +"ong\0" +"krodsherad.no\0" +"lib.tx.us\0" +"a.se\0" +"arita.saga.jp\0biz.zm\0" +"kamishihoro.hokkaido.jp\0onl\0lib.de.us\0" +"g.bg\0omigawa.chiba.jp\0" +"nagaoka.niigata.jp\0" +"belgorod.ru\0" +"cc.wi.us\0neustar\0" +"fuoisku.no\0" +"namegata.ibaraki.jp\0" +"sakahogi.gifu.jp\0takahagi.ibaraki.jp\0rec.ro\0" +"omura.nagasaki.jp\0" +"tokigawa.saitama.jp\0" +"tr.it\0hoteles\0" +"hanamigawa.chiba.jp\0" +"mortgage\0" +"ooo\0" +"eu.org\0" +"tn.us\0" +"il.us\0rodeo\0" +"dc.us\0shouji\0" +"tamatsukuri.ibaraki.jp\0" +"blogspot.co.at\0" +"caa.aero\0" +"ski.no\0" +"steiermark.museum\0" +"civilization.museum\0" +"blogspot.vn\0" +"kitagata.gifu.jp\0utsira.no\0" +"ono.fukui.jp\0imdb\0" +"lefrak\0*.githubcloudusercontent.com\0" +"fukuchiyama.kyoto.jp\0cloudns.info\0" +"symantec\0" +"giving\0" +"firestone\0quest\0" +"tjmaxx\0" +"shintomi.miyazaki.jp\0" +"org\0" +"grozny.su\0pay\0" +"floro.no\0" +"rec.ve\0" +"it.ao\0" +"tv.bb\0" +"biev\xc3\xa1t.no\0in.rs\0" +"takahama.fukui.jp\0" +"ebiz.tw\0chirurgiens-dentistes-en-france.fr\0" +"higashikawa.hokkaido.jp\0" +"wallonie.museum\0dovre.no\0" +"lipetsk.ru\0" +"tv.bo\0\xd1\x83\xd0\xba\xd1\x80\0" +"broker.aero\0skin\0" +"tv.br\0" +"fredrikstad.no\0hobby-site.org\0" +"sano.tochigi.jp\0" +"arezzo.it\0q-a.eu.org\0" +"metlife\0" +"gokase.miyazaki.jp\0tr.no\0aurland.no\0c.se\0in.th\0" +"lib.dc.us\0" +"i.bg\0" +"is-a-cubicle-slave.com\0blogspot.re\0" +"akune.kagoshima.jp\0" +"gucci\0from-wv.com\0js.org\0" +"tt.im\0in.ua\0" +"cc.ky.us\0" +"matsudo.chiba.jp\0kiwa.mie.jp\0e-burg.ru\0" +"viking\0" +"ott\0" +"ud.it\0blogspot.ro\0" +"karate.museum\0royrvik.no\0" +"prochowice.pl\0warmia.pl\0smart\0" +"nanbu.tottori.jp\0" +"hino.tottori.jp\0americana.museum\0grozny.ru\0blogspot.rs\0" +"erotica.hu\0trentinoalto-adige.it\0" +"blogspot.ru\0blogspot.se\0" +"steinkjer.no\0blogspot.sg\0" +"blogspot.si\0" +"vgs.no\0in.us\0" +"wzmiuw.gov.pl\0de.us\0blogspot.sk\0" +"chippubetsu.hokkaido.jp\0" +"\xe7\xbd\x91\xe7\xb5\xa1.hk\0pet\0blogspot.sn\0" +"\xe9\xb3\xa5\xe5\x8f\x96.jp\0drobak.no\0" +"ovh\0" +"za.com\0blogspot.td\0" +"ichinomiya.chiba.jp\0ikata.ehime.jp\0yuasa.wakayama.jp\0" +"degree\0" +"takasu.hokkaido.jp\0herokuapp.com\0" +"miners.museum\0" +"fukuoka.jp\0moriguchi.osaka.jp\0lodingen.no\0" +"selje.no\0" +"trentinoaadige.it\0minowa.nagano.jp\0rnrt.tn\0" +"mat.br\0verran.no\0" +"is.eu.org\0" +"bar.pro\0" +"cards\0" +"friulivgiulia.it\0cdn77-ssl.net\0" +"kawakami.nagano.jp\0blogspot.co.id\0" +"epilepsy.museum\0blogspot.tw\0blogspot.ug\0" +"schule\0\xe7\x82\xb9\xe7\x9c\x8b\0" +"aizuwakamatsu.fukushima.jp\0" +"isla.pr\0capitalone\0selfip.com\0" +"hornindal.no\0tychy.pl\0" +"blogspot.co.il\0" +"yachiyo.ibaraki.jp\0phd\0" +"nara.nara.jp\0redstone\0" +"iglesias-carbonia.it\0blogspot.mr\0" +"osakikamijima.hiroshima.jp\0kimino.wakayama.jp\0" +"kids.us\0no.com\0" +"mar.it\0" +"mochizuki.nagano.jp\0" +"blogspot.mx\0" +"blogspot.my\0" +"terni.it\0tra.kp\0" +"casino\0blogspot.nl\0" +"kmpsp.gov.pl\0" +"pid\0" +"blogspot.no\0" +"tatsuno.hyogo.jp\0" +"it.eu.org\0" +"sakura.tochigi.jp\0staples\0from-oh.com\0" +"pin\0" +"cymru\0dynalias.net\0" +"togane.chiba.jp\0e.se\0" +"klepp.no\0" +"k.bg\0" +"inazawa.aichi.jp\0" +"moss.no\0" +"khabarovsk.ru\0" +"tv.im\0" +"blogspot.pe\0" +"forde.no\0so.gov.pl\0website\0" +"space-to-rent.com\0" +"indianmarket.museum\0\xd1\x81\xd0\xb0\xd0\xb9\xd1\x82\0" +"tv.it\0" +"tobe.ehime.jp\0" +"aisai.aichi.jp\0hinode.tokyo.jp\0v\xc3\xa1rgg\xc3\xa1t.no\0us-west-1.compute.amazonaws.com\0" +"miyagi.jp\0delaware.museum\0" +"aerodrome.aero\0immo\0" +"ollo\0blogspot.qa\0" +"ny.us\0blogspot.pt\0" +"hatsukaichi.hiroshima.jp\0kvinesdal.no\0" +"kalmykia.su\0" +"nishigo.fukushima.jp\0" "otsu.shiga.jp\0" -"larvik.no\0\xd0\xb0\xd0\xba.\xd1\x81\xd1\x80\xd0\xb1\0" -"berg.no\0cc.dc.us\0" -"tateyama.toyama.jp\0" -"is-an-actor.com\0" -"rg.it\0" -"kep.tr\0from-la.net\0" -"ln.cn\0" -"from-wv.com\0is-a-hunter.com\0" -"day\0" -"kokonoe.oita.jp\0" -"wi.us\0" -"schmidt\0" -"6.bg\0portland.museum\0k12.wa.us\0" -"crs\0csc\0" -"groundhandling.aero\0cahcesuolo.no\0" -"francaise.museum\0dyndns-free.com\0" -"media.pl\0" -"dr.tr\0b.ssl.fastly.net\0" -"everbank\0" -"kitakata.fukushima.jp\0" -"montblanc\0" -"tanohata.iwate.jp\0nishi.osaka.jp\0reisen\0" -"rindal.no\0hamburg\0" -"koriyama.fukushima.jp\0ena.gifu.jp\0" -"foundation.museum\0" -"axis.museum\0" -"helsinki.museum\0cc.wa.us\0myphotos.cc\0" -"vic.edu.au\0" -"cloudapp.net\0" -"yamaxun\0" -"trading\0" -"viterbo.it\0lg.jp\0ise.mie.jp\0" -"lillesand.no\0" -"lib.me.us\0" -"okoppe.hokkaido.jp\0oyodo.nara.jp\0" -"shinshinotsu.hokkaido.jp\0tobetsu.hokkaido.jp\0" -"magadan.ru\0tennis\0" -"\xe5\xba\x83\xe5\xb3\xb6.jp\0mobara.chiba.jp\0" -"ltd.co.im\0" -"fet.no\0elb.amazonaws.com\0" -"kamikawa.hyogo.jp\0sango.nara.jp\0gob.mx\0" -"alta.no\0" -"sowa.ibaraki.jp\0" -"g\xc3\xa1\xc5\x8bgaviika.no\0" -"tattoo\0" -"fg.it\0konan.shiga.jp\0" -"off.ai\0country\0" -"dev\0" -"rn.it\0samukawa.kanagawa.jp\0" -"baidu\0" -"port.fr\0carbonia-iglesias.it\0miyoshi.tokushima.jp\0tabuse.yamaguchi.jp\0sosnowiec.pl\0adult\0" -"in-addr.arpa\0gran.no\0" -"gob.pa\0serveftp.org\0" -"hidaka.hokkaido.jp\0" -"nesseby.no\0" -"satosho.okayama.jp\0" -"gob.pe\0" -"flights\0" -"andriabarlettatrani.it\0" -"nagato.yamaguchi.jp\0host\0" -"nes.akershus.no\0gob.pk\0dvrdns.org\0" -"miyota.nagano.jp\0" -"embroidery.museum\0karasjohka.no\0" -"from-ky.com\0" -"trieste.it\0ashoro.hokkaido.jp\0" -"dealer\0" -"saigawa.fukuoka.jp\0" -"spiegel\0" -"atlanta.museum\0romskog.no\0" -"l\xc3\xa4ns.museum\0evje-og-hornnes.no\0" -"valled-aosta.it\0karasuyama.tochigi.jp\0" -"ing.pa\0" -"siracusa.it\0minano.saitama.jp\0" -"isahaya.nagasaki.jp\0hagi.yamaguchi.jp\0" -"!city.kitakyushu.jp\0uto.kumamoto.jp\0forex\0" -"murayama.yamagata.jp\0virgin\0" -"norddal.no\0cherkasy.ua\0codes\0" -"misato.saitama.jp\0" -"\xd9\x85\xd9\x88\xd9\x82\xd8\xb9\0" -"iwata.shizuoka.jp\0" -"tjome.no\0mango\0" -"greta.fr\0" -"eu.int\0minokamo.gifu.jp\0oi.kanagawa.jp\0" -"accident-prevention.aero\0" +"r\xc3\xb8mskog.no\0" +"gyokuto.kumamoto.jp\0" +"lifeinsurance\0" +"games.hu\0kotohira.kagawa.jp\0" +"brumunddal.no\0" +"blogspot.is\0" +"blogspot.it\0" +"civilisation.museum\0" +"saijo.ehime.jp\0" +"nishinomiya.hyogo.jp\0" +"kuzumaki.iwate.jp\0stor-elvdal.no\0" +"blogspot.jp\0" +"in.eu.org\0" +"solutions\0" +"s\xc3\xb8rum.no\0" +"sekikawa.niigata.jp\0comcast\0" +"fnd.br\0kitaakita.akita.jp\0nakanoto.ishikawa.jp\0" +"hof.no\0withyoutube.com\0" +"store.nf\0pnc\0" +"cechire.com\0" +"mikawa.yamagata.jp\0blogspot.kr\0" +"kalmykia.ru\0" +"shikatsu.aichi.jp\0tv.na\0" +"niepce.museum\0" +"blogspot.li\0" "hirokawa.fukuoka.jp\0" -"kainan.tokushima.jp\0" -"gob.sv\0" -"gub.uy\0" -"black\0" -"noda.chiba.jp\0" -"tanagura.fukushima.jp\0abu.yamaguchi.jp\0" +"balestrand.no\0" +"realestate\0" +"faith\0" +"hk.com\0" +"saves-the-whales.com\0" +"kawaguchi.saitama.jp\0blogspot.lt\0blogspot.md\0" +"g.se\0blogspot.lu\0" +"lib.co.us\0" +"m.bg\0" +"is-a-lawyer.com\0" +"blogspot.mk\0" +"tamba.hyogo.jp\0" +"bosch\0" +"moka.tochigi.jp\0cc.ak.us\0autos\0br.com\0from-ut.com\0" +"i.ng\0" +"ushistory.museum\0" +"nanmoku.gunma.jp\0pruszkow.pl\0" +"kokonoe.oita.jp\0" +"woodside\0" +"jondal.no\0blogspot.fi\0" +"lahppi.no\0" +"naturalsciences.museum\0" +"ok.us\0" +"utazas.hu\0" +"hachijo.tokyo.jp\0googlecode.com\0" +"trading\0blogspot.fr\0" +"tsubetsu.hokkaido.jp\0creation.museum\0risor.no\0nyc.mn\0" +"!city.nagoya.jp\0" +"field.museum\0" +"servequake.com\0" +"sex.hu\0fujitsu\0" "is-a-painter.com\0" -"ikeda.hokkaido.jp\0" -"mitoyo.kagawa.jp\0" -"gausdal.no\0" -"kvafjord.no\0" -"philadelphiaarea.museum\0santafe.museum\0cruises\0" -"ringerike.no\0" -"ven.it\0kamisato.saitama.jp\0przeworsk.pl\0" -"\xe7\x82\xb9\xe7\x9c\x8b\0" -"ask\xc3\xb8y.no\0" -"suli.hu\0is-an-accountant.com\0" -"lu.it\0me.it\0\xe7\xa7\xbb\xe5\x8a\xa8\0" -"flanders.museum\0" -"anquan\0" -"s\xc3\xb8rreisa.no\0" -"gob.ve\0" -"treviso.it\0" -"crew.aero\0" -"jaguar\0" -"barlettatraniandria.it\0happou.akita.jp\0" -"annefrank.museum\0is-a-bulls-fan.com\0" -"medecin.km\0jamal.ru\0dyndns-mail.com\0" -"toyota.aichi.jp\0" -"\xe6\x9c\xba\xe6\x9e\x84\0" -"muos\xc3\xa1t.no\0" -"monzaebrianza.it\0" -"lg.ua\0" -"dnp\0" -"archaeological.museum\0" -"ichikawa.chiba.jp\0kami.miyagi.jp\0" -"media.museum\0" -"ge.it\0unnan.shimane.jp\0walbrzych.pl\0" -"namdalseid.no\0dog\0" -"australia.museum\0\xe3\x82\xb0\xe3\x83\xbc\xe3\x82\xb0\xe3\x83\xab\0" -"shop.ht\0ascolipiceno.it\0" -"trading.aero\0shop.hu\0tr\xc3\xa6na.no\0" -"wroc.pl\0" -"kharkiv.ua\0" -"slattum.no\0" -"zj.cn\0" -"amursk.ru\0" -"miyazaki.jp\0nishinoomote.kagoshima.jp\0" -"\xe0\xae\x87\xe0\xae\xa8\xe0\xaf\x8d\xe0\xae\xa4\xe0\xae\xbf\xe0\xae\xaf\xe0\xae\xbe\0" -"ora.gunma.jp\0" -"chattanooga.museum\0naturalhistorymuseum.museum\0uhren.museum\0" -"emilia-romagna.it\0\xe9\xa6\x99\xe5\xb7\x9d.jp\0" -"spb.ru\0" -"kiso.nagano.jp\0" -"gop.pk\0vote\0" -"krokstadelva.no\0leitungsen.de\0" -"ogi.saga.jp\0" -"broker.aero\0" -"asaka.saitama.jp\0" -"dnipropetrovsk.ua\0" -"minamiechizen.fukui.jp\0kagamiishi.fukushima.jp\0" -"voto\0" -"ostroda.pl\0" -"noheji.aomori.jp\0stalowa-wola.pl\0" -"jolster.no\0" -"iijima.nagano.jp\0" -"blog.br\0gs.cn\0tainai.niigata.jp\0kouzushima.tokyo.jp\0cheap\0" -"kharkov.ua\0cc.wv.us\0" -"s3-website-us-gov-west-1.amazonaws.com\0" -"tj.cn\0onagawa.miyagi.jp\0" -"naples.it\0miyako.iwate.jp\0yaita.tochigi.jp\0eat\0" -"nord-aurdal.no\0servegame.org\0" -"money\0blogdns.org\0" -"lib.mn.us\0" -"aoste.it\0" -"westfalen.museum\0" -"kasaoka.okayama.jp\0" -"bc.ca\0" -"shia\0" -"*.kawasaki.jp\0" -"skodje.no\0" -"\xe7\x86\x8a\xe6\x9c\xac.jp\0" -"varoy.no\0" -"kaga.ishikawa.jp\0cloudfront.net\0" -"ss.it\0" -"shimane.jp\0ryokami.saitama.jp\0yamanakako.yamanashi.jp\0durban\0" -"randaberg.no\0" -"jobs.tt\0" -"bjugn.no\0z-2.compute-1.amazonaws.com\0" -"futaba.fukushima.jp\0" -"kms.ru\0" -"zamami.okinawa.jp\0" -"laquila.it\0" +"kherson.ua\0" +"minato.osaka.jp\0abbvie\0" +"otsuki.yamanashi.jp\0circle\0blogspot.gr\0" +"i.ph\0" +"muenchen.museum\0" +"pro\0" +"us-east-1.amazonaws.com\0blogspot.hk\0" +"oshu.iwate.jp\0" +"pru\0richardli\0" +"k12.ri.us\0" +"blogspot.hr\0" +"blogspot.hu\0blogspot.ie\0" +"institute\0" +"clothing\0" +"berkeley.museum\0cipriani\0" +"tv.sd\0" +"rodoy.no\0" +"homelinux.org\0blogspot.co.uk\0" +"ssl.origin.cdn77-secure.org\0blogspot.in\0" +"info\0conf.lv\0" +"blogspot.ba\0" +"aibetsu.hokkaido.jp\0blogspot.be\0" +"adv.br\0sr.gov.pl\0\xe5\xb7\xa5\xe8\xa1\x8c\0" +"blogspot.bg\0" +"blogspot.bj\0" +"pub\0" +"fujimi.saitama.jp\0from-tn.com\0" +"friulivenezia-giulia.it\0" +"i.se\0" +"blogspot.ca\0" +"health.museum\0poker\0" +"o.bg\0steam.museum\0" +"fuossko.no\0" +"berlevag.no\0" +"giske.no\0blogspot.cf\0" +"tomigusuku.okinawa.jp\0ashikaga.tochigi.jp\0tv.tr\0for-the.biz\0blogspot.ch\0" +"stavanger.no\0" +"store.ve\0blogspot.cl\0" +"abeno.osaka.jp\0town.museum\0" +"mashiko.tochigi.jp\0" +"tv.tz\0is-a-geek.com\0" +"pa.it\0progressive\0" +"orkdal.no\0" +"torino.museum\0" +"notaires.fr\0corporation.museum\0otago.museum\0blogspot.de\0" +"chase\0blogspot.cv\0" +"blogspot.cz\0" +"blogspot.dk\0" +"parliament.cy\0bridgestone\0" +"pwc\0dyndns-at-home.com\0" +"essex.museum\0" +"inzai.chiba.jp\0oita.oita.jp\0" +"ringsaker.no\0" +"genova.it\0" +"radoy.no\0" +"supplies\0" +"hamburg\0" +"\xe4\xb8\xad\xe6\x96\x87\xe7\xbd\x91\0" +"holtalen.no\0" +"kimobetsu.hokkaido.jp\0" +"virtuel.museum\0" +"skiptvet.no\0" +"kinko.kagoshima.jp\0sakhalin.ru\0" +"komagane.nagano.jp\0" +"finnoy.no\0homesecuritypc.com\0" +"k12.az.us\0point2this.com\0" +"florida.museum\0\xd0\xbe\xd1\x80\xd0\xb3.\xd1\x81\xd1\x80\xd0\xb1\0" +"sex.pl\0" +"cloudns.club\0" +"blogspot.co.ke\0" +"uk.net\0" +"minamiawaji.hyogo.jp\0" +"habmer.no\0" +"\xd8\xa7\xd9\x84\xd9\x8a\xd9\x85\xd9\x86\0" +"pe.ca\0oregon.museum\0mutual\0flynnhub.com\0" +"ug.gov.pl\0store.ro\0" +"udine.it\0" +"*.nom.br\0" +"lib.tn.us\0" +"iz.hr\0k.se\0" +"q.bg\0" +"luzern.museum\0mobile\0" +"jl.cn\0" +"clinton.museum\0" +"cc.ma.us\0blogspot.ae\0" +"kanie.aichi.jp\0" +"building.museum\0" +"gs.rl.no\0store.st\0" +"pc.it\0pub.sa\0cool\0blogspot.al\0" +"podzone.net\0blogspot.am\0myds.me\0" +"coop\0ogawa.saitama.jp\0gulen.no\0" +"matsumae.hokkaido.jp\0public.museum\0" +"sweden.museum\0" "mobily\0" -"club\0" -"edu\0" -"a.prod.fastly.net\0" -"tamatsukuri.ibaraki.jp\0" -"kamoenai.hokkaido.jp\0" -"f\xc3\xb8rde.no\0" -"al.it\0" -"ube.yamaguchi.jp\0" -"ms.it\0" -"higashiagatsuma.gunma.jp\0" -"pacific.museum\0" -"gz.cn\0" -"dyndns.org\0" -"otari.nagano.jp\0" +"tx.us\0" +"lyngen.no\0" +"shibetsu.hokkaido.jp\0" +"slg.br\0" +"trentinosud-tirol.it\0" +"halden.no\0" +"shiiba.miyazaki.jp\0" +"kartuzy.pl\0vision\0dsmynas.com\0" +"holiday\0" +"sanda.hyogo.jp\0" +"kaita.hiroshima.jp\0" +"photography.museum\0" +"blogspot.co.nz\0" +"askoy.no\0" +"iglesiascarbonia.it\0bjark\xc3\xb8y.no\0" +"sera.hiroshima.jp\0hidaka.hokkaido.jp\0" +"uozu.toyama.jp\0cpa.pro\0" +"omasvuotna.no\0" +"mragowo.pl\0consulting\0" +"\xe5\x85\xab\xe5\x8d\xa6\0" +"rehab\0" +"air.museum\0hol.no\0" +"privatizehealthinsurance.net\0" +"shop.ht\0" +"shop.hu\0" +"\xe6\x94\xbf\xe5\x8a\xa1\0" +"nsupdate.info\0" +"africa\0" +"sklep.pl\0" +"zaporizhzhia.ua\0" +"montblanc\0" +"adv.mz\0" +"koshigaya.saitama.jp\0m\xc4\x81ori.nz\0odessa.ua\0" +"brunel.museum\0s3.amazonaws.com\0" +"lillesand.no\0jaworzno.pl\0" +"m.se\0panasonic\0" +"oishida.yamagata.jp\0lib.in.us\0" +"s.bg\0sciences.museum\0" +"is-a-geek.org\0" +"force.museum\0spacekit.io\0" +"frei.no\0dnepropetrovsk.ua\0police.uk\0" +"nisshin.aichi.jp\0" +"katsuura.chiba.jp\0" +"jgora.pl\0" +"in.net\0" +"pe.it\0taku.saga.jp\0" +"isleofman.museum\0" +"lixil\0" +"hyogo.jp\0" +"pa.us\0" +"campidanomedio.it\0" +"pc.pl\0" +"yakumo.shimane.jp\0" +"flickr\0" +"ibara.okayama.jp\0" +"lexus\0" +"taito.tokyo.jp\0" +"\xd0\xbe\xd0\xb4.\xd1\x81\xd1\x80\xd0\xb1\0hitachi\0" +"cranbrook.museum\0khakassia.ru\0" +"setagaya.tokyo.jp\0" +"pe.kr\0voss.no\0" +"res.in\0williamsburg.museum\0cuisinella\0" +"toshima.tokyo.jp\0" +"ancona.it\0koga.ibaraki.jp\0gold\0" +"barclaycard\0directory\0" +"golf\0" +"omotego.fukushima.jp\0" +"gifts\0" +"maori.nz\0" +"tarumizu.kagoshima.jp\0" +"khakassia.su\0" +"valdaosta.it\0" +"melhus.no\0" +"analytics\0" +"stream\0" +"wazuka.kyoto.jp\0" +"warabi.saitama.jp\0" +"red\0" +"trani-barletta-andria.it\0nsn.us\0" +"hokuryu.hokkaido.jp\0" +"iyo.ehime.jp\0" +"freight.aero\0agrigento.it\0" +"futsu.nagasaki.jp\0" +"ericsson\0mitsubishi\0ren\0" +"iizuka.fukuoka.jp\0" +"karlsoy.no\0" +"vladikavkaz.ru\0" +"sandnes.no\0qvc\0" +"o.se\0webhop.biz\0" +"ashiya.hyogo.jp\0h\xc3\xa5.no\0" +"familyds.com\0" +"u.bg\0lesja.no\0" +"basel.museum\0pagefrontapp.com\0" +"jewishart.museum\0" +"vic.au\0" +"gda.pl\0" +"towada.aomori.jp\0cc.me.us\0" +"vladikavkaz.su\0" +"cc.as.us\0goog\0" +"online.museum\0" +"doomdns.org\0" +"lamborghini\0is-an-actress.com\0" +"pg.it\0bialystok.pl\0" +"enna.it\0kunitomi.miyazaki.jp\0" +"hakodate.hokkaido.jp\0*.kunden.ortsinfo.at\0" +"es.leg.br\0" +"friuli-veneziagiulia.it\0mimata.miyazaki.jp\0blogspot.co.za\0" +"health-carereform.com\0" +"reggio-calabria.it\0museum\0\xe5\x85\xac\xe5\x8f\xb8\0" +"dielddanuorri.no\0" +"perugia.it\0" +"takikawa.hokkaido.jp\0" +"laquila.it\0\xc4\x8d\xc3\xa1hcesuolo.no\0" +"fukuyama.hiroshima.jp\0yokoze.saitama.jp\0pt.eu.org\0" +"farmstead.museum\0" +"ril\0" +"oe.yamagata.jp\0" +"store.bb\0rio\0is-a-liberal.com\0" +"rip\0" +"arakawa.tokyo.jp\0" +"medio-campidano.it\0baby\0" +"przeworsk.pl\0" +"citadel\0" +"kuriyama.hokkaido.jp\0doshi.yamanashi.jp\0" +"entomology.museum\0" +"merckmsd\0" +"dyroy.no\0notteroy.no\0" +"reggiocalabria.it\0mj\xc3\xb8ndalen.no\0" +"hamura.tokyo.jp\0" +"madrid\0thruhere.net\0" +"saka.hiroshima.jp\0" +"gunma.jp\0mito.ibaraki.jp\0mobi\0annefrank.museum\0nebraska.museum\0" +"from-nm.com\0" +"kozaki.chiba.jp\0aknoluokta.no\0\xe6\xb8\xb8\xe6\x88\x8f\0is-an-accountant.com\0is-very-good.org\0" +"kosei.shiga.jp\0" +"zippo\0" +"urawa.saitama.jp\0" +"togura.nagano.jp\0ama.shimane.jp\0" +"avianca\0" +"nayoro.hokkaido.jp\0vistaprint\0" +"w.bg\0" +"sennan.osaka.jp\0appspot.com\0" +"tmall\0" +"garden\0store.dk\0" +"cc.wy.us\0" +"federation.aero\0" +"fie.ee\0takanabe.miyazaki.jp\0hinohara.tokyo.jp\0" +"ishikawa.okinawa.jp\0" +"uhren.museum\0undersea.museum\0moda\0" +"halloffame.museum\0wskr.gov.pl\0cisco\0" +"brescia.it\0vb.it\0" +"pi.it\0cyon.link\0" +"sugito.saitama.jp\0sncf\0dyndns-office.com\0" +"szex.hu\0american.museum\0" +"katsuragi.nara.jp\0" +"sowa.ibaraki.jp\0kiyokawa.kanagawa.jp\0" +"delmenhorst.museum\0" +"mizuho.tokyo.jp\0trondheim.no\0" +"flight.aero\0" +"exchange.aero\0wa.edu.au\0furniture.museum\0dynalias.org\0" +"hitra.no\0" +"toscana.it\0" +"wakayama.jp\0" +"muni.il\0savona.it\0ikano\0" "miyazaki.miyazaki.jp\0" -"texas.museum\0hosting\0" -"mincom.tn\0" -"huissier-justice.fr\0" -"\xc3\xa5lg\xc3\xa5rd.no\0fusa.no\0lib.ny.us\0mtpc\0panerai\0" -"chieti.it\0fujikawaguchiko.yamanashi.jp\0blogspot.com.ar\0" -"gs.fm.no\0" -"chikushino.fukuoka.jp\0" -"blogspot.com.au\0" -"iiyama.nagano.jp\0" -"ms.kr\0" -"tohma.hokkaido.jp\0tara.saga.jp\0" -"is-gone.com\0" -"friuli-vegiulia.it\0saito.miyazaki.jp\0" -"ringebu.no\0" -"bj.cn\0me.tz\0blogspot.com.br\0" -"raisa.no\0me.uk\0" -"tokuyama.yamaguchi.jp\0" -"isesaki.gunma.jp\0" -"kunst.museum\0" -"childrens.museum\0me.us\0" -"mihara.hiroshima.jp\0" -"jogasz.hu\0" -"sayama.saitama.jp\0" -"k12.me.us\0" -"bale.museum\0s\xc3\xb8r-odal.no\0" -"cambridge.museum\0" -"shimotsuke.tochigi.jp\0" -"harima.hyogo.jp\0" -"varggat.no\0barcelona\0" -"kunimi.fukushima.jp\0" -"gallery.museum\0" -"kitayama.wakayama.jp\0" -"nov.ru\0" -"kasumigaura.ibaraki.jp\0taiki.mie.jp\0" -"lierne.no\0is-a-doctor.com\0" -"lidl\0" -"al.no\0\xeb\x8b\xb7\xeb\x84\xb7\0dyndns-office.com\0" -"kunisaki.oita.jp\0ricoh\0" -"biev\xc3\xa1t.no\0" -"yamagata.jp\0ibara.okayama.jp\0" -"shirakawa.fukushima.jp\0" -"is-a-nurse.com\0" -"sagamihara.kanagawa.jp\0" -"verdal.no\0" -"fie.ee\0shoes\0" -"blogspot.com.es\0" -"tachikawa.tokyo.jp\0" -"valley.museum\0oracle\0\xd0\xbe\xd0\xbd\xd0\xbb\xd0\xb0\xd0\xb9\xd0\xbd\0" -"yuzawa.niigata.jp\0higashiizumo.shimane.jp\0" +"vegarshei.no\0" +"oy.lc\0" +"emiliaromagna.it\0dy.fi\0" +"hyatt\0" +"\xe5\x85\xb5\xe5\xba\xab.jp\0" +"from-hi.com\0" +"carbonia-iglesias.it\0" +"tkmaxx\0" +"agdenes.no\0" +"ebino.miyazaki.jp\0k12.md.us\0\xe0\xb0\xad\xe0\xb0\xbe\xe0\xb0\xb0\xe0\xb0\xa4\xe0\xb1\x8d\0nid.io\0" +"kasahara.gifu.jp\0k12.ga.us\0" +"k12.ar.us\0" +"dolls.museum\0" +"sandefjord.no\0" +"r\xc3\xa1hkker\xc3\xa1vju.no\0" +"sherbrooke.museum\0rendalen.no\0" +"fl\xc3\xa5.no\0" +"fhs.no\0" +"fukaya.saitama.jp\0" +"kwpsp.gov.pl\0kerryhotels\0" +"hasuda.saitama.jp\0vanguard\0" +"umaji.kochi.jp\0royken.no\0" +"\xe5\x80\x8b\xe4\xba\xba.hk\0clinic\0" +"ivanovo.ru\0" +"is-a-nascarfan.com\0" +"s.se\0lib.pa.us\0" +"y.bg\0sap\0" +"niyodogawa.kochi.jp\0" +"intl.tn\0" +"surgeonshall.museum\0sas\0" +"funabashi.chiba.jp\0karumai.iwate.jp\0from-wy.com\0" +"cc.mi.us\0" +"sbi\0voting\0" +"ogori.fukuoka.jp\0" +"ivanovo.su\0" +"turin.it\0" +"ishinomaki.miyagi.jp\0" +"sca\0" +"nishi.osaka.jp\0ptz.ru\0scb\0" +"aikawa.kanagawa.jp\0sbs\0" +"ninomiya.kanagawa.jp\0" +"daplie.me\0" +"hammarfeasta.no\0" +"trentino-a-adige.it\0" +"al.eu.org\0" +"bardu.no\0" +"\xd8\xb9\xd8\xb1\xd8\xa7\xd9\x82\0" "\xe0\xb6\xbd\xe0\xb6\x82\xe0\xb6\x9a\xe0\xb7\x8f\0" -"katori.chiba.jp\0" -"vic.gov.au\0center.museum\0ulan-ude.ru\0life\0" -"machida.tokyo.jp\0better-than.tv\0" -"hino.tokyo.jp\0" -"tokoname.aichi.jp\0" -"kawachinagano.osaka.jp\0" -"minnesota.museum\0" -"steinkjer.no\0" -"trentino-stirol.it\0hamatonbetsu.hokkaido.jp\0" -"reggio-calabria.it\0" -"etnedal.no\0vdonsk.ru\0cc.sd.us\0" -"plaza.museum\0" -"nx.cn\0band\0" -"flowers\0" -"bank\0" -"agematsu.nagano.jp\0" -"passenger-association.aero\0mod.gi\0" -"settsu.osaka.jp\0" -"shimokitayama.nara.jp\0" -"washingtondc.museum\0apartments\0is-a-blogger.com\0" -"at-band-camp.net\0" -"med.pro\0" -"torino.it\0" -"merseine.nu\0" -"ine.kyoto.jp\0" -"\xe9\xb3\xa5\xe5\x8f\x96.jp\0" -"komforb.se\0" -"porsgrunn.no\0" -"noboribetsu.hokkaido.jp\0kameoka.kyoto.jp\0" -"analytics\0" -"cng.br\0" -"vladikavkaz.ru\0cc.md.us\0" -"page\0" -"friuli-veneziagiulia.it\0shimamoto.osaka.jp\0uw.gov.pl\0" -"microlight.aero\0canada.museum\0koebenhavn.museum\0" -"olbia-tempio.it\0yukuhashi.fukuoka.jp\0allfinanz\0" -"aerodrome.aero\0" -"\xe6\x84\x9b\xe7\x9f\xa5.jp\0" -"beppu.oita.jp\0nishiazai.shiga.jp\0" -"minami.tokushima.jp\0kaneyama.yamagata.jp\0" -"amber.museum\0from-ga.com\0" -"kita.kyoto.jp\0" -"sakyo.kyoto.jp\0fund\0" -"modern.museum\0" -"ebina.kanagawa.jp\0" -"kuzbass.ru\0" -"namegata.ibaraki.jp\0nowruz\0" -"nc.tr\0" -"like\0" -"valledaosta.it\0" -"tromso.no\0" -"fukui.jp\0" -"b\xc3\xb8.telemark.no\0jpn.com\0" -"kumagaya.saitama.jp\0" -"charter.aero\0" -"gent\0" -"barum.no\0nannestad.no\0homeunix.com\0" -"medecin.fr\0" -"bern.museum\0batsfjord.no\0al.us\0getmyip.com\0" -"fan\0" -"jetzt\0" -"alaska.museum\0zhytomyr.ua\0ms.us\0nc.us\0" -"\xd8\xa7\xd9\x84\xd9\x85\xd8\xba\xd8\xb1\xd8\xa8\0" -"k12.ms.us\0k12.nc.us\0" -"surgeonshall.museum\0" -"g.bg\0from-me.org\0" -"auction\0" -"gs.mr.no\0" -"osakikamijima.hiroshima.jp\0nanao.ishikawa.jp\0" -"yanaizu.fukushima.jp\0muika.niigata.jp\0" -"hjartdal.no\0" -"ca.it\0kawakami.nagano.jp\0support\0" -"co.ae\0" -"co.ag\0" -"naroy.no\0limo\0" -"kawara.fukuoka.jp\0katsushika.tokyo.jp\0" -"bungoono.oita.jp\0" -"co.ao\0esq\0" -"co.ba\0" -"co.bb\0" -"simple-url.com\0" -"co.at\0etc.br\0" -"\xc3\xa5krehamn.no\0vestre-slidre.no\0barclays\0link\0" -"kiryu.gunma.jp\0hamamatsu.shizuoka.jp\0" -"lib.or.us\0" -"taira.toyama.jp\0" -"co.bi\0" -"kazimierz-dolny.pl\0" -"krasnoyarsk.ru\0" -"gucci\0" -"wanggou\0" -"co.ca\0" -"yamatsuri.fukushima.jp\0" -"paris.museum\0" -"\xe0\xa4\x95\xe0\xa5\x89\xe0\xa4\xae\0" -"co.bw\0" -"omi.nagano.jp\0" -"co.ci\0aquarelle\0" -"co.cl\0" -"co.cm\0" -"nakagawa.tokushima.jp\0" -"zushi.kanagawa.jp\0tokorozawa.saitama.jp\0" -"eus\0from-ne.com\0" -"co.cr\0szkola.pl\0" -"as.us\0" -"oiso.kanagawa.jp\0xihuan\0blogspot.com.tr\0" -"nj.us\0k12.as.us\0" -"conference.aero\0" -"n.bg\0" +"ppg.br\0education.museum\0" +"openair.museum\0" +"higashichichibu.saitama.jp\0" +"from-dc.com\0" +"ashiya.fukuoka.jp\0" +"brussels.museum\0s\xc3\xa1lat.no\0" +"omsk.ru\0" +"genkai.saga.jp\0dnsalias.net\0" +"band\0" +"mypets.ws\0shop.ro\0" +"sucks\0" +"sukagawa.fukushima.jp\0bamble.no\0bank\0" +"kayabe.hokkaido.jp\0yura.wakayama.jp\0" +"daigo.ibaraki.jp\0" +"run\0" +"esp.br\0" +"eng.br\0mediocampidano.it\0is-a-photographer.com\0" +"tarnobrzeg.pl\0" +"cancerresearch\0ses\0" +"southwest.museum\0accountant\0" +"tokushima.tokushima.jp\0sande.m\xc3\xb8re-og-romsdal.no\0" +"sew\0" +"isshiki.aichi.jp\0sex\0" +"andria-trani-barletta.it\0andriatranibarletta.it\0" "shop.pl\0" -"ca.na\0n\xc3\xa6r\xc3\xb8y.no\0" -"takaishi.osaka.jp\0" -"miyazu.kyoto.jp\0\xe5\x85\xac\xe7\x9b\x8a\0" -"abr.it\0taiji.wakayama.jp\0" -"v\xc3\xa5gs\xc3\xb8y.no\0bar.pro\0kchr.ru\0lanbib.se\0" -"traeumtgerade.de\0" -"ch.it\0" -"cc.ak.us\0" -"mypets.ws\0" -"owani.aomori.jp\0" +"seranishi.hiroshima.jp\0" +"midori.chiba.jp\0" +"sasebo.nagasaki.jp\0sfr\0" +"kanonji.kagawa.jp\0" +"yamashina.kyoto.jp\0rwe\0" +"lib.ut.us\0" +"u.se\0" +"est-a-la-masion.com\0" +"ibigawa.gifu.jp\0" +"kameoka.kyoto.jp\0toba.mie.jp\0" +"iveland.no\0arab\0" +"sciencesnaturelles.museum\0" +"cam.it\0" +"cc.sd.us\0" +"koge.tottori.jp\0cn.com\0" +"wake.okayama.jp\0bjugn.no\0podzone.org\0" +"gs.sf.no\0" +"oppdal.no\0" +"ito.shizuoka.jp\0" +"psse.gov.pl\0" +"sayo.hyogo.jp\0sydney.museum\0" +"niigata.jp\0" +"hashimoto.wakayama.jp\0" +"hagi.yamaguchi.jp\0gb.net\0" +"ichikawamisato.yamanashi.jp\0" +"kamikoani.akita.jp\0legnica.pl\0" +"msk.ru\0fage\0" +"ohda.shimane.jp\0" +"saiki.oita.jp\0" +"yokawa.hyogo.jp\0" +"lazio.it\0matsuno.ehime.jp\0shimodate.ibaraki.jp\0" +"isen.kagoshima.jp\0" +"onojo.fukuoka.jp\0" +"siljan.no\0" +"properties\0" +"msk.su\0" +"lubin.pl\0" +"sandvik\0" +"tottori.tottori.jp\0" +"toyama.toyama.jp\0" +"cinema.museum\0" +"ski\0" +"british.museum\0" +"daisen.akita.jp\0" +"fail\0" +"ninohe.iwate.jp\0" +"otama.fukushima.jp\0" +"nakagawa.nagano.jp\0at-band-camp.net\0" +"louvre.museum\0" +"tsu.mie.jp\0" +"sky\0" +"kawanishi.hyogo.jp\0" +"is-a-geek.net\0" +"tas.edu.au\0" +"fujixerox\0" +"storfjord.no\0chukotka.ru\0" +"ogawara.miyagi.jp\0lucerne.museum\0vf.no\0w.se\0" +"saintlouis.museum\0" +"forli-cesena.it\0tomakomai.hokkaido.jp\0swinoujscie.pl\0" +"gok.pk\0" +"maintenance.aero\0jx.cn\0" +"zlg.br\0gub.uy\0" +"sue.fukuoka.jp\0moto\0" +"toyota.aichi.jp\0" +"tamamura.gunma.jp\0evenes.no\0" +"misugi.mie.jp\0watari.miyagi.jp\0artanddesign.museum\0donna.no\0" +"stathelle.no\0knowsitall.info\0" +"yoichi.hokkaido.jp\0hamamatsu.shizuoka.jp\0" +"fukuchi.fukuoka.jp\0" +"po.it\0" +"airline.aero\0" +"ut.us\0" +"tokorozawa.saitama.jp\0" +"novara.it\0" +"s3-eu-west-1.amazonaws.com\0" +"office\0" +"kumano.mie.jp\0cambridge.museum\0" +"myoko.niigata.jp\0" +"otari.nagano.jp\0starnberg.museum\0" +"bauhaus\0movie\0" +"oppegard.no\0" +"data\0" "iwate.jp\0" -"\xe4\xb8\xad\xe5\x9b\xbd\0feedback\0" -"dyndns-at-work.com\0" -"even\xc3\xa1\xc5\xa1\xc5\xa1i.no\0organic\0" -"k12.il.us\0" -"yabu.hyogo.jp\0" -"stjohn.museum\0\xe4\xb8\xad\xe5\x9c\x8b\0" -"davvesiida.no\0sucks\0temasek\0" -"drammen.no\0" -"aip.ee\0co.gg\0" -"kumejima.okinawa.jp\0" -"london\0" -"tolga.no\0" -"sakura.chiba.jp\0fit\0" -"tjeldsund.no\0" -"rec.br\0gushikami.okinawa.jp\0" -"navigation.aero\0" -"co.gy\0" -"sanda.hyogo.jp\0daigo.ibaraki.jp\0uenohara.yamanashi.jp\0" -"az.us\0" -"nakatane.kagoshima.jp\0" -"labor.museum\0wang\0" -"matera.it\0shirataka.yamagata.jp\0swatch\0selfip.net\0" -"fashion\0" -"pars\0" -"yugawa.fukushima.jp\0" -"rec.co\0k12.ny.us\0" -"co.id\0" -"co.hu\0lib.vt.us\0" -"jelenia-gora.pl\0" -"u.bg\0" -"\xd8\xa7\xd9\x84\xd8\xac\xd8\xb2\xd8\xa7\xd8\xa6\xd8\xb1\0" -"ito.shizuoka.jp\0maison\0" -"miyada.nagano.jp\0" -"co.im\0yakutia.ru\0" -"co.in\0" -"live\0" -"venice.it\0" -"co.ir\0aizubange.fukushima.jp\0shizuoka.shizuoka.jp\0principe.st\0" -"co.it\0" -"co.je\0cc.ar.us\0review\0" -"heguri.nara.jp\0center\0from-ny.net\0" -"sanfrancisco.museum\0" -"akune.kagoshima.jp\0" -"casadelamoneda.museum\0edeka\0" -"\xe7\x9f\xb3\xe5\xb7\x9d.jp\0fukuchiyama.kyoto.jp\0" -"nissedal.no\0ivanovo.ru\0" -"co.jp\0" -"ia.us\0" -"vantaa.museum\0" -"yanagawa.fukuoka.jp\0" -"aeroclub.aero\0tx.us\0" -"urbinopesaro.it\0" -"army\0fly\0" -"fukudomi.saga.jp\0oguni.yamagata.jp\0" -"val-d-aosta.it\0" -"historyofscience.museum\0tranby.no\0" -"andasuolo.no\0" -"yoshinogari.saga.jp\0co.kr\0" -"championship.aero\0co.lc\0public.museum\0" -"nerima.tokyo.jp\0" -"moscow.museum\0cymru\0" -"site\0" -"namerikawa.toyama.jp\0" -"cc.hi.us\0" -"tsuruga.fukui.jp\0" -"arpa\0news\0nokia\0" -"co.ma\0vf.no\0" -"verm\xc3\xb6gensberater\0" -"co.ls\0cmw.ru\0ca.us\0" -"co.me\0" -"grandrapids.museum\0nuremberg.museum\0oh.us\0" -"shibukawa.gunma.jp\0" -"fujioka.gunma.jp\0asahi.yamagata.jp\0oshino.yamanashi.jp\0" -"foo\0quebec\0" -"co.na\0" -"campidano-medio.it\0" -"austin.museum\0" -"\xe7\xbb\x84\xe7\xbb\x87.hk\0co.mu\0" -"\xe7\xa6\x8f\xe5\xb3\xb6.jp\0" -"co.mw\0" -"yatomi.aichi.jp\0daejeon.kr\0" -"steigen.no\0" -"ogimi.okinawa.jp\0" -"equipment.aero\0settlers.museum\0" -"psc.br\0nara.jp\0tsugaru.aomori.jp\0co.nl\0" -"co.no\0" -"university.museum\0" -"nakagawa.nagano.jp\0email\0" -"sveio.no\0" -"ed.ao\0donostia.museum\0kommunalforbund.se\0" -"cleaning\0technology\0" -"co.nz\0gal\0" -"forsale\0" -"carraramassa.it\0" -"co.om\0" -"emiliaromagna.it\0" -"birdart.museum\0" -"scrapper-site.net\0" -"oceanographic.museum\0" -"aca.pro\0karelia.ru\0" -"atsuma.hokkaido.jp\0hidaka.wakayama.jp\0" -"handson.museum\0" -"chuo.yamanashi.jp\0frl\0" -"co.pl\0" -"gjerstad.no\0" -"co.pn\0" -"bearalvahki.no\0" -"piemonte.it\0" -"ed.ci\0amsterdam.museum\0hk.com\0" -"taishi.hyogo.jp\0" -"arte\0" -"jor.br\0shinshiro.aichi.jp\0kyowa.akita.jp\0" -"g.se\0" -"vt.it\0koto.shiga.jp\0um.gov.pl\0" -"co.pw\0cbg.ru\0" -"ed.cr\0vald-aosta.it\0" -"blogspot.re\0" -"midatlantic.museum\0" -"modum.no\0" -"blogspot.ro\0" -"riodejaneiro.museum\0" -"gdn\0" -"cisco\0blogspot.ru\0blogspot.se\0" -"brand.se\0bbva\0gea\0blogspot.sg\0" -"utah.museum\0porsangu.no\0" -"sakai.osaka.jp\0" -"linz.museum\0co.rs\0blogspot.sk\0" -"trentino-a-adige.it\0aero.tt\0" -"realestate.pl\0" -"bjark\xc3\xb8y.no\0co.rw\0" -"pt.it\0esan.hokkaido.jp\0" -"hsbc\0" -"kawanishi.yamagata.jp\0rec.nf\0" -"blogspot.td\0" -"taxi.aero\0" -"kamigori.hyogo.jp\0aoki.nagano.jp\0" -"ferrero\0lotte\0" -"whaling.museum\0" -"\xe9\xab\x98\xe7\x9f\xa5.jp\0blogdns.net\0" -"broadway\0" -"co.st\0\xe5\xb9\xbf\xe4\xb8\x9c\0" -"aero.mv\0" -"ama.aichi.jp\0iwama.ibaraki.jp\0uruma.okinawa.jp\0hamada.shimane.jp\0co.th\0" -"lotto\0" -"co.sz\0co.tj\0" -"is-not-certified.com\0" -"samegawa.fukushima.jp\0hatogaya.saitama.jp\0" -"co.tm\0" -"zoological.museum\0evenes.no\0blogspot.tw\0" -"b\xc3\xb8.nordland.no\0n\xc3\xb8tter\xc3\xb8y.no\0co.ua\0" -"nishio.aichi.jp\0shibecha.hokkaido.jp\0" -"magazine.aero\0" -"co.tt\0\xe4\xb8\x96\xe7\x95\x8c\0" -"\xeb\x8b\xb7\xec\xbb\xb4\0" -"nordreisa.no\0co.ug\0" -"kvalsund.no\0ggee\0" -"co.tz\0blogspot.mr\0" -"jobs\0giessen.museum\0co.uk\0verm\xc3\xb6gensberatung\0" -"n.se\0" -"yamamoto.miyagi.jp\0" -"asia\0uzhgorod.ua\0" -"blogspot.mx\0" -"burghof.museum\0" -"co.us\0" -"higashiura.aichi.jp\0blogspot.nl\0" -"columbus.museum\0co.ve\0" -"nnov.ru\0yachts\0blogspot.no\0" -"bjerkreim.no\0co.vi\0" -"co.uz\0" -"sekigahara.gifu.jp\0" -"osteroy.no\0\xe9\xa6\x99\xe6\xb8\xaf\0" -"kinko.kagoshima.jp\0" -"tsubetsu.hokkaido.jp\0" -"eiheiji.fukui.jp\0yawata.kyoto.jp\0yamatokoriyama.nara.jp\0" -"sasayama.hyogo.jp\0" -"equipment\0" -"takamori.nagano.jp\0" -"hobol.no\0university\0" -"itabashi.tokyo.jp\0" -"school.na\0chel.ru\0" -"kuroishi.aomori.jp\0" -"timekeeping.museum\0\xe6\xb7\xa1\xe9\xa9\xac\xe9\x94\xa1\0" -"reggiocalabria.it\0" -"rec.ro\0" -"alsace\0" -"royken.no\0" -"ed.jp\0gunma.jp\0" -"amusement.aero\0giehtavuoatna.no\0" -"blogspot.pt\0" -"*.bd\0hokuryu.hokkaido.jp\0" -"and\xc3\xb8y.no\0" -"trd.br\0" -"osakasayama.osaka.jp\0" -"systems\0" -"asahikawa.hokkaido.jp\0" -"takazaki.miyazaki.jp\0school.nz\0" -"\xe5\x95\x86\xe6\xa5\xad.tw\0" -"*.bn\0tosashimizu.kochi.jp\0dabur\0" -"cranbrook.museum\0usa.museum\0cv.ua\0" -"daisen.akita.jp\0shirosato.ibaraki.jp\0" -"perugia.it\0blogspot.it\0" -"atsugi.kanagawa.jp\0" -"oyabe.toyama.jp\0" -"skedsmokorset.no\0cc.in.us\0gle\0" -"*.ck\0hurdal.no\0u.se\0" -"bunkyo.tokyo.jp\0" -"mad.museum\0" -"blogspot.jp\0" -"eco.br\0" -"wa.gov.au\0k\xc3\xa5""fjord.no\0\xc3\xb8rland.no\0space\0" -"oita.jp\0mukawa.hokkaido.jp\0" -"lib.la.us\0" -"bialystok.pl\0szczytno.pl\0democrat\0" -"*.cy\0webhop.org\0" -"neyagawa.osaka.jp\0" -"horology.museum\0audio\0commbank\0" -"ashiya.fukuoka.jp\0" -"hiratsuka.kanagawa.jp\0" -"grimstad.no\0rec.ve\0" -"blogspot.kr\0" -"tokyo\0" -"dellogliastra.it\0shiiba.miyazaki.jp\0" -"gmo\0" -"yaotsu.gifu.jp\0" -"\xd8\xb4\xd8\xa8\xd9\x83\xd8\xa9\0" -"kaisei.kanagawa.jp\0" -"tonsberg.no\0" -"gmx\0" -"b\xc3\xa5tsfjord.no\0law.pro\0suzuki\0" -"oristano.it\0" -"tsukui.kanagawa.jp\0yokkaichi.mie.jp\0" +"kpmg\0soy\0" +"stalowa-wola.pl\0" +"hakata.fukuoka.jp\0miura.kanagawa.jp\0date\0" +"stranda.no\0from-mo.com\0" +"koori.fukushima.jp\0okutama.tokyo.jp\0" +"matsumoto.nagano.jp\0interactive.museum\0k12.nj.us\0" +"research.museum\0tab\0" +"starachowice.pl\0" +"umig.gov.pl\0fans\0reise\0" +"safety.aero\0" +"yusuhara.kochi.jp\0kudamatsu.yamaguchi.jp\0intelligence.museum\0" +"\xc3\xa5l.no\0" +"balsan.it\0saratov.ru\0" +"mihama.aichi.jp\0" +"hair\0" +"coop.ht\0netflix\0" +"citic\0" +"stat.no\0" +"qc.ca\0broker\0" +"tax\0" +"oslo.no\0servepics.com\0" +"iki.nagasaki.jp\0" +"chitose.hokkaido.jp\0joburg\0" +"misato.wakayama.jp\0srl\0" +"gosen.niigata.jp\0y.se\0" +"shikaoi.hokkaido.jp\0" +"kanegasaki.iwate.jp\0sosnowiec.pl\0" +"ap.gov.pl\0" +"yorii.saitama.jp\0" +"sohu\0" +"srt\0" +"vald-aosta.it\0tsubame.niigata.jp\0cc.mo.us\0" +"togliatti.su\0tci\0sells-for-u.com\0" +"kurume.fukuoka.jp\0" +"servebeer.com\0" +"coop.br\0" +"americanexpress\0" +"oyodo.nara.jp\0hamar.no\0stc\0" +"watch-and-clock.museum\0" +"niihama.ehime.jp\0open\0" +"tmp.br\0" +"statoil\0" +"tdk\0" +"emilia-romagna.it\0roros.no\0" +"experts-comptables.fr\0" +"farm\0" +"toyota.yamaguchi.jp\0" +"consulting.aero\0photography\0serveftp.net\0" +"army\0" +"m\xc3\xa5lselv.no\0" +"cheap\0" +"fundacio.museum\0organic\0ngrok.io\0" +"stuttgart.museum\0" +"sassari.it\0" +"tel\0" +"tysnes.no\0" +"itabashi.tokyo.jp\0americanfamily\0" +"law.za\0" +"ichikawa.chiba.jp\0" +"fast\0" +"hammerfest.no\0" +"sogne.no\0" +"bozen.it\0vlaanderen.museum\0" +"airtraffic.aero\0k12.sc.us\0myactivedirectory.com\0" +"here-for-more.info\0" +"arpa\0" +"\xd5\xb0\xd5\xa1\xd5\xb5\0" +"messina.it\0airforce\0" +"ogaki.gifu.jp\0" +"h\xc3\xa1mm\xc3\xa1rfeasta.no\0" +"nuoro.it\0detroit.museum\0" +"western.museum\0" +"konan.aichi.jp\0" +"s\xc3\xb8mna.no\0" +"brindisi.it\0miasa.nagano.jp\0" +"karasjok.no\0" +"\xd7\xa7\xd7\x95\xd7\x9d\0" +"yuu.yamaguchi.jp\0thd\0" +"song\0" +"podlasie.pl\0" +"productions\0" +"from-tx.com\0" +"rybnik.pl\0mykolaiv.ua\0" +"is-with-theband.com\0" +"kawara.fukuoka.jp\0komoro.nagano.jp\0" +"karm\xc3\xb8y.no\0" +"kautokeino.no\0" +"tr\xc3\xb8gstad.no\0" +"showa.yamanashi.jp\0sony\0" +"maebashi.gunma.jp\0onomichi.hiroshima.jp\0" +"lukow.pl\0" +"kanazawa.ishikawa.jp\0" +"vik.no\0flowers\0" +"services\0" +"ukiha.fukuoka.jp\0dyndns-blog.com\0" +"piacenza.it\0" +"midtre-gauldal.no\0" +"asda\0" +"vardo.no\0" +"kawahara.tottori.jp\0" +"engine.aero\0deatnu.no\0arte\0" +"ntr.br\0" +"\xe6\x85\x88\xe5\x96\x84\0" +"airbus\0" +"tjx\0" +"sellsyourhome.org\0" +"\xe5\x95\x86\xe5\x9f\x8e\0" +"avocat.pro\0" +"caltanissetta.it\0massacarrara.it\0" +"zapto.org\0" +"saga.saga.jp\0overhalla.no\0" +"l\xc3\xb8renskog.no\0" +"chonan.chiba.jp\0" +"cartier\0stuff-4-sale.org\0" +"stavern.no\0" +"friulive-giulia.it\0bbva\0" +"misawa.aomori.jp\0" +"hashima.gifu.jp\0" +"groundhandling.aero\0from-pr.com\0" +"fujimino.saitama.jp\0ulm.museum\0" +"okuma.fukushima.jp\0shizuoka.shizuoka.jp\0vuelos\0" +"zamami.okinawa.jp\0cloudns.biz\0" +"bmoattachments.org\0geekgalaxy.com\0" +"tachiarai.fukuoka.jp\0" +"haus\0" +"aquarium.museum\0manchester.museum\0" +"gitlab.io\0" +"chiropractic.museum\0olayangroup\0" +"*.bd\0" +"izu.shizuoka.jp\0" +"fujieda.shizuoka.jp\0study\0" +"labor.museum\0r\xc3\xa5""de.no\0" +"uz.ua\0" +"songdalen.no\0" +"ostrowwlkp.pl\0kh.ua\0emerck\0" +"cc.ms.us\0cc.nc.us\0" +"*.bn\0s3-us-west-1.amazonaws.com\0" +"sakurai.nara.jp\0haugesund.no\0cc.ca.us\0" +"ltd.co.im\0" +"pu.it\0architecture.museum\0sondre-land.no\0" +"sakura.chiba.jp\0gs.hl.no\0est.pr\0" +"fc.it\0\xc3\xb8ksnes.no\0" +"ginoza.okinawa.jp\0v\xc3\xa5ler.\xc3\xb8stfold.no\0" +"takamatsu.kagawa.jp\0" +"asia\0*.ck\0" +"hepforge.org\0" +"\xe5\xa4\xa7\xe4\xbc\x97\xe6\xb1\xbd\xe8\xbd\xa6\0" +"ardal.no\0top\0" +"bruxelles.museum\0skj\xc3\xa5k.no\0" +"is-an-engineer.com\0" +"\xd9\x85\xd9\x84\xd9\x8a\xd8\xb3\xd9\x8a\xd8\xa7\0" +"erni\0" +"ashoro.hokkaido.jp\0pippu.hokkaido.jp\0dudinka.ru\0" +"sologne.museum\0" +"ap-southeast-2.compute.amazonaws.com\0" +"akagi.shimane.jp\0aquarelle\0" +"es.kr\0" +"land\0" +"yamal.ru\0" +"4u.com\0" +"shari.hokkaido.jp\0" +"kvanangen.no\0" +"sasaguri.fukuoka.jp\0tgory.pl\0" +"yoga\0" +"k12.nh.us\0juniper\0" +"k12.gu.us\0" "*.er\0" -"capebreton.museum\0n\xc3\xa1vuotna.no\0sunndal.no\0" -"nishi.fukuoka.jp\0" -"otsuki.kochi.jp\0" -"*.fj\0*.kobe.jp\0zakopane.pl\0" -"*.fk\0vt.us\0" -"lig.it\0nishikatsura.yamanashi.jp\0" -"valdaosta.it\0takahata.yamagata.jp\0" -"1.bg\0" -"podhale.pl\0capital\0" -"kamo.niigata.jp\0cool\0" -"goo\0" -"gop\0" -"larsson.museum\0" -"coop\0" -"blogspot.fi\0" -"got\0" -"gov\0piacenza.it\0hisayama.fukuoka.jp\0" -"cincinnati.museum\0" -"frog.museum\0hitachi\0" -"kr.it\0fujinomiya.shizuoka.jp\0blogspot.fr\0" -"vistaprint\0" -"kodaira.tokyo.jp\0" -"*.gu\0ed.pw\0nsn.us\0" -"hu.net\0" -"fi.cr\0horokanai.hokkaido.jp\0gwangju.kr\0" -"yamagata.nagano.jp\0" -"lubin.pl\0blogspot.gr\0" -"modelling.aero\0rendalen.no\0kostroma.ru\0from-sc.com\0" -"tarnobrzeg.pl\0" -"ivgu.no\0comsec\0" -"broadcast.museum\0" -"buryatia.ru\0blogspot.hk\0" -"kl\xc3\xa6""bu.no\0" -"*.il\0" -"study\0" -"kameyama.mie.jp\0wakasa.tottori.jp\0" -"bas.it\0kanzaki.saga.jp\0" -"cc.de.us\0blogspot.hu\0blogspot.ie\0" -"hasama.oita.jp\0" -"ri.it\0dynalias.net\0" -"\xe6\x94\xbf\xe5\x8a\xa1\0" -"toscana.it\0shikokuchuo.ehime.jp\0" -"aknoluokta.no\0sor-varanger.no\0" -"kasamatsu.gifu.jp\0kawaue.gifu.jp\0blogspot.in\0" +"embetsu.hokkaido.jp\0" +"trento.it\0shimogo.fukushima.jp\0castle.museum\0" +"portlligat.museum\0" +"tourism.tn\0" +"eco.br\0" +"*.fj\0" +"*.fk\0" +"kumamoto.jp\0" +"sumy.ua\0" +"eid.no\0" +"modelling.aero\0kui.hiroshima.jp\0ubs\0" +"mie.jp\0" +"trv\0" +"abruzzo.it\0java\0" +"aomori.aomori.jp\0beta.bounty-full.com\0" +"homebuilt.aero\0social\0" +"shirataka.yamagata.jp\0" +"f\xc3\xb8rde.no\0v\xc3\xa5g\xc3\xa5.no\0qpon\0repair\0" +"gos.pk\0myasustor.com\0" +"*.gu\0" +"cc.ne.us\0" +"nom.ad\0" +"umbria.it\0movistar\0" +"nom.ag\0rahkkeravju.no\0" +"erotika.hu\0england.museum\0" +"fe.it\0gs.bu.no\0" +"serveirc.com\0" +"\xe6\x84\x9b\xe5\xaa\x9b.jp\0" +"\xe9\xa6\x99\xe5\xb7\x9d.jp\0" +"tui\0" +"bronnoysund.no\0" +"page\0" +"judaica.museum\0" +"nanporo.hokkaido.jp\0" +"lajolla.museum\0wales.museum\0name\0divttasvuotna.no\0" +"coop.tt\0hermes\0" +"ragusa.it\0game-server.cc\0" +"fuefuki.yamanashi.jp\0" +"friuli-v-giulia.it\0" +"walbrzych.pl\0" +"civilwar.museum\0" "*.jm\0" -"ina.nagano.jp\0" -"venezia.it\0misato.shimane.jp\0" -"is-very-good.org\0blogspot.be\0" -"*.ke\0tananger.no\0lib.sc.us\0dating\0" -"kakegawa.shizuoka.jp\0skin\0" -"8.bg\0" -"omachi.nagano.jp\0ichikawamisato.yamanashi.jp\0*.kh\0blogspot.bj\0" -"yashio.saitama.jp\0" -"blogspot.ca\0" -"arq.br\0takayama.gunma.jp\0" -"kagoshima.kagoshima.jp\0cancerresearch\0" -"miami\0" -"mihama.aichi.jp\0blogspot.cf\0" -"blogspot.ch\0" -"*.kw\0bindal.no\0" -"li.it\0" -"nationalfirearms.museum\0" -"rochester.museum\0" -"shibata.miyagi.jp\0" -"blogspot.de\0" -"blogspot.cv\0" -"leirvik.no\0" -"blogspot.cz\0" -"civilwar.museum\0krodsherad.no\0eng.pro\0blogspot.dk\0" -"kamiamakusa.kumamoto.jp\0" -"nic.in\0umbria.it\0" -"*.mm\0stv.ru\0" -"noto.ishikawa.jp\0webhop.biz\0" -"kiyosato.hokkaido.jp\0ueda.nagano.jp\0miyake.nara.jp\0" -"scienceandhistory.museum\0" -"nittedal.no\0" +"\xe7\xa5\x9e\xe5\xa5\x88\xe5\xb7\x9d.jp\0uda.nara.jp\0" +"cesenaforli.it\0" +"rankoshi.hokkaido.jp\0" +"shinkamigoto.nagasaki.jp\0tvs\0" +"ekloges.cy\0kawakami.nara.jp\0" +"coop.mv\0" +"nom.co\0iwaki.fukushima.jp\0godo.gifu.jp\0*.ke\0coop.mw\0" +"video.hu\0minami.kyoto.jp\0locker\0shiksha\0" +"ichinohe.iwate.jp\0nerima.tokyo.jp\0" +"*.kh\0" +"servehalflife.com\0" +"cityeats\0" +"kitchen\0" +"today\0work\0" +"childrens.museum\0test.tj\0" +"yamada.toyama.jp\0" +"sa.gov.au\0ravenna.it\0" +"kred\0" +"crimea.ua\0" +"avocat.fr\0*.kw\0" +"ena.gifu.jp\0webhop.org\0" +"bato.tochigi.jp\0kuzbass.ru\0" +"bostik\0" +"rauma.no\0" +"dnsalias.org\0" +"dclk\0" +"nishimera.miyazaki.jp\0" +"nord-odal.no\0tunk.org\0" +"kisofukushima.nagano.jp\0pl.eu.org\0" +"nom.es\0" +"okinawa.jp\0wakayama.wakayama.jp\0" +"lib.al.us\0restaurant\0" +"*.mm\0" +"hachirogata.akita.jp\0" +"andriabarlettatrani.it\0minamiizu.shizuoka.jp\0" +"vn.ua\0" +"spot\0" +"kamikawa.hokkaido.jp\0" +"tsk.ru\0" +"fi.cr\0akkeshi.hokkaido.jp\0" +"hattfjelldal.no\0" +"coop.py\0" +"nom.fr\0" +"vr.it\0" +"temasek\0" +"fg.it\0setouchi.okayama.jp\0test.ru\0" +"uri.arpa\0center\0" +"esan.hokkaido.jp\0*.np\0" +"\xe9\xab\x98\xe7\x9f\xa5.jp\0asahi.mie.jp\0hawaii.museum\0" +"ostrowiec.pl\0" +"srv.br\0chel.ru\0" +"tsuru.yamanashi.jp\0" +"yame.fukuoka.jp\0" +"chikuma.nagano.jp\0" +"dreamhosters.com\0" +"environmentalconservation.museum\0valley.museum\0" +"\xe5\x85\xac\xe7\x9b\x8a\0" +"mallorca.museum\0" +"ichinoseki.iwate.jp\0" +"prato.it\0" +"tatsuno.nagano.jp\0" +"anthro.museum\0*.pg\0" +"yamamoto.miyagi.jp\0gets-it.net\0" +"kagamino.okayama.jp\0" +"coop.km\0" +"ayagawa.kagawa.jp\0" +"valle.no\0" +"kamakura.kanagawa.jp\0" +"discover\0" +"yonago.tottori.jp\0" +"s\xc3\xb8r-varanger.no\0" +"honjo.akita.jp\0" +"inami.wakayama.jp\0k12.mt.us\0raid\0" +"cbg.ru\0" +"kitami.hokkaido.jp\0shingu.hyogo.jp\0nishinoomote.kagoshima.jp\0ostre-toten.no\0" "gorge.museum\0" -"\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4\0" -"*.ni\0" -"fi.it\0*.mz\0\xd8\xa7\xd8\xb1\xd8\xa7\xd9\x85\xd9\x83\xd9\x88\0" -"vibovalentia.it\0" -"*.np\0" -"sigdal.no\0skype\0" -"ono.fukushima.jp\0" -"mutsu.aomori.jp\0omachi.saga.jp\0" -"yn.cn\0" -"rost.no\0company\0" -"trainer.aero\0scienceandindustry.museum\0" -"kitaakita.akita.jp\0" -"entertainment.aero\0" -"fuettertdasnetz.de\0" +"kunimi.fukushima.jp\0" +"kitakata.fukushima.jp\0cyber.museum\0" +"nakanojo.gunma.jp\0misaki.osaka.jp\0" +"bmd.br\0tranibarlettaandria.it\0tourism.pl\0" +"inami.toyama.jp\0" +"reisen\0" +"nsw.edu.au\0" +"torsken.no\0uno\0" +"farm.museum\0" +"ab.ca\0boston\0" +"archaeology.museum\0" +"nom.km\0museumvereniging.museum\0" +"bloomberg\0" +"0.bg\0" +"belluno.it\0" +"\xe9\x9d\x92\xe6\xa3\xae.jp\0nishiwaki.hyogo.jp\0lacaixa\0uol\0" +"nagasu.kumamoto.jp\0" +"tatamotors\0" +"vt.it\0gs.st.no\0" +"navy\0" +"kr.it\0" +"fi.it\0" +"ballangen.no\0" +"sor-fron.no\0\xe5\x8f\xb0\xe6\xb9\xbe\0" +"mod.gi\0nom.mg\0j\xc3\xb8rpeland.no\0" +"intel\0" +"ups\0" +"kemerovo.ru\0taobao\0" +"honeywell\0" +"varoy.no\0" +"pars\0land-4-sale.us\0" +"paris\0" +"modern.museum\0s\xc3\xb8rreisa.no\0living\0" +"katsuyama.fukui.jp\0nom.ni\0" +"military.museum\0" +"rokunohe.aomori.jp\0" +"granvin.no\0" +"ino.kochi.jp\0" +"kasuya.fukuoka.jp\0" +"vicenza.it\0" +"furubira.hokkaido.jp\0loabat.no\0" +"taishi.hyogo.jp\0" +"travelchannel\0" +"wlocl.pl\0" +"mypep.link\0" +"ohi.fukui.jp\0k12.mn.us\0" +"otoineppu.hokkaido.jp\0githubusercontent.com\0" +"tado.mie.jp\0" +"final\0" +"nom.pa\0jamal.ru\0" +"amusement.aero\0ltd.cy\0" +"nom.pe\0psp.gov.pl\0" +"kirkenes.no\0" +"kagamiishi.fukushima.jp\0" +"val-d-aosta.it\0kannami.shizuoka.jp\0auspost\0" +"nom.pl\0" +"fosnes.no\0" +"opoczno.pl\0" +"firebaseapp.com\0" +"cologne\0" +"akishima.tokyo.jp\0" +"lib.ee\0" +"tagami.niigata.jp\0horten.no\0from-nv.com\0" +"fm.br\0" +"sabae.fukui.jp\0omi.nagano.jp\0" +"insure\0" +"lib.vt.us\0" +"nagasaki.nagasaki.jp\0" +"fukui.fukui.jp\0is-a-teacher.com\0" +"2.bg\0" +"gallo\0" +"*.ye\0scrapper-site.net\0github.io\0" +"guide\0" +"co.com\0" +"fujimi.nagano.jp\0nom.re\0" +"research.aero\0oizumi.gunma.jp\0" +"vv.it\0muroran.hokkaido.jp\0s\xc3\xb8ndre-land.no\0" +"ullensaker.no\0" +"sandnessjoen.no\0nannestad.no\0" +"equipment\0vet\0" +"nikko.tochigi.jp\0\xd0\xbc\xd0\xbe\xd1\x81\xd0\xba\xd0\xb2\xd0\xb0\0" +"nom.ro\0winners\0" +"*.kobe.jp\0" +"talk\0" +"geelvinck.museum\0" +"ltd.gi\0" +"plants.museum\0" +"omaezaki.shizuoka.jp\0" +"fujishiro.ibaraki.jp\0" +"place\0" +"imizu.toyama.jp\0marketing\0" +"monza-brianza.it\0*.zw\0" +"nakai.kanagawa.jp\0ddnsking.com\0" +"romsa.no\0" +"ltd.hk\0" +"bieszczady.pl\0" +"toyokawa.aichi.jp\0" +"aukra.no\0" +"czest.pl\0" +"nom.tm\0cloudapp.net\0" +"\xe7\xbb\x84\xe7\xb9\x94.hk\0acct.pro\0" +"juif.museum\0" +"gose.nara.jp\0" +"kakogawa.hyogo.jp\0" +"taiwa.miyagi.jp\0" +"club.aero\0fot.br\0" +"lombardy.it\0tsumagoi.gunma.jp\0colonialwilliamsburg.museum\0" +"ebetsu.hokkaido.jp\0" +"serveftp.org\0" +"n\xc3\xa1vuotna.no\0vig\0" +"kepno.pl\0" +"\xe5\xb1\xb1\xe5\x8f\xa3.jp\0" +"nanjo.okinawa.jp\0" +"koshimizu.hokkaido.jp\0" +"agriculture.museum\0vin\0" +"ens.tn\0" +"kaminokawa.tochigi.jp\0vip\0" +"yamagata.nagano.jp\0" +"immobilien\0" +"lundbeck\0" +"\xd8\xa7\xd8\xb1\xd8\xa7\xd9\x85\xd9\x83\xd9\x88\0" +"cherkasy.ua\0" +"browsersafetymark.io\0" +"namerikawa.toyama.jp\0" +"oirm.gov.pl\0" +"mizunami.gifu.jp\0nagiso.nagano.jp\0" +"4.bg\0mesaverde.museum\0cloudfunctions.net\0" +"kasuga.fukuoka.jp\0muncie.museum\0pioneer\0" +"suzaka.nagano.jp\0kr.ua\0audi\0" +"malbork.pl\0cc.nm.us\0" +"cc.id.us\0" +"ferrara.it\0" +"recipes\0" +"gobo.wakayama.jp\0" +"ltd.lk\0" +"fm.it\0roma.museum\0" +"turek.pl\0" +"anjo.aichi.jp\0" +"vt.us\0" +"artdeco.museum\0" +"kita.tokyo.jp\0\xd0\xb8\xd0\xba\xd0\xbe\xd0\xbc.museum\0" +"ad.jp\0" +"parts\0" +"beer\0" +"yasuoka.nagano.jp\0flatanger.no\0" +"pilot.aero\0" +"party\0" +"hiratsuka.kanagawa.jp\0" +"hemsedal.no\0" +"nom.za\0" +"vana\0" +"miyashiro.saitama.jp\0strand.no\0" +"kawanabe.kagoshima.jp\0smolensk.ru\0dynathome.net\0" +"hdfc\0" +"valledaosta.it\0" +"nishihara.okinawa.jp\0" +"yaita.tochigi.jp\0deal\0" "contemporary.museum\0" -"higashiyodogawa.osaka.jp\0" -"*.pg\0" -"aioi.hyogo.jp\0" -"newyork.museum\0\xd0\xbe\xd0\xb4.\xd1\x81\xd1\x80\xd0\xb1\0" -"does-it.net\0" -"her\xc3\xb8y.nordland.no\0" -"sosa.chiba.jp\0uryu.hokkaido.jp\0hirakata.osaka.jp\0" -"valle.no\0" -"circus.museum\0" -"citic\0" -"sn.cn\0" -"fukuyama.hiroshima.jp\0hiv\0" -"lenvik.no\0" -"nieruchomosci.pl\0" -"higashihiroshima.hiroshima.jp\0ohtawara.tochigi.jp\0" -"lib.nj.us\0" -"direct\0" -"blogspot.ae\0" -"kamaishi.iwate.jp\0omura.nagasaki.jp\0kaminoyama.yamagata.jp\0" -"s\xc3\xa1lat.no\0" -"towada.aomori.jp\0" -"klabu.no\0" -"padua.it\0" -"kr.ua\0" -"bio.br\0morimachi.shizuoka.jp\0" -"assisi.museum\0" -"tone.ibaraki.jp\0tsuno.miyazaki.jp\0" -"sells-for-less.com\0" -"hichiso.gifu.jp\0czeladz.pl\0" -"hvaler.no\0" -"paragliding.aero\0asnes.no\0" -"tako.chiba.jp\0" -"house.museum\0" -"anan.nagano.jp\0mihama.wakayama.jp\0" -"heritage.museum\0andebu.no\0from-wy.com\0" -"service.gov.uk\0" -"chambagri.fr\0" -"istmein.de\0" -"myoko.niigata.jp\0from-az.net\0" -"wy.us\0" -"yamakita.kanagawa.jp\0" -"garden.museum\0" -"\xe5\x92\x8c\xe6\xad\x8c\xe5\xb1\xb1.jp\0" -"qld.au\0gok.pk\0" -"schokoladen.museum\0" -"southcarolina.museum\0" -"nativeamerican.museum\0s3-website-us-west-1.amazonaws.com\0is-a-personaltrainer.com\0" -"hirosaki.aomori.jp\0" -"homes\0" -"fineart.museum\0" -"crown\0" -"nrw.museum\0" -"from-in.com\0" -"kaufen\0" -"grue.no\0lib.az.us\0\xd8\xb3\xd9\x88\xd8\xb1\xd9\x8a\xd8\xa7\0" -"far.br\0arita.saga.jp\0" -"bronnoy.no\0lipetsk.ru\0ri.us\0\xd8\xb3\xd9\x88\xd8\xb1\xd9\x8a\xd8\xa9\0is-a-conservative.com\0" -"honbetsu.hokkaido.jp\0" -"lib.ne.us\0selfip.org\0" -"tmp.br\0wakayama.jp\0" -"lodingen.no\0" -"moriya.ibaraki.jp\0shioya.tochigi.jp\0" -"dolls.museum\0health.museum\0" -"trentinoaadige.it\0" -"ascoli-piceno.it\0fukushima.fukushima.jp\0" -"takasaki.gunma.jp\0" -"how\0" -"bandai.fukushima.jp\0takaharu.miyazaki.jp\0" -"muenster.museum\0" -"statoil\0" -"himeji.hyogo.jp\0" -"asti.it\0" -"certification.aero\0santabarbara.museum\0yorkshire.museum\0sandnessjoen.no\0hasvik.no\0" -"bus.museum\0africa.com\0" -"ky.us\0" -"sennan.osaka.jp\0nic.tj\0" -"lib.gu.us\0" -"k12.la.us\0" -"konyvelo.hu\0trolley.museum\0bradesco\0is-a-liberal.com\0" -"mihama.chiba.jp\0misato.miyagi.jp\0madrid\0" -"yalta.ua\0accenture\0" -"b\xc3\xa1l\xc3\xa1t.no\0" -"fujisawa.iwate.jp\0saiki.oita.jp\0" -"countryestate.museum\0*.ye\0" -"yuu.yamaguchi.jp\0" -"airguard.museum\0horten.no\0" -"lukow.pl\0" -"nhs.uk\0" -"forum.hu\0" -"ag.it\0chiryu.aichi.jp\0nankoku.kochi.jp\0" -"asahi.ibaraki.jp\0" -"tr\xc3\xb8gstad.no\0" -"mn.it\0setouchi.okayama.jp\0" -"utsira.no\0cc.la.us\0*.za\0ibm\0" -"uda.nara.jp\0kitagata.saga.jp\0arakawa.saitama.jp\0\xe5\x95\x86\xe5\x9f\x8e\0" -"hole.no\0" -"he.cn\0shiraoi.hokkaido.jp\0mimata.miyazaki.jp\0" -"shingo.aomori.jp\0tateyama.chiba.jp\0kaita.hiroshima.jp\0" -"database.museum\0vodka\0" -"lardal.no\0ice\0" -"spy.museum\0*.zm\0" -"hiraizumi.iwate.jp\0" -"airtraffic.aero\0" -"trentinoaltoadige.it\0" -"enna.it\0" -"association.aero\0*.zw\0" -"funagata.yamagata.jp\0" -"kaluga.ru\0clinic\0icu\0" -"okayama.okayama.jp\0" -"is-a-techie.com\0" -"nl.ca\0virtuel.museum\0" -"waw.pl\0" -"is-a-rockstar.com\0" -"higashimatsushima.miyagi.jp\0iruma.saitama.jp\0" -"yusui.kagoshima.jp\0kalisz.pl\0" -"from-va.com\0" -"hiranai.aomori.jp\0" -"te.it\0beer\0" -"mallorca.museum\0svelvik.no\0" -"career\0" -"tver.ru\0" +"minamifurano.hokkaido.jp\0" +"kin.okinawa.jp\0engerdal.no\0" +"games\0" +"amber.museum\0" +"simbirsk.ru\0" +"sn\xc3\xa5""ase.no\0" +"*.alces.network\0" +"\xe6\x89\x8b\xe6\x9c\xba\0" +"unzen.nagasaki.jp\0" +"shikabe.hokkaido.jp\0hirado.nagasaki.jp\0no.eu.org\0" +"minano.saitama.jp\0" +"murata.miyagi.jp\0itau\0" +"kitagawa.kochi.jp\0" +"gr.com\0" +"windmill.museum\0in-the-band.net\0" +"express.aero\0\xd9\x82\xd8\xb7\xd8\xb1\0" +"fm.no\0" +"6.bg\0wajiki.tokushima.jp\0" +"bonn.museum\0" +"shiraoka.saitama.jp\0" +"ah.cn\0" +"pvt.ge\0anan.tokushima.jp\0" +"bibai.hokkaido.jp\0katsuragi.wakayama.jp\0chuo.yamanashi.jp\0" +"ra.it\0naroy.no\0buryatia.ru\0" +"tatebayashi.gunma.jp\0wakasa.tottori.jp\0swatch\0" +"oshino.yamanashi.jp\0dyndns-mail.com\0" +"earth\0" +"vestre-slidre.no\0" +"cahcesuolo.no\0" +"wios.gov.pl\0wanggou\0" +"matsukawa.nagano.jp\0tyumen.ru\0" +"kolobrzeg.pl\0" +"morotsuka.miyazaki.jp\0olkusz.pl\0" +"taxi\0" +"bloxcms.com\0" +"filatelia.museum\0vagsoy.no\0" +"luroy.no\0" +"yabuki.fukushima.jp\0sokndal.no\0" +"pccw\0" +"polkowice.pl\0" +"name.hr\0" +"vercelli.it\0" +"aquila.it\0" +"vdonsk.ru\0melbourne\0" +"yamagata.gifu.jp\0" +"oji.nara.jp\0snaase.no\0" +"kakegawa.shizuoka.jp\0chocolate.museum\0" +"kashiba.nara.jp\0" +"hamatama.saga.jp\0kirovograd.ua\0" +"lancia\0" +"name.et\0" +"wakasa.fukui.jp\0lans.museum\0" +"freebox-os.com\0" +"takanezawa.tochigi.jp\0ltd.uk\0" +"beauty\0" +"cng.br\0eiheiji.fukui.jp\0" +"taishin.fukushima.jp\0versicherung\0" +"nishiarita.saga.jp\0" +"national.museum\0mattel\0wed\0" +"\xe9\xa3\x9f\xe5\x93\x81\0" +"kikuchi.kumamoto.jp\0" +"nz.eu.org\0" +"global.ssl.fastly.net\0" +"sanuki.kagawa.jp\0" +"iwate.iwate.jp\0" +"gc.ca\0" +"kakamigahara.gifu.jp\0selfip.info\0" +"belau.pw\0" +"kita.osaka.jp\0lib.ri.us\0" +"8.bg\0" +"museumcenter.museum\0" +"charter.aero\0" +"name.cy\0berlin.museum\0" +"suzu.ishikawa.jp\0kv.ua\0" +"sa.gov.pl\0" +"kharkov.ua\0cc.co.us\0" +"government.aero\0" +"rc.it\0" +"name.eg\0norfolk.museum\0" +"oxford.museum\0" +"salzburg.museum\0" +"\xd8\xa7\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86\0" +"\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0" +"chicago.museum\0" +"anan.nagano.jp\0" +"hidaka.saitama.jp\0" +"minamidaito.okinawa.jp\0" +"name.az\0\xe5\xb1\xb1\xe5\xbd\xa2.jp\0tienda\0" +"badajoz.museum\0\xe9\x9b\x86\xe5\x9b\xa2\0" +"net-freaks.com\0" +"trentinos-tirol.it\0" +"wmflabs.org\0" +"rockart.museum\0swidnica.pl\0makeup\0" +"univ.sn\0dell\0" +"settlers.museum\0" +"madrid.museum\0" +"tsurugi.ishikawa.jp\0gran.no\0" +"imb.br\0" +"nakagawa.hokkaido.jp\0manno.kagawa.jp\0" +"trust.museum\0\xd8\xb3\xd9\x88\xd8\xaf\xd8\xa7\xd9\x86\0" +"k12.nv.us\0win\0" +"fashion\0" +"agano.niigata.jp\0" +"mol.it\0kamiichi.toyama.jp\0lyngdal.no\0" +"wuoz.gov.pl\0best\0eating-organic.net\0" +"tozawa.yamagata.jp\0" +"meeres.museum\0" +"indian.museum\0" +"kutchan.hokkaido.jp\0kosuge.yamanashi.jp\0snoasa.no\0" +"higashi.okinawa.jp\0meguro.tokyo.jp\0origins\0\xd9\x83\xd8\xa7\xd8\xab\xd9\x88\xd9\x84\xd9\x8a\xd9\x83\0" +"auto\0" +"bearalvahki.no\0" +"ah.no\0" +"amsterdam.museum\0" +"collegefan.org\0" +"ln.cn\0yoshioka.gunma.jp\0" +"toyone.aichi.jp\0" +"webhop.net\0" +"sanjo.niigata.jp\0eastcoast.museum\0" +"re.it\0h\xc3\xb8yanger.no\0" +"kuchinotsu.nagasaki.jp\0" +"zara\0" +"okagaki.fukuoka.jp\0" +"date.fukushima.jp\0" +"accident-prevention.aero\0design.aero\0" +"kyoto.jp\0homesense\0piaget\0wme\0" +"hanyu.saitama.jp\0nuremberg.museum\0utah.museum\0" +"historichouses.museum\0" +"moscow.museum\0stateofdelaware.museum\0" +"from-al.com\0" +"denmark.museum\0" +"sukumo.kochi.jp\0" +"nexus\0" +"trentino-altoadige.it\0" +"smile\0" +"iwama.ibaraki.jp\0karikatur.museum\0\xe6\x9b\xb8\xe7\xb1\x8d\0" +"re.kr\0" +"suisse.museum\0" +"from-ca.com\0" +"usantiques.museum\0" +"vyatka.ru\0\xe5\x8f\xb0\xe7\x81\xa3\0guge\0" +"\xce\xb5\xce\xbb\0" +"yusui.kagoshima.jp\0sytes.net\0" +"shimotsuke.tochigi.jp\0" +"k12.oh.us\0stufftoread.com\0" +"hikimi.shimane.jp\0" +"qc.com\0googleapis.com\0" +"goodyear\0" +"nalchik.ru\0" +"desi\0" +"bremanger.no\0" +"chuo.tokyo.jp\0" +"wow\0" +"christmas\0cricket\0" +"kchr.ru\0" +"bale.museum\0" +"nalchik.su\0" +"ogawa.ibaraki.jp\0" +"toda.saitama.jp\0\xe0\xae\x87\xe0\xae\xb2\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xaf\x88\0surgery\0" +"kita.kyoto.jp\0gjesdal.no\0energy\0" +"zachpomor.pl\0" +"\xe8\xb4\xad\xe7\x89\xa9\0" +"tydal.no\0wielun.pl\0" +"otaki.nagano.jp\0" +"sasayama.hyogo.jp\0fed.us\0" +"cc.tn.us\0" +"cc.il.us\0" +"motoyama.kochi.jp\0broadcast.museum\0cc.dc.us\0" +"suwa.nagano.jp\0" +"voagat.no\0" +"off.ai\0nagara.chiba.jp\0" +"rg.it\0\xe0\xb8\x84\xe0\xb8\xad\xe0\xb8\xa1\0" +"os.hordaland.no\0hu.net\0" +"ge.it\0" +"al.it\0" +"olecko.pl\0" +"shibukawa.gunma.jp\0" +"bergamo.it\0" +"mielno.pl\0ga.us\0" }; static const quint16 tldChunkCount = 2; -static const quint32 tldChunks[] = {65528, 84704}; +static const quint32 tldChunks[] = {65512, 93761}; QT_END_NAMESPACE diff --git a/src/corelib/io/qurltlds_p.h.INFO b/src/corelib/io/qurltlds_p.h.INFO index 7e5c0bb19f..3f3d808a21 100644 --- a/src/corelib/io/qurltlds_p.h.INFO +++ b/src/corelib/io/qurltlds_p.h.INFO @@ -9,8 +9,8 @@ Those arrays in qurltlds_p.h are derived from the Public Suffix List ([2]), which was originally provided by Jo Hermans . -The file qurltlds_p.h was last generated Wednesday, -February 11th 14:36 2015. +The file qurltlds_p.h was last generated Thursday, +October 20th 8:40 2016. ---- [1] list: http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1 -- cgit v1.2.3 From 49d3bb005889b9fb5a06d6aadac23ebd5b2f9f2d Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Thu, 6 Oct 2016 11:24:38 +0200 Subject: Normalize realpath(3) output to composed form MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All strings coming out of POSIX API calls are converted to composed form by QFile::decodeName. Do the same for realpath(3) output. This is especially important for HFS+, which will store file names in decomposed form, and APIs will therefore return strings in decomposed form. Task-number: QTBUG-55896 Change-Id: I5e51f4e5712ff26bf9644cbcf9a9603995748892 Reviewed-by: Morten Johan Sørvig --- src/corelib/io/qfilesystemengine_unix.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/corelib/io/qfilesystemengine_unix.cpp b/src/corelib/io/qfilesystemengine_unix.cpp index 7bc2293b0d..3cc27bf847 100644 --- a/src/corelib/io/qfilesystemengine_unix.cpp +++ b/src/corelib/io/qfilesystemengine_unix.cpp @@ -276,7 +276,7 @@ QFileSystemEntry QFileSystemEngine::canonicalName(const QFileSystemEntry &entry, if (ret) { data.knownFlagsMask |= QFileSystemMetaData::ExistsAttribute; data.entryFlags |= QFileSystemMetaData::ExistsAttribute; - QString canonicalPath = QDir::cleanPath(QString::fromLocal8Bit(ret)); + QString canonicalPath = QDir::cleanPath(QFile::decodeName(ret)); free(ret); return QFileSystemEntry(canonicalPath); } else if (errno == ENOENT) { // file doesn't exist -- cgit v1.2.3 From ef88bf02efdfb1bde447ed924b30b656356a2f59 Mon Sep 17 00:00:00 2001 From: Frederik Schwarzer Date: Tue, 18 Oct 2016 17:38:17 +0200 Subject: Fix some typos in docs and apidocs While "commonest" is still correct English, it's rather old-fashioned and "most common" predominates Qt's wording style. Change-Id: I20d72c098ee40b2a89f91e42f7208fe5b87286a2 Reviewed-by: Frederik Gladhorn --- src/corelib/doc/src/eventsandfilters.qdoc | 2 +- src/corelib/io/qurl.cpp | 2 +- src/corelib/kernel/qcoreapplication.cpp | 2 +- src/corelib/tools/qregularexpression.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/corelib/doc/src/eventsandfilters.qdoc b/src/corelib/doc/src/eventsandfilters.qdoc index 99a40bb1b8..64f015b9cc 100644 --- a/src/corelib/doc/src/eventsandfilters.qdoc +++ b/src/corelib/doc/src/eventsandfilters.qdoc @@ -80,7 +80,7 @@ \section1 Event Types - Most events types have special classes, notably QResizeEvent, + Most event types have special classes, notably QResizeEvent, QPaintEvent, QMouseEvent, QKeyEvent, and QCloseEvent. Each class subclasses QEvent and adds event-specific functions. For example, QResizeEvent adds \l{QResizeEvent::}{size()} and diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp index a5643d123d..7512bcd83f 100644 --- a/src/corelib/io/qurl.cpp +++ b/src/corelib/io/qurl.cpp @@ -149,7 +149,7 @@ dealing with URLs and strings: \list - \li When creating an QString to contain a URL from a QByteArray or a + \li When creating a QString to contain a URL from a QByteArray or a char*, always use QString::fromUtf8(). \endlist */ diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp index f5b15207cc..bd3c12ce97 100644 --- a/src/corelib/kernel/qcoreapplication.cpp +++ b/src/corelib/kernel/qcoreapplication.cpp @@ -1031,7 +1031,7 @@ bool QCoreApplication::notifyInternal2(QObject *receiver, QEvent *event) approaches are listed below: \list 1 \li Reimplementing \l {QWidget::}{paintEvent()}, \l {QWidget::}{mousePressEvent()} and so - on. This is the commonest, easiest, and least powerful way. + on. This is the most common, easiest, and least powerful way. \li Reimplementing this function. This is very powerful, providing complete control; but only one subclass can be active at a time. diff --git a/src/corelib/tools/qregularexpression.cpp b/src/corelib/tools/qregularexpression.cpp index 81b108059b..9781733abb 100644 --- a/src/corelib/tools/qregularexpression.cpp +++ b/src/corelib/tools/qregularexpression.cpp @@ -542,7 +542,7 @@ QT_BEGIN_NAMESPACE \inmodule QtCore \reentrant - \brief The QRegularExpressionMatch class provides the results of a matching + \brief The QRegularExpressionMatch class provides the results of matching a QRegularExpression against a string. \since 5.0 -- cgit v1.2.3 From 92df823ed6170f6d9d33687e9a8c4f215f7db2a9 Mon Sep 17 00:00:00 2001 From: Frederik Schwarzer Date: Thu, 20 Oct 2016 16:41:49 +0200 Subject: QFileInfo: fix double sentence in apidoc Change-Id: Ie1cf32565b2fcb828ec381c45595adad1392e2ec Reviewed-by: Frederik Gladhorn --- src/corelib/io/qfileinfo.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src') diff --git a/src/corelib/io/qfileinfo.cpp b/src/corelib/io/qfileinfo.cpp index 3458d5eb25..d2e287039f 100644 --- a/src/corelib/io/qfileinfo.cpp +++ b/src/corelib/io/qfileinfo.cpp @@ -287,8 +287,7 @@ QDateTime &QFileInfoPrivate::getFileTime(QAbstractFileEngine::FileTime request) \note To speed up performance, QFileInfo caches information about the file. - To speed up performance, QFileInfo caches information about the - file. Because files can be changed by other users or programs, or + Because files can be changed by other users or programs, or even by other parts of the same program, there is a function that refreshes the file information: refresh(). If you want to switch off a QFileInfo's caching and force it to access the file system -- cgit v1.2.3 From 016b5bc949b6dfb2f76db2e8b40a40e7eaee6828 Mon Sep 17 00:00:00 2001 From: Anton Kudryavtsev Date: Wed, 19 Oct 2016 12:20:10 +0300 Subject: Plugins: use reserve() to optimize memory allocations Change-Id: Id78ce43137e352292a9933222fe2f92d4ff4d69b Reviewed-by: Edward Welbourne Reviewed-by: Thiago Macieira --- src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp | 1 + src/plugins/platforms/mirclient/qmirclientinput.cpp | 1 + src/plugins/platforms/openwfd/qopenwfdintegration.cpp | 1 + src/plugins/platforms/qnx/qqnxbuttoneventnotifier.cpp | 1 + src/plugins/platforms/xcb/qxcbmime.cpp | 1 + 5 files changed, 5 insertions(+) (limited to 'src') diff --git a/src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp b/src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp index a4d7e504b7..bd25992457 100644 --- a/src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp +++ b/src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp @@ -255,6 +255,7 @@ void TableGenerator::initPossibleLocations() // never meant for external software to parse compose tables directly. Best we // can do is to hardcode search paths. To add an extra system path use // the QTCOMPOSE environment variable + m_possibleLocations.reserve(7); if (qEnvironmentVariableIsSet("QTCOMPOSE")) m_possibleLocations.append(QString::fromLocal8Bit(qgetenv("QTCOMPOSE"))); m_possibleLocations.append(QStringLiteral("/usr/share/X11/locale")); diff --git a/src/plugins/platforms/mirclient/qmirclientinput.cpp b/src/plugins/platforms/mirclient/qmirclientinput.cpp index 4817185d41..b3b21ae0e3 100644 --- a/src/plugins/platforms/mirclient/qmirclientinput.cpp +++ b/src/plugins/platforms/mirclient/qmirclientinput.cpp @@ -347,6 +347,7 @@ void QMirClientInput::dispatchTouchEvent(QMirClientWindow *window, const MirInpu // TODO: Is it worth setting the Qt::TouchPointStationary ones? Currently they are left // as Qt::TouchPointMoved const unsigned int kPointerCount = mir_touch_event_point_count(tev); + touchPoints.reserve(int(kPointerCount)); for (unsigned int i = 0; i < kPointerCount; ++i) { QWindowSystemInterface::TouchPoint touchPoint; diff --git a/src/plugins/platforms/openwfd/qopenwfdintegration.cpp b/src/plugins/platforms/openwfd/qopenwfdintegration.cpp index 9ed61f7b2e..4850ca2e45 100644 --- a/src/plugins/platforms/openwfd/qopenwfdintegration.cpp +++ b/src/plugins/platforms/openwfd/qopenwfdintegration.cpp @@ -68,6 +68,7 @@ QOpenWFDIntegration::QOpenWFDIntegration() int actualNumberOfDevices = wfdEnumerateDevices(devices,numberOfDevices,0); Q_ASSERT(actualNumberOfDevices == numberOfDevices); + mDevices.reserve(actualNumberOfDevices); for (int i = 0; i < actualNumberOfDevices; i++) { mDevices.append(new QOpenWFDDevice(this,devices[i])); } diff --git a/src/plugins/platforms/qnx/qqnxbuttoneventnotifier.cpp b/src/plugins/platforms/qnx/qqnxbuttoneventnotifier.cpp index 90a09d3087..a6236f2376 100644 --- a/src/plugins/platforms/qnx/qqnxbuttoneventnotifier.cpp +++ b/src/plugins/platforms/qnx/qqnxbuttoneventnotifier.cpp @@ -67,6 +67,7 @@ QQnxButtonEventNotifier::QQnxButtonEventNotifier(QObject *parent) // fetch the new button ids int enumeratorIndex = QQnxButtonEventNotifier::staticMetaObject.indexOfEnumerator(QByteArrayLiteral("ButtonId")); QMetaEnum enumerator = QQnxButtonEventNotifier::staticMetaObject.enumerator(enumeratorIndex); + m_buttonKeys.reserve(ButtonCount - bid_minus); for (int buttonId = bid_minus; buttonId < ButtonCount; ++buttonId) { m_buttonKeys.append(enumerator.valueToKey(buttonId)); m_state[buttonId] = ButtonUp; diff --git a/src/plugins/platforms/xcb/qxcbmime.cpp b/src/plugins/platforms/xcb/qxcbmime.cpp index 3e9b0e1e4a..3643b3e975 100644 --- a/src/plugins/platforms/xcb/qxcbmime.cpp +++ b/src/plugins/platforms/xcb/qxcbmime.cpp @@ -210,6 +210,7 @@ QVariant QXcbMime::mimeConvertToFormat(QXcbConnection *connection, xcb_atom_t a, if (format == QLatin1String("text/uri-list")) { const auto urls = str.splitRef(QLatin1Char('\n')); QList list; + list.reserve(urls.size()); for (const QStringRef &s : urls) { const QUrl url(s.trimmed().toString()); if (url.isValid()) -- cgit v1.2.3 From 10b9321c1dc19236620ba20bdf54cae73891d1ef Mon Sep 17 00:00:00 2001 From: Anton Kudryavtsev Date: Wed, 19 Oct 2016 15:30:58 +0300 Subject: qxcbconnection.cpp: fix warning about unused function isXIEvent() is used iff XCB_USE_XINPUT2 is defined. So move declaration of the function in XCB_USE_XINPUT2 define scope. Change-Id: I6f045cd07d572ee7425ee6edc5ac73dcf0afdb37 Reviewed-by: Edward Welbourne Reviewed-by: Thiago Macieira --- src/plugins/platforms/xcb/qxcbconnection.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src') diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp index c533a2a5f5..3d808d1d37 100644 --- a/src/plugins/platforms/xcb/qxcbconnection.cpp +++ b/src/plugins/platforms/xcb/qxcbconnection.cpp @@ -110,6 +110,7 @@ Q_LOGGING_CATEGORY(lcQpaScreen, "qt.qpa.screen") #define XCB_GE_GENERIC 35 #endif +#if defined(XCB_USE_XINPUT2) // Starting from the xcb version 1.9.3 struct xcb_ge_event_t has changed: // - "pad0" became "extension" // - "pad1" and "pad" became "pad0" @@ -127,6 +128,7 @@ static inline bool isXIEvent(xcb_generic_event_t *event, int opCode) qt_xcb_ge_event_t *e = (qt_xcb_ge_event_t *)event; return e->extension == opCode; } +#endif // XCB_USE_XINPUT2 #ifdef XCB_USE_XLIB static const char * const xcbConnectionErrors[] = { -- cgit v1.2.3 From 512934f7e70592ed06a790fcb46dde1e435b488e Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Mon, 10 Oct 2016 15:29:26 +0200 Subject: HTTP/2 - fix the handling of PUSH_PROMISE HTTP/2 allows a server to pre-emptively send (or "push") responses (along with corresponding "promised" requests) to a client in association with a previous client-initiated request. This can be useful when the server knows the client will need to have those responses available in order to fully process the response to the original request. Server push is semantically equivalent to a server responding to a request; however, in this case, that request is also sent by the server, as a PUSH_PROMISE frame. The PUSH_PROMISE frame includes a header block that contains a complete set of request header fields that the server attributes to the request. After sending the PUSH_PROMISE frame, the server can begin delivering the pushed response as a response on a server-initiated stream that uses the promised stream identifier. This patch: - fixes the HPACK decompression of PUSH_PROMISE frames; - allows a user to enable PUSH_PROMISE; - processes and caches pushed data for promised streams; - updates auto-test - emulates a simple PUSH_PROMISE scenario. Change-Id: Ic4850863a5e3895320baac3871a723fc091b4aca Reviewed-by: Edward Welbourne --- src/network/access/http2/http2frames.cpp | 33 +++ src/network/access/http2/http2frames_p.h | 35 ++- src/network/access/http2/http2protocol_p.h | 4 + src/network/access/http2/http2streams.cpp | 11 +- src/network/access/http2/http2streams_p.h | 25 +- src/network/access/qhttp2protocolhandler.cpp | 372 +++++++++++++++++++++------ src/network/access/qhttp2protocolhandler_p.h | 19 +- 7 files changed, 400 insertions(+), 99 deletions(-) (limited to 'src') diff --git a/src/network/access/http2/http2frames.cpp b/src/network/access/http2/http2frames.cpp index 978bee09b1..5a684c2f41 100644 --- a/src/network/access/http2/http2frames.cpp +++ b/src/network/access/http2/http2frames.cpp @@ -244,6 +244,24 @@ quint32 Frame::dataSize() const return size; } +quint32 Frame::hpackBlockSize() const +{ + Q_ASSERT(validatePayload() == FrameStatus::goodFrame); + + const auto frameType = type(); + Q_ASSERT(frameType == FrameType::HEADERS || + frameType == FrameType::PUSH_PROMISE || + frameType == FrameType::CONTINUATION); + + quint32 size = dataSize(); + if (frameType == FrameType::PUSH_PROMISE) { + Q_ASSERT(size >= 4); + size -= 4; + } + + return size; +} + const uchar *Frame::dataBegin() const { Q_ASSERT(validatePayload() == FrameStatus::goodFrame); @@ -260,6 +278,21 @@ const uchar *Frame::dataBegin() const return src; } +const uchar *Frame::hpackBlockBegin() const +{ + Q_ASSERT(validatePayload() == FrameStatus::goodFrame); + + const auto frameType = type(); + Q_ASSERT(frameType == FrameType::HEADERS || + frameType == FrameType::PUSH_PROMISE || + frameType == FrameType::CONTINUATION); + + const uchar *begin = dataBegin(); + if (frameType == FrameType::PUSH_PROMISE) + begin += 4; // That's a promised stream, skip it. + return begin; +} + FrameStatus FrameReader::read(QAbstractSocket &socket) { if (offset < frameHeaderSize) { diff --git a/src/network/access/http2/http2frames_p.h b/src/network/access/http2/http2frames_p.h index 84ba9c3662..e5f6d46c67 100644 --- a/src/network/access/http2/http2frames_p.h +++ b/src/network/access/http2/http2frames_p.h @@ -71,27 +71,29 @@ namespace Http2 struct Q_AUTOTEST_EXPORT Frame { Frame(); - // Reading these values without first forming a valid frame - // (either reading it from a socket or building it) will result - // in undefined behavior: + // Reading these values without first forming a valid frame (either reading + // it from a socket or building it) will result in undefined behavior: FrameType type() const; quint32 streamID() const; FrameFlags flags() const; quint32 payloadSize() const; uchar padding() const; - // In HTTP/2 a stream's priority is specified by its weight - // and a stream (id) it depends on: + // In HTTP/2 a stream's priority is specified by its weight and a stream + // (id) it depends on: bool priority(quint32 *streamID = nullptr, uchar *weight = nullptr) const; FrameStatus validateHeader() const; FrameStatus validatePayload() const; - // Number of payload bytes without padding and/or priority + // Number of payload bytes without padding and/or priority. quint32 dataSize() const; - // Beginning of payload without priority/padding - // bytes. + // HEADERS data size for HEADERS, PUSH_PROMISE and CONTINUATION streams: + quint32 hpackBlockSize() const; + // Beginning of payload without priority/padding bytes. const uchar *dataBegin() const; + // HEADERS data beginning for HEADERS, PUSH_PROMISE and CONTINUATION streams: + const uchar *hpackBlockBegin() const; std::vector buffer; }; @@ -134,8 +136,7 @@ public: void setFlags(FrameFlags flags); void addFlag(FrameFlag flag); - // All append functions also update frame's payload - // length. + // All append functions also update frame's payload length. template void append(ValueType val) { @@ -161,16 +162,14 @@ public: // Write as a single frame: bool write(QAbstractSocket &socket) const; - // Two types of frames we are sending are affected by - // frame size limits: HEADERS and DATA. HEADERS' payload - // (hpacked HTTP headers, following a frame header) - // is always in our 'buffer', we send the initial HEADERS + // Two types of frames we are sending are affected by frame size limits: + // HEADERS and DATA. HEADERS' payload (hpacked HTTP headers, following a + // frame header) is always in our 'buffer', we send the initial HEADERS // frame first and then CONTINUTATION frame(s) if needed: bool writeHEADERS(QAbstractSocket &socket, quint32 sizeLimit); - // With DATA frames the actual payload is never in our 'buffer', - // it's a 'readPointer' from QNonContiguousData. We split - // this payload as needed into DATA frames with correct - // payload size fitting into frame size limit: + // With DATA frames the actual payload is never in our 'buffer', it's a + // 'readPointer' from QNonContiguousData. We split this payload as needed + // into DATA frames with correct payload size fitting into frame size limit: bool writeDATA(QAbstractSocket &socket, quint32 sizeLimit, const uchar *src, quint32 size); private: diff --git a/src/network/access/http2/http2protocol_p.h b/src/network/access/http2/http2protocol_p.h index 5c46949e23..5d730404bb 100644 --- a/src/network/access/http2/http2protocol_p.h +++ b/src/network/access/http2/http2protocol_p.h @@ -127,6 +127,10 @@ enum Http2PredefinedParameters maxConcurrentStreams = 100 // HTTP/2, 6.5.2 }; +// It's int, it has internal linkage, it's ok to have it in headers - +// no ODR violation is possible. +const quint32 lastValidStreamID((quint32(1) << 31) - 1); // HTTP/2, 5.1.1 + extern const Q_AUTOTEST_EXPORT char Http2clientPreface[clientPrefaceLength]; enum class FrameStatus diff --git a/src/network/access/http2/http2streams.cpp b/src/network/access/http2/http2streams.cpp index 660100f5e4..fa39c1d57b 100644 --- a/src/network/access/http2/http2streams.cpp +++ b/src/network/access/http2/http2streams.cpp @@ -61,6 +61,15 @@ Stream::Stream(const HttpMessagePair &message, quint32 id, qint32 sendSize, qint { } +Stream::Stream(const QString &cacheKey, quint32 id, qint32 recvSize) + : streamID(id), + // sendWindow is 0, this stream only receives data + recvWindow(recvSize), + state(remoteReserved), + key(cacheKey) +{ +} + QHttpNetworkReply *Stream::reply() const { return httpPair.second; @@ -99,6 +108,6 @@ QNonContiguousByteDevice *Stream::data() const return httpPair.first.uploadByteDevice(); } -} +} // namespace Http2 QT_END_NAMESPACE diff --git a/src/network/access/http2/http2streams_p.h b/src/network/access/http2/http2streams_p.h index 8a825a5457..8465486ae8 100644 --- a/src/network/access/http2/http2streams_p.h +++ b/src/network/access/http2/http2streams_p.h @@ -51,10 +51,16 @@ // We mean it. // +#include "http2frames_p.h" +#include "hpack_p.h" + #include #include #include +#include + +#include QT_BEGIN_NAMESPACE @@ -70,12 +76,16 @@ struct Q_AUTOTEST_EXPORT Stream open, halfClosedLocal, halfClosedRemote, + remoteReserved, closed }; Stream(); + // That's a ctor for a client-initiated stream: Stream(const HttpMessagePair &message, quint32 streamID, qint32 sendSize, qint32 recvSize); + // That's a reserved stream, created by PUSH_PROMISE from a server: + Stream(const QString &key, quint32 streamID, qint32 recvSize); QHttpNetworkReply *reply() const; const QHttpNetworkRequest &request() const; @@ -92,9 +102,22 @@ struct Q_AUTOTEST_EXPORT Stream qint32 recvWindow = 65535; StreamState state = idle; + QString key; // for PUSH_PROMISE +}; + +struct PushPromise +{ + quint32 reservedID = 0; + // PUSH_PROMISE has its own HEADERS, + // usually similar to what request has: + HPack::HttpHeader pushHeader; + // Response has its own (normal) HEADERS: + HPack::HttpHeader responseHeader; + // DATA frames on a promised stream: + std::vector dataFrames; }; -} +} // namespace Http2 QT_END_NAMESPACE diff --git a/src/network/access/qhttp2protocolhandler.cpp b/src/network/access/qhttp2protocolhandler.cpp index 68a00c6837..3fa0c18dc0 100644 --- a/src/network/access/qhttp2protocolhandler.cpp +++ b/src/network/access/qhttp2protocolhandler.cpp @@ -108,6 +108,41 @@ HPack::HttpHeader build_headers(const QHttpNetworkRequest &request, quint32 maxH return header; } +std::vector assemble_hpack_block(const std::vector &frames) +{ + std::vector hpackBlock; + + quint32 total = 0; + for (const auto &frame : frames) + total += frame.hpackBlockSize(); + + if (!total) + return hpackBlock; + + hpackBlock.resize(total); + auto dst = hpackBlock.begin(); + for (const auto &frame : frames) { + if (const auto hpackBlockSize = frame.hpackBlockSize()) { + const uchar *src = frame.hpackBlockBegin(); + std::copy(src, src + hpackBlockSize, dst); + dst += hpackBlockSize; + } + } + + return hpackBlock; +} + +QUrl urlkey_from_request(const QHttpNetworkRequest &request) +{ + QUrl url; + + url.setScheme(request.url().scheme()); + url.setAuthority(request.url().authority(QUrl::FullyEncoded | QUrl::RemoveUserInfo)); + url.setPath(QLatin1String(request.uri(false))); + + return url; +} + bool sum_will_overflow(qint32 windowSize, qint32 delta) { if (windowSize > 0) @@ -131,6 +166,9 @@ QHttp2ProtocolHandler::QHttp2ProtocolHandler(QHttpNetworkConnectionChannel *chan encoder(HPack::FieldLookupTable::DefaultSize, true) { continuedFrames.reserve(20); + bool ok = false; + const int env = qEnvironmentVariableIntValue("QT_HTTP2_ENABLE_PUSH_PROMISE", &ok); + pushPromiseEnabled = ok && env; } void QHttp2ProtocolHandler::_q_uploadDataReadyRead() @@ -241,10 +279,25 @@ bool QHttp2ProtocolHandler::sendRequest() if (!requests.size()) return true; + m_channel->state = QHttpNetworkConnectionChannel::WritingState; + // Check what was promised/pushed, maybe we do not have to send a request + // and have a response already? + + for (auto it = requests.begin(), endIt = requests.end(); it != endIt;) { + const auto key = urlkey_from_request(it->first).toString(); + if (!promisedData.contains(key)) { + ++it; + continue; + } + // Woo-hoo, we do not have to ask, the answer is ready for us: + HttpMessagePair message = *it; + it = requests.erase(it); + initReplyFromPushPromise(message, key); + } + const auto streamsToUse = std::min(maxConcurrentStreams - activeStreams.size(), requests.size()); auto it = requests.begin(); - m_channel->state = QHttpNetworkConnectionChannel::WritingState; for (quint32 i = 0; i < streamsToUse; ++i) { const qint32 newStreamID = createNewStream(*it); if (!newStreamID) { @@ -293,11 +346,11 @@ bool QHttp2ProtocolHandler::sendClientPreface() // 6.5 SETTINGS frameWriter.start(FrameType::SETTINGS, FrameFlag::EMPTY, Http2::connectionStreamID); - // MAX frame size (16 kb), disable PUSH + // MAX frame size (16 kb), enable/disable PUSH frameWriter.append(Settings::MAX_FRAME_SIZE_ID); frameWriter.append(quint32(Http2::maxFrameSize)); frameWriter.append(Settings::ENABLE_PUSH_ID); - frameWriter.append(quint32(0)); + frameWriter.append(quint32(pushPromiseEnabled)); if (!frameWriter.write(*m_socket)) return false; @@ -621,7 +674,7 @@ void QHttp2ProtocolHandler::handlePUSH_PROMISE() // 6.6 PUSH_PROMISE. Q_ASSERT(inboundFrame.type() == FrameType::PUSH_PROMISE); - if (prefaceSent && !waitingForSettingsACK) { + if (!pushPromiseEnabled && prefaceSent && !waitingForSettingsACK) { // This means, server ACKed our 'NO PUSH', // but sent us PUSH_PROMISE anyway. return connectionError(PROTOCOL_ERROR, "unexpected PUSH_PROMISE frame"); @@ -639,15 +692,19 @@ void QHttp2ProtocolHandler::handlePUSH_PROMISE() } const auto reservedID = qFromBigEndian(inboundFrame.dataBegin()); - if (!reservedID || (reservedID & 0x1)) { + if ((reservedID & 1) || reservedID <= lastPromisedID || + reservedID > Http2::lastValidStreamID) { return connectionError(PROTOCOL_ERROR, "PUSH_PROMISE with invalid promised stream ID"); } - // "ignoring a PUSH_PROMISE frame causes the stream - // state to become indeterminate" - let's RST_STREAM it then ... - sendRST_STREAM(reservedID, REFUSE_STREAM); - markAsReset(reservedID); + lastPromisedID = reservedID; + + if (!pushPromiseEnabled) { + // "ignoring a PUSH_PROMISE frame causes the stream state to become + // indeterminate" - let's send RST_STREAM frame with REFUSE_STREAM code. + resetPromisedStream(inboundFrame, Http2::REFUSE_STREAM); + } const bool endHeaders = inboundFrame.flags().testFlag(FrameFlag::END_HEADERS); continuedFrames.clear(); @@ -710,7 +767,7 @@ void QHttp2ProtocolHandler::handleGOAWAY() // "A server that is attempting to gracefully shut down a connection SHOULD // send an initial GOAWAY frame with the last stream identifier set to 2^31-1 // and a NO_ERROR code." - if (lastStreamID != (quint32(1) << 31) - 1 || errorCode != HTTP2_NO_ERROR) + if (lastStreamID != Http2::lastValidStreamID || errorCode != HTTP2_NO_ERROR) return connectionError(PROTOCOL_ERROR, "GOAWAY invalid stream/error code"); lastStreamID = 1; } else { @@ -795,16 +852,24 @@ void QHttp2ProtocolHandler::handleCONTINUATION() void QHttp2ProtocolHandler::handleContinuedHEADERS() { + // 'Continued' HEADERS can be: the initial HEADERS/PUSH_PROMISE frame + // with/without END_HEADERS flag set plus, if no END_HEADERS flag, + // a sequence of one or more CONTINUATION frames. Q_ASSERT(continuedFrames.size()); + const auto firstFrameType = continuedFrames[0].type(); + Q_ASSERT(firstFrameType == FrameType::HEADERS || + firstFrameType == FrameType::PUSH_PROMISE); const auto streamID = continuedFrames[0].streamID(); - if (continuedFrames[0].type() == FrameType::HEADERS) { + if (firstFrameType == FrameType::HEADERS) { if (activeStreams.contains(streamID)) { Stream &stream = activeStreams[streamID]; - if (stream.state != Stream::halfClosedLocal) { - // If we're receiving headers, they're a response to a request we sent; - // and we closed our end when we finished sending that. + if (stream.state != Stream::halfClosedLocal + && stream.state != Stream::remoteReserved) { + // We can receive HEADERS on streams initiated by our requests + // (these streams are in halfClosedLocal state) or remote-reserved + // streams from a server's PUSH_PROMISE. finishStreamWithError(stream, QNetworkReply::ProtocolInvalidOperationError, QLatin1String("HEADERS on invalid stream")); sendRST_STREAM(streamID, CANCEL); @@ -815,42 +880,49 @@ void QHttp2ProtocolHandler::handleContinuedHEADERS() } else if (!streamWasReset(streamID)) { return connectionError(PROTOCOL_ERROR, "HEADERS on invalid stream"); } + // Else: we cannot just ignore our peer's HEADERS frames - they change + // HPACK context - even though the stream was reset; apparently the peer + // has yet to see the reset. } - quint32 total = 0; - for (const auto &frame : continuedFrames) - total += frame.dataSize(); + std::vector hpackBlock(assemble_hpack_block(continuedFrames)); + if (!hpackBlock.size()) { + // It could be a PRIORITY sent in HEADERS - already handled by this + // point in handleHEADERS. If it was PUSH_PROMISE (HTTP/2 8.2.1): + // "The header fields in PUSH_PROMISE and any subsequent CONTINUATION + // frames MUST be a valid and complete set of request header fields + // (Section 8.1.2.3) ... If a client receives a PUSH_PROMISE that does + // not include a complete and valid set of header fields or the :method + // pseudo-header field identifies a method that is not safe, it MUST + // respond with a stream error (Section 5.4.2) of type PROTOCOL_ERROR." + if (firstFrameType == FrameType::PUSH_PROMISE) + resetPromisedStream(continuedFrames[0], Http2::PROTOCOL_ERROR); - if (!total) { - // It could be a PRIORITY sent in HEADERS - handled by this point. return; } - std::vector hpackBlock(total); - auto dst = hpackBlock.begin(); - for (const auto &frame : continuedFrames) { - if (!frame.dataSize()) - continue; - const uchar *src = frame.dataBegin(); - std::copy(src, src + frame.dataSize(), dst); - dst += frame.dataSize(); - } - - HPack::BitIStream inputStream{&hpackBlock[0], - &hpackBlock[0] + hpackBlock.size()}; - + HPack::BitIStream inputStream{&hpackBlock[0], &hpackBlock[0] + hpackBlock.size()}; if (!decoder.decodeHeaderFields(inputStream)) return connectionError(COMPRESSION_ERROR, "HPACK decompression failed"); - if (continuedFrames[0].type() == FrameType::HEADERS) { + switch (firstFrameType) { + case FrameType::HEADERS: if (activeStreams.contains(streamID)) { Stream &stream = activeStreams[streamID]; updateStream(stream, decoder.decodedHeader()); + // No DATA frames. if (continuedFrames[0].flags() & FrameFlag::END_STREAM) { finishStream(stream); deleteActiveStream(stream.streamID); } } + break; + case FrameType::PUSH_PROMISE: + if (!tryReserveStream(continuedFrames[0], decoder.decodedHeader())) + resetPromisedStream(continuedFrames[0], Http2::PROTOCOL_ERROR); + break; + default: + break; } } @@ -923,10 +995,26 @@ bool QHttp2ProtocolHandler::acceptSetting(Http2::Settings identifier, quint32 ne return true; } -void QHttp2ProtocolHandler::updateStream(Stream &stream, const HPack::HttpHeader &headers) +void QHttp2ProtocolHandler::updateStream(Stream &stream, const HPack::HttpHeader &headers, + Qt::ConnectionType connectionType) { const auto httpReply = stream.reply(); - Q_ASSERT(httpReply); + Q_ASSERT(httpReply || stream.state == Stream::remoteReserved); + + if (!httpReply) { + // It's a PUSH_PROMISEd HEADERS, no actual request/reply + // exists yet, we have to cache this data for a future + // (potential) request. + + // TODO: the part with assignment is not especially cool + // or beautiful, good that at least QByteArray is implicitly + // sharing data. To be refactored (std::move). + Q_ASSERT(promisedData.contains(stream.key)); + PushPromise &promise = promisedData[stream.key]; + promise.responseHeader = headers; + return; + } + const auto httpReplyPrivate = httpReply->d_func(); for (const auto &pair : headers) { const auto &name = pair.name; @@ -951,18 +1039,30 @@ void QHttp2ProtocolHandler::updateStream(Stream &stream, const HPack::HttpHeader } } - emit httpReply->headerChanged(); + if (connectionType == Qt::DirectConnection) + emit httpReply->headerChanged(); + else + QMetaObject::invokeMethod(httpReply, "headerChanged", connectionType); } -void QHttp2ProtocolHandler::updateStream(Stream &stream, const Frame &frame) +void QHttp2ProtocolHandler::updateStream(Stream &stream, const Frame &frame, + Qt::ConnectionType connectionType) { Q_ASSERT(frame.type() == FrameType::DATA); + auto httpReply = stream.reply(); + Q_ASSERT(httpReply || stream.state == Stream::remoteReserved); + + if (!httpReply) { + Q_ASSERT(promisedData.contains(stream.key)); + PushPromise &promise = promisedData[stream.key]; + // TODO: refactor this to use std::move. + promise.dataFrames.push_back(frame); + return; + } if (const auto length = frame.dataSize()) { const char *data = reinterpret_cast(frame.dataBegin()); auto &httpRequest = stream.request(); - auto httpReply = stream.reply(); - Q_ASSERT(httpReply); auto replyPrivate = httpReply->d_func(); replyPrivate->compressedData.append(data, length); @@ -978,24 +1078,38 @@ void QHttp2ProtocolHandler::updateStream(Stream &stream, const Frame &frame) } if (replyPrivate->shouldEmitSignals()) { - emit httpReply->readyRead(); - emit httpReply->dataReadProgress(replyPrivate->totalProgress, replyPrivate->bodyLength); + if (connectionType == Qt::DirectConnection) { + emit httpReply->readyRead(); + emit httpReply->dataReadProgress(replyPrivate->totalProgress, + replyPrivate->bodyLength); + } else { + QMetaObject::invokeMethod(httpReply, "readyRead", connectionType); + QMetaObject::invokeMethod(httpReply, "dataReadProgress", connectionType, + Q_ARG(qint64, replyPrivate->totalProgress), + Q_ARG(qint64, replyPrivate->bodyLength)); + } } } } -void QHttp2ProtocolHandler::finishStream(Stream &stream) +void QHttp2ProtocolHandler::finishStream(Stream &stream, Qt::ConnectionType connectionType) { + Q_ASSERT(stream.state == Stream::remoteReserved || stream.reply()); + stream.state = Stream::closed; auto httpReply = stream.reply(); - Q_ASSERT(httpReply); - httpReply->disconnect(this); - if (stream.data()) - stream.data()->disconnect(this); + if (httpReply) { + httpReply->disconnect(this); + if (stream.data()) + stream.data()->disconnect(this); - qCDebug(QT_HTTP2) << "stream" << stream.streamID << "closed"; + if (connectionType == Qt::DirectConnection) + emit httpReply->finished(); + else + QMetaObject::invokeMethod(httpReply, "finished", connectionType); + } - emit httpReply->finished(); + qCDebug(QT_HTTP2) << "stream" << stream.streamID << "closed"; } void QHttp2ProtocolHandler::finishStreamWithError(Stream &stream, quint32 errorCode) @@ -1009,18 +1123,20 @@ void QHttp2ProtocolHandler::finishStreamWithError(Stream &stream, quint32 errorC void QHttp2ProtocolHandler::finishStreamWithError(Stream &stream, QNetworkReply::NetworkError error, const QString &message) { + Q_ASSERT(stream.state == Stream::remoteReserved || stream.reply()); + stream.state = Stream::closed; - auto httpReply = stream.reply(); - Q_ASSERT(httpReply); - httpReply->disconnect(this); - if (stream.data()) - stream.data()->disconnect(this); + if (auto httpReply = stream.reply()) { + httpReply->disconnect(this); + if (stream.data()) + stream.data()->disconnect(this); + + // TODO: error message must be translated!!! (tr) + emit httpReply->finishedWithError(error, message); + } qCWarning(QT_HTTP2) << "stream" << stream.streamID << "finished with error:" << message; - - // TODO: error message must be translated!!! (tr) - emit httpReply->finishedWithError(error, message); } quint32 QHttp2ProtocolHandler::createNewStream(const HttpMessagePair &message) @@ -1066,26 +1182,24 @@ void QHttp2ProtocolHandler::addToSuspended(Stream &stream) void QHttp2ProtocolHandler::markAsReset(quint32 streamID) { - // For now, we trace only client's streams (created by us, - // odd integer numbers). - if (streamID & 0x1) { - qCDebug(QT_HTTP2) << "stream" << streamID << "was reset"; - // This part is quite tricky: I have to clear this set - // so that it does not become tOOO big. - if (recycledStreams.size() > maxRecycledStreams) { - // At least, I'm erasing the oldest first ... - recycledStreams.erase(recycledStreams.begin(), - recycledStreams.begin() + - recycledStreams.size() / 2); - } + Q_ASSERT(streamID); + + qCDebug(QT_HTTP2) << "stream" << streamID << "was reset"; + // This part is quite tricky: I have to clear this set + // so that it does not become tOOO big. + if (recycledStreams.size() > maxRecycledStreams) { + // At least, I'm erasing the oldest first ... + recycledStreams.erase(recycledStreams.begin(), + recycledStreams.begin() + + recycledStreams.size() / 2); + } - const auto it = std::lower_bound(recycledStreams.begin(), recycledStreams.end(), - streamID); - if (it != recycledStreams.end() && *it == streamID) - return; + const auto it = std::lower_bound(recycledStreams.begin(), recycledStreams.end(), + streamID); + if (it != recycledStreams.end() && *it == streamID) + return; - recycledStreams.insert(it, streamID); - } + recycledStreams.insert(it, streamID); } quint32 QHttp2ProtocolHandler::popStreamToResume() @@ -1175,7 +1289,7 @@ quint32 QHttp2ProtocolHandler::allocateStreamID() { // With protocol upgrade streamID == 1 will become // invalid. The logic must be updated. - if (nextID > quint32(std::numeric_limits::max())) + if (nextID > Http2::lastValidStreamID) return 0; const quint32 streamID = nextID; @@ -1184,6 +1298,114 @@ quint32 QHttp2ProtocolHandler::allocateStreamID() return streamID; } +bool QHttp2ProtocolHandler::tryReserveStream(const Http2::Frame &pushPromiseFrame, + const HPack::HttpHeader &requestHeader) +{ + Q_ASSERT(pushPromiseFrame.type() == FrameType::PUSH_PROMISE); + + QMap pseudoHeaders; + for (const auto &field : requestHeader) { + if (field.name == ":scheme" || field.name == ":path" + || field.name == ":authority" || field.name == ":method") { + if (field.value.isEmpty() || pseudoHeaders.contains(field.name)) + return false; + pseudoHeaders[field.name] = field.value; + } + } + + if (pseudoHeaders.size() != 4) { + // All four required, HTTP/2 8.1.2.3. + return false; + } + + const auto method = pseudoHeaders[":method"].toLower(); + if (method != "get" && method != "head") + return false; + + QUrl url; + url.setScheme(QLatin1String(pseudoHeaders[":scheme"])); + url.setAuthority(QLatin1String(pseudoHeaders[":authority"])); + url.setPath(QLatin1String(pseudoHeaders[":path"])); + + if (!url.isValid()) + return false; + + Q_ASSERT(activeStreams.contains(pushPromiseFrame.streamID())); + const Stream &associatedStream = activeStreams[pushPromiseFrame.streamID()]; + + const auto associatedUrl = urlkey_from_request(associatedStream.request()); + if (url.adjusted(QUrl::RemovePath) != associatedUrl.adjusted(QUrl::RemovePath)) + return false; + + const auto urlKey = url.toString(); + if (promisedData.contains(urlKey)) // duplicate push promise + return false; + + const auto reservedID = qFromBigEndian(pushPromiseFrame.dataBegin()); + // By this time all sanity checks on reservedID were done already + // in handlePUSH_PROMISE. We do not repeat them, only those below: + Q_ASSERT(!activeStreams.contains(reservedID)); + Q_ASSERT(!streamWasReset(reservedID)); + + auto &promise = promisedData[urlKey]; + promise.reservedID = reservedID; + promise.pushHeader = requestHeader; + + activeStreams.insert(reservedID, Stream(urlKey, reservedID, streamInitialRecvWindowSize)); + return true; +} + +void QHttp2ProtocolHandler::resetPromisedStream(const Frame &pushPromiseFrame, + Http2::Http2Error reason) +{ + Q_ASSERT(pushPromiseFrame.type() == FrameType::PUSH_PROMISE); + const auto reservedID = qFromBigEndian(pushPromiseFrame.dataBegin()); + sendRST_STREAM(reservedID, reason); + markAsReset(reservedID); +} + +void QHttp2ProtocolHandler::initReplyFromPushPromise(const HttpMessagePair &message, + const QString &cacheKey) +{ + Q_ASSERT(promisedData.contains(cacheKey)); + auto promise = promisedData.take(cacheKey); + + qCDebug(QT_HTTP2) << "found cached/promised response on stream" << promise.reservedID; + + bool replyFinished = false; + Stream *promisedStream = nullptr; + if (activeStreams.contains(promise.reservedID)) { + promisedStream = &activeStreams[promise.reservedID]; + // Ok, we have an active (not closed yet) stream waiting for more frames, + // let's pretend we requested it: + promisedStream->httpPair = message; + } else { + // Let's pretent we're sending a request now: + Stream closedStream(message, promise.reservedID, + streamInitialSendWindowSize, + streamInitialRecvWindowSize); + closedStream.state = Stream::halfClosedLocal; + activeStreams.insert(promise.reservedID, closedStream); + promisedStream = &activeStreams[promise.reservedID]; + replyFinished = true; + } + + Q_ASSERT(promisedStream); + + if (!promise.responseHeader.empty()) + updateStream(*promisedStream, promise.responseHeader, Qt::QueuedConnection); + + for (const auto &frame : promise.dataFrames) + updateStream(*promisedStream, frame, Qt::QueuedConnection); + + if (replyFinished) { + // Good, we already have received ALL the frames of that PUSH_PROMISE, + // nothing more to do. + finishStream(*promisedStream, Qt::QueuedConnection); + deleteActiveStream(promisedStream->streamID); + } +} + void QHttp2ProtocolHandler::connectionError(Http2::Http2Error errorCode, const char *message) { diff --git a/src/network/access/qhttp2protocolhandler_p.h b/src/network/access/qhttp2protocolhandler_p.h index 92c6851078..df0cf6a288 100644 --- a/src/network/access/qhttp2protocolhandler_p.h +++ b/src/network/access/qhttp2protocolhandler_p.h @@ -63,6 +63,7 @@ #include "http2/hpacktable_p.h" #include "http2/hpack_p.h" +#include #include #include #include @@ -123,9 +124,11 @@ private: bool acceptSetting(Http2::Settings identifier, quint32 newValue); - void updateStream(Stream &stream, const HPack::HttpHeader &headers); - void updateStream(Stream &stream, const Http2::Frame &dataFrame); - void finishStream(Stream &stream); + void updateStream(Stream &stream, const HPack::HttpHeader &headers, + Qt::ConnectionType connectionType = Qt::DirectConnection); + void updateStream(Stream &stream, const Http2::Frame &dataFrame, + Qt::ConnectionType connectionType = Qt::DirectConnection); + void finishStream(Stream &stream, Qt::ConnectionType connectionType = Qt::DirectConnection); // Error code send by a peer (GOAWAY/RST_STREAM): void finishStreamWithError(Stream &stream, quint32 errorCode); // Locally encountered error: @@ -194,7 +197,15 @@ private: quint32 allocateStreamID(); bool validPeerStreamID() const; bool goingAway = false; - + bool pushPromiseEnabled = false; + quint32 lastPromisedID = Http2::connectionStreamID; + QHash promisedData; + bool tryReserveStream(const Http2::Frame &pushPromiseFrame, + const HPack::HttpHeader &requestHeader); + void resetPromisedStream(const Http2::Frame &pushPromiseFrame, + Http2::Http2Error reason); + void initReplyFromPushPromise(const HttpMessagePair &message, + const QString &cacheKey); // Errors: void connectionError(Http2::Http2Error errorCode, const char *message); -- cgit v1.2.3 From f773ddd026a6227cdb754dea4a5fe0a25137033f Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Wed, 19 Oct 2016 10:49:21 +0200 Subject: Fix when calling QSurfaceFormat::setDefaultFormat before Q*Application Fixes a regression introduced in commit 51767affb. QOpenGLContext::globalShareContext requires a QGuiApplication to exist. This wasn't required so far. Task-number: QTBUG-56614 Change-Id: I07bcf434fca536c4dc50feee7ea17eb541fd589a Reviewed-by: Liang Qi --- src/gui/kernel/qsurfaceformat.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/gui/kernel/qsurfaceformat.cpp b/src/gui/kernel/qsurfaceformat.cpp index 109ba8e610..d19690891f 100644 --- a/src/gui/kernel/qsurfaceformat.cpp +++ b/src/gui/kernel/qsurfaceformat.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #ifdef major #undef major @@ -760,10 +761,13 @@ Q_GLOBAL_STATIC(QSurfaceFormat, qt_default_surface_format) void QSurfaceFormat::setDefaultFormat(const QSurfaceFormat &format) { #ifndef QT_NO_OPENGL - QOpenGLContext *globalContext = QOpenGLContext::globalShareContext(); - if (globalContext && globalContext->isValid()) { - qWarning("Warning: Setting a new default format with a different version or profile after " - "the global shared context is created may cause issues with context sharing."); + if (qApp) { + QOpenGLContext *globalContext = QOpenGLContext::globalShareContext(); + if (globalContext && globalContext->isValid()) { + qWarning("Warning: Setting a new default format with a different version or profile " + "after the global shared context is created may cause issues with context " + "sharing."); + } } #endif *qt_default_surface_format() = format; -- cgit v1.2.3 From 84dc7d5f5560d69a0d7973f591ce253605a458ac Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Mon, 10 Oct 2016 21:53:09 +0200 Subject: QComboBox: fix build with GCC 7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GCC 7 warns about implicit fall-throughs now. Fix by adding the missing comments. Interestingly, Coverity only found one of them, even though all three still exist in dev, too. Change-Id: I9f2c5e2700d5ec5234fee3a532feffe01b7c4ce3 Coverity-Id: 11156 Reviewed-by: Edward Welbourne Reviewed-by: Sérgio Martins --- src/widgets/widgets/qcombobox.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src') diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp index 0ef76b95f0..22ba26b6a3 100644 --- a/src/widgets/widgets/qcombobox.cpp +++ b/src/widgets/widgets/qcombobox.cpp @@ -3125,6 +3125,7 @@ void QComboBox::keyPressEvent(QKeyEvent *e) case Qt::Key_Up: if (e->modifiers() & Qt::ControlModifier) break; // pass to line edit for auto completion + // fall through case Qt::Key_PageUp: #ifdef QT_KEYPAD_NAVIGATION if (QApplication::keypadNavigationEnabled()) @@ -3210,6 +3211,7 @@ void QComboBox::keyPressEvent(QKeyEvent *e) switch (move) { case MoveFirst: newIndex = -1; + // fall through case MoveDown: newIndex++; while ((newIndex < count()) && !(d->model->flags(d->model->index(newIndex,d->modelColumn,d->root)) & Qt::ItemIsEnabled)) @@ -3217,6 +3219,7 @@ void QComboBox::keyPressEvent(QKeyEvent *e) break; case MoveLast: newIndex = count(); + // fall through case MoveUp: newIndex--; while ((newIndex >= 0) && !(d->model->flags(d->model->index(newIndex,d->modelColumn,d->root)) & Qt::ItemIsEnabled)) -- cgit v1.2.3 From 30b7278c5cf1df0b507cd3139a53b7adcc190850 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Thu, 6 Oct 2016 16:32:49 +0200 Subject: Remove type punning from ucstrncmp Type punning is UB. Change-Id: I0022d2a38136d80f5ddda21cea7dc0968c736242 Reviewed-by: Oswald Buddenhagen Reviewed-by: Thiago Macieira --- src/corelib/tools/qstring.cpp | 48 +++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 25 deletions(-) (limited to 'src') diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index ff7e7fd406..b7f83e4b9d 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -480,48 +480,46 @@ static int ucstrncmp(const QChar *a, const QChar *b, int l) if (!l) return 0; - union { - const QChar *w; - const quint32 *d; - quintptr value; - } sa, sb; - sa.w = a; - sb.w = b; - // check alignment - if ((sa.value & 2) == (sb.value & 2)) { + if ((reinterpret_cast(a) & 2) == (reinterpret_cast(b) & 2)) { // both addresses have the same alignment - if (sa.value & 2) { + if (reinterpret_cast(a) & 2) { // both addresses are not aligned to 4-bytes boundaries // compare the first character - if (*sa.w != *sb.w) - return sa.w->unicode() - sb.w->unicode(); + if (*a != *b) + return a->unicode() - b->unicode(); --l; - ++sa.w; - ++sb.w; + ++a; + ++b; // now both addresses are 4-bytes aligned } // both addresses are 4-bytes aligned // do a fast 32-bit comparison - const quint32 *e = sa.d + (l >> 1); - for ( ; sa.d != e; ++sa.d, ++sb.d) { - if (*sa.d != *sb.d) { - if (*sa.w != *sb.w) - return sa.w->unicode() - sb.w->unicode(); - return sa.w[1].unicode() - sb.w[1].unicode(); + const quint32 *da = reinterpret_cast(a); + const quint32 *db = reinterpret_cast(b); + const quint32 *e = da + (l >> 1); + for ( ; da != e; ++da, ++db) { + if (*da != *db) { + a = reinterpret_cast(da); + b = reinterpret_cast(db); + if (*a != *b) + return a->unicode() - b->unicode(); + return a[1].unicode() - b[1].unicode(); } } // do we have a tail? - return (l & 1) ? sa.w->unicode() - sb.w->unicode() : 0; + a = reinterpret_cast(da); + b = reinterpret_cast(db); + return (l & 1) ? a->unicode() - b->unicode() : 0; } else { // one of the addresses isn't 4-byte aligned but the other is - const QChar *e = sa.w + l; - for ( ; sa.w != e; ++sa.w, ++sb.w) { - if (*sa.w != *sb.w) - return sa.w->unicode() - sb.w->unicode(); + const QChar *e = a + l; + for ( ; a != e; ++a, ++b) { + if (*a != *b) + return a->unicode() - b->unicode(); } } return 0; -- cgit v1.2.3 From 33aa2fdd08880d2d6e2a4ff658b34c3a81c0b4ea Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Mon, 19 Sep 2016 21:41:36 -0700 Subject: Fix change-of-sign warnings caught by ICC 17 error #68: integer conversion resulted in a change of sign Change-Id: I33dc971f005a4848bb8ffffd1475ee53d394acf6 Reviewed-by: Andrew Knight Reviewed-by: Laszlo Agocs --- .../deviceintegration/eglfs_kms_egldevice/qeglfskmsegldevicescreen.cpp | 2 +- src/plugins/platforms/vnc/qvnc.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldevicescreen.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldevicescreen.cpp index 55d5941e5f..1f672afeb4 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldevicescreen.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldevicescreen.cpp @@ -88,7 +88,7 @@ void QEglFSKmsEglDeviceScreen::waitForFlip() qCDebug(qLcEglfsKmsDebug, "Setting mode"); int ret = drmModeSetCrtc(device()->fd(), output().crtc_id, - -1, 0, 0, + uint32_t(-1), 0, 0, &output().connector_id, 1, &output().modes[output().mode]); if (ret) diff --git a/src/plugins/platforms/vnc/qvnc.cpp b/src/plugins/platforms/vnc/qvnc.cpp index b3613cf18f..f386be193d 100644 --- a/src/plugins/platforms/vnc/qvnc.cpp +++ b/src/plugins/platforms/vnc/qvnc.cpp @@ -41,6 +41,7 @@ #include "qvncclient.h" #include "QtNetwork/qtcpserver.h" #include "QtNetwork/qtcpsocket.h" +#include #include #include @@ -554,7 +555,7 @@ void QVncClientCursor::write(QVncClient *client) const htons(cursor.height()) }; socket->write((char*)tmp, sizeof(tmp)); - const quint32 encoding = htonl(-239); + const qint32 encoding = qToBigEndian(-239); socket->write((char*)(&encoding), sizeof(encoding)); } -- cgit v1.2.3 From 71d4aea64630a84ba4163df7d9b44487ace2c665 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Fri, 21 Oct 2016 09:29:08 +0200 Subject: Fix description of feature 'topleveldomain' The property is 'purpose' now. Also elaborate a bit more on the feature. Change-Id: I66aa4165044f132dff018cfd01d54b939bb64fac Reviewed-by: Lars Knoll --- src/corelib/configure.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/corelib/configure.json b/src/corelib/configure.json index c1bd37fd0c..fbbbef4f21 100644 --- a/src/corelib/configure.json +++ b/src/corelib/configure.json @@ -579,7 +579,10 @@ }, "topleveldomain": { "label": "QUrl::topLevelDomain()", - "description": "Provides support for extracting the top level domain from URLs.", + "purpose": "Provides support for extracting the top level domain from URLs. + +If enabled, a binary dump of the Public Suffix List (http://www.publicsuffix.org, +Mozilla License) is included. The data is then also used in QNetworkCookieJar::validateCookie.", "section": "Utilities", "output": [ "publicFeature" ] } -- cgit v1.2.3 From a6a08095a4c5442283ac9b873c90ab0131e5b24f Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Wed, 29 Jun 2016 12:46:45 +0200 Subject: Compile fix for DB2 sqldriver plugin Change-Id: Ib91ffaa0f1f240b9d93e1756cf309a9975f09928 Reviewed-by: Lars Knoll Reviewed-by: Friedemann Kleint --- src/sql/drivers/db2/qsql_db2.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/sql/drivers/db2/qsql_db2.cpp b/src/sql/drivers/db2/qsql_db2.cpp index 4ccc3aca9e..a2046e17a1 100644 --- a/src/sql/drivers/db2/qsql_db2.cpp +++ b/src/sql/drivers/db2/qsql_db2.cpp @@ -59,8 +59,6 @@ #define SQL_BIGUINT_TYPE quint64 #endif -#define UNICODE - #include #include @@ -1187,8 +1185,8 @@ QDB2Driver::QDB2Driver(Qt::HANDLE env, Qt::HANDLE con, QObject* parent) : QSqlDriver(*new QDB2DriverPrivate, parent) { Q_D(QDB2Driver); - d->hEnv = reinterpret_cast(env); - d->hDbc = reinterpret_cast(con); + d->hEnv = reinterpret_cast(env); + d->hDbc = reinterpret_cast(con); if (env && con) { setOpen(true); setOpenError(false); -- cgit v1.2.3 From 391741bd7b9d07a6c3fd2e5c0bc70d3c00f29ac8 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Wed, 19 Oct 2016 17:50:52 +0200 Subject: Cocoa integration - remove erroneous warning The conditional statement checks/allows only right/left mouse buttons in handleMouseDraggedEvent and generates a lot of useless/misleading warnings in case we press (for example) a middle mouse button (when we're also moving mouse cursor, intentionally or not). Task-number: QTBUG-54160 Task-number: QTBUG-42846 Change-Id: I5c54b6204cb90036c7d98724537f1c985b40d9cc Reviewed-by: Shawn Rutledge --- src/plugins/platforms/cocoa/qnsview.mm | 5 ----- 1 file changed, 5 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm index 51a69be759..0e46c3150b 100644 --- a/src/plugins/platforms/cocoa/qnsview.mm +++ b/src/plugins/platforms/cocoa/qnsview.mm @@ -892,11 +892,6 @@ QT_WARNING_POP if (!(m_acceptedMouseDowns & button) == button) return false; - if (!(m_buttons & (m_sendUpAsRightButton ? Qt::RightButton : Qt::LeftButton))) { - qCWarning(lcQpaCocoaWindow) << "QNSView mouseDragged: Internal mouse button tracking" - << "invalid (missing Qt::LeftButton)"; - } - [self handleMouseEvent:theEvent]; return true; } -- cgit v1.2.3 From 398d67198c054ff5fa24103bda62cdaffdc194e2 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Thu, 20 Oct 2016 13:26:36 +0200 Subject: Document Qt Network licenses MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also explicitly mention the GPL exception for OpenSSL. Change-Id: I460189ee4d2dd79f8eca320ac82460e186b0f84c Reviewed-by: Topi Reiniö --- src/network/doc/src/external-resources.qdoc | 36 +++++++++++++++++++++++++++++ src/network/doc/src/qtnetwork.qdoc | 30 ++++++++++++++++++++++++ src/network/doc/src/ssl.qdoc | 9 +++----- 3 files changed, 69 insertions(+), 6 deletions(-) create mode 100644 src/network/doc/src/external-resources.qdoc (limited to 'src') diff --git a/src/network/doc/src/external-resources.qdoc b/src/network/doc/src/external-resources.qdoc new file mode 100644 index 0000000000..f033ddc729 --- /dev/null +++ b/src/network/doc/src/external-resources.qdoc @@ -0,0 +1,36 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \externalpage https://www.openssl.org/ + \title OpenSSL Toolkit +*/ + +/*! + \externalpage https://www.openssl.org/source/license.html + \title OpenSSL License +*/ diff --git a/src/network/doc/src/qtnetwork.qdoc b/src/network/doc/src/qtnetwork.qdoc index f15b180625..7a95195da2 100644 --- a/src/network/doc/src/qtnetwork.qdoc +++ b/src/network/doc/src/qtnetwork.qdoc @@ -60,7 +60,37 @@ \list \li \l{Qt Network C++ Classes}{C++ Classes} \endlist + + \section1 Licenses and Attributions + + Qt Network is available under commercial licenses from \l{The Qt Company}. + In addition, it is available under the + \l{GNU Lesser General Public License, version 3}, or + the \l{GNU General Public License, version 2}. + See \l{Qt Licensing} for further details. + + Qt Network can use the \l{OpenSSL Toolkit} as a backend. The library is then + linked against OpenSSL in a way that requires compliance with the \l{OpenSSL + License}. To allow linking OpenSSL with Qt Network under the GPL, following + exceptions to the GPL do apply: + + \badcode + In addition, as a special exception, the copyright holders listed above give + permission to link the code of its release of Qt with the OpenSSL project's + "OpenSSL" library (or modified versions of the "OpenSSL" library that use the + same license as the original version), and distribute the linked executables. + + You must comply with the GNU General Public License version 2 in all + respects for all of the code used other than the "OpenSSL" code. If you + modify this file, you may extend this exception to your version of the file, + but you are not obligated to do so. If you do not wish to do so, delete + this exception statement from your version of this file. + \endcode + + Also note shipping OpenSSL might cause \l{Import and Export Restrictions} + to apply. */ + /*! \module QtNetwork \title Qt Network C++ Classes diff --git a/src/network/doc/src/ssl.qdoc b/src/network/doc/src/ssl.qdoc index 5ad2cfafc6..e4948c393c 100644 --- a/src/network/doc/src/ssl.qdoc +++ b/src/network/doc/src/ssl.qdoc @@ -33,7 +33,7 @@ \keyword SSL The classes below provide support for secure network communication using - the Secure Sockets Layer (SSL) protocol, using the OpenSSL Toolkit (\l{http://www.openssl.org/}) + the Secure Sockets Layer (SSL) protocol, using the \l{OpenSSL Toolkit} to perform encryption and protocol handling. From Qt version 5.2 onwards, the officially supported version for OpenSSL @@ -67,16 +67,13 @@ To disable SSL support in a Qt build, configure Qt with the \c{-no-openssl} option. - \section1 Licensing Information + \section1 Import and Export Restrictions - \note Due to import and export restrictions in some parts of the world, we + Due to import and export restrictions in some parts of the world, we are unable to supply the OpenSSL Toolkit with Qt packages. Developers wishing to use SSL communication in their deployed applications should either ensure that their users have the appropriate libraries installed, or they should consult a suitably qualified legal professional to ensure that applications using code from the OpenSSL project are correctly certified for import and export in relevant regions of the world. - - When the Qt Network module is built with SSL support, the library is linked - against OpenSSL in a way that requires OpenSSL license compliance. */ -- cgit v1.2.3 From cc30177a6927ee9619710efec45dbcd9d9fd4355 Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Mon, 24 Oct 2016 10:19:59 +0200 Subject: Fix decorated text in extra-selections Change ddef89b323e8507ea5f451cb53ed151e29a110b3 broke decorations set using setExtraSelections(), because these decorations are drawn with a second drawTextItem() call where numGlyphs is set to 0. When the drawTextDecoration() call was moved into the branches for multi/no-multi font engines, the call for the cut-off when numGlyphs == 0 was unintentionally removed. Task-number: QTBUG-54626 Change-Id: Ieb9fc23099a9d7daf87cc364d3fc9da128ec516d Reviewed-by: Lars Knoll --- src/gui/painting/qpainter.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp index 6472481e7a..74b961f042 100644 --- a/src/gui/painting/qpainter.cpp +++ b/src/gui/painting/qpainter.cpp @@ -6439,7 +6439,8 @@ void QPainterPrivate::drawTextItem(const QPointF &p, const QTextItem &_ti, QText updateState(state); if (!ti.glyphs.numGlyphs) { - // nothing to do + drawTextItemDecoration(q, p, ti.fontEngine, textEngine, ti.underlineStyle, + ti.flags, ti.width.toReal(), ti.charFormat); } else if (ti.fontEngine->type() == QFontEngine::Multi) { QFontEngineMulti *multi = static_cast(ti.fontEngine); -- cgit v1.2.3 From cee4d0c0b7bcd1a412b2d4713e80a3ffb676a6e9 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 17 Oct 2016 11:11:09 +0200 Subject: Add a resetClean() method to the undo stack With the current API it is not possible to reset the index into -1. We have setClean() method, but we are lacking setDirty(). This is needed in case when the document has changed outside of the editor and nothing has changed in the undo stack history. In this case we don't know the state of the file modified externally so we need to mark that editor's contents is different from the file contents and undoing or redoing commands can't bring the editor to the clean state. This may also be useful to call it when we created a new document and haven't saved it yet or when the document was restored from backup file. Task-number: QTCREATORBUG-17048 Change-Id: I64e2052b3559299e0b6939831557a07a59a851b6 Reviewed-by: Friedemann Kleint Reviewed-by: Lars Knoll --- src/widgets/util/qundostack.cpp | 27 ++++++++++++++++++++++++++- src/widgets/util/qundostack.h | 1 + 2 files changed, 27 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/widgets/util/qundostack.cpp b/src/widgets/util/qundostack.cpp index 18f85ca505..59d517e77b 100644 --- a/src/widgets/util/qundostack.cpp +++ b/src/widgets/util/qundostack.cpp @@ -633,7 +633,7 @@ void QUndoStack::push(QUndoCommand *cmd) commands, it emits the signal cleanChanged(). This signal is also emitted when the stack leaves the clean state. - \sa isClean(), cleanIndex() + \sa isClean(), resetClean(), cleanIndex() */ void QUndoStack::setClean() @@ -647,6 +647,30 @@ void QUndoStack::setClean() d->setIndex(d->index, true); } +/*! + \since 5.8 + + Leaves the clean state and emits cleanChanged() if the stack was clean. + This method resets the clean index to -1. + + This is typically called in the following cases, when a document has been: + \li created basing on some template and has not been saved, + so no filename has been associated with the document yet. + \li restored from a backup file. + \li changed outside of the editor and the user did not reload it. + + \sa isClean(), setClean(), cleanIndex() +*/ + +void QUndoStack::resetClean() +{ + Q_D(QUndoStack); + const bool was_clean = isClean(); + d->clean_index = -1; + if (was_clean) + emit cleanChanged(false); +} + /*! If the stack is in the clean state, returns \c true; otherwise returns \c false. @@ -668,6 +692,7 @@ bool QUndoStack::isClean() const some commands are undone, then a new command is pushed. Since push() deletes all the undone commands before pushing the new command, the stack can't return to the clean state again. In this case, this function returns -1. + The -1 may also be returned after an explicit call to resetClean(). \sa isClean(), setClean() */ diff --git a/src/widgets/util/qundostack.h b/src/widgets/util/qundostack.h index f4db78300b..ca918b0618 100644 --- a/src/widgets/util/qundostack.h +++ b/src/widgets/util/qundostack.h @@ -128,6 +128,7 @@ public: public Q_SLOTS: void setClean(); + void resetClean(); void setIndex(int idx); void undo(); void redo(); -- cgit v1.2.3 From bdcc9d4e73c00d8297a4d0bd2a86b05b200d9bc9 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Wed, 19 Oct 2016 12:34:31 +0200 Subject: Add attribution file for Khronos headers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: If2db8db20cac00a0e4fa89721ede17a41a18e3c1 Reviewed-by: Topi Reiniö --- src/gui/opengl/KHRONOS_LICENSE.txt | 20 ++++++++++++++++++++ src/gui/opengl/qt_attribution.json | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 src/gui/opengl/KHRONOS_LICENSE.txt create mode 100644 src/gui/opengl/qt_attribution.json (limited to 'src') diff --git a/src/gui/opengl/KHRONOS_LICENSE.txt b/src/gui/opengl/KHRONOS_LICENSE.txt new file mode 100644 index 0000000000..63b1e1f940 --- /dev/null +++ b/src/gui/opengl/KHRONOS_LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2013-2014 The Khronos Group Inc. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and/or associated documentation files (the +"Materials"), to deal in the Materials without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Materials, and to +permit persons to whom the Materials are furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Materials. + +THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. diff --git a/src/gui/opengl/qt_attribution.json b/src/gui/opengl/qt_attribution.json new file mode 100644 index 0000000000..d3ff10d803 --- /dev/null +++ b/src/gui/opengl/qt_attribution.json @@ -0,0 +1,32 @@ +[ + { + "Id": "opengl-headers", + "Name": "OpenGL Headers", + "QDocModule": "qtgui", + "Description": "OpenGL header generated from the Khronos OpenGL / OpenGL ES XML API Registry.", + "QtUsage": "Used on Windows and Linux in the OpenGL related headers of Qt GUI.", + "Path": "qopenglext.h", + + "Homepage": "https://www.khronos.org/", + "Version": "Revision 27684", + "License": "MIT License", + "LicenseId": "MIT", + "LicenseFile": "KHRONOS_LICENSE.txt", + "Copyright": "Copyright (c) 2013-2014 The Khronos Group Inc." + }, + { + "Id": "opengl-es2-headers", + "Name": "OpenGL ES 2 Headers", + "QDocModule": "qtgui", + "Description": "OpenGL ES 2 header generated from the Khronos OpenGL / OpenGL ES XML API Registry.", + "QtUsage": "Used on Windows and Linux in the OpenGL related headers of Qt GUI.", + "Path": "qopengles2ext.h", + + "Homepage": "https://www.khronos.org/", + "Version": "Revision 27673", + "License": "MIT License", + "LicenseId": "MIT", + "LicenseFile": "KHRONOS_LICENSE.txt", + "Copyright": "Copyright (c) 2013-2014 The Khronos Group Inc." + } +] -- cgit v1.2.3 From 592614ea3ecd90ede2ae1b8e6579d1b898f474ec Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Fri, 21 Oct 2016 10:13:20 +0200 Subject: Don't claim all fonts are smoothly scalable on Windows Since 40ebda3efbcf00c3393cb70c9eee203c68a57311, bitmap fonts are detected as smoothly scalable on Windows. While the fontsAlwaysScalable() does say whether or not the font engine can rasterize the fonts at any size, it does not determine whether or not the result is "attractive" as the documentation for isSmoothlyScalable() says. Only outline fonts are smoothly scalable, and this fact is used in Qt Quick to determine whether we can use the distance field renderer for the font or if we have to fall back to the native renderer. The consequence was that the fonts were no longer usable in Qt Quick. We also need to revert the optimization for isBitmapScalable() since there a font that is smoothly scalable should not be identified as bitmap scalable (basically this means: Font is not smoothly scalable, but it can be scaled with bitmap scaling artifacts). [ChangeLog][QtGui][Text] Fixed a regression where raster fonts on Windows were detected as smoothly scalable and thus rendering with said fonts in Qt Quick would break. Task-number: QTBUG-56659 Change-Id: Ia7db6fee8249aca347233a488388be5c3a00c2df Reviewed-by: Lars Knoll --- src/gui/text/qfontdatabase.cpp | 6 ------ 1 file changed, 6 deletions(-) (limited to 'src') diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp index f063541249..04081a5ca7 100644 --- a/src/gui/text/qfontdatabase.cpp +++ b/src/gui/text/qfontdatabase.cpp @@ -1657,9 +1657,6 @@ bool QFontDatabase::isFixedPitch(const QString &family, bool QFontDatabase::isBitmapScalable(const QString &family, const QString &style) const { - if (QGuiApplicationPrivate::platformIntegration()->fontDatabase()->fontsAlwaysScalable()) - return true; - bool bitmapScalable = false; QString familyName, foundryName; parseFontName(family, foundryName, familyName); @@ -1700,9 +1697,6 @@ bool QFontDatabase::isBitmapScalable(const QString &family, */ bool QFontDatabase::isSmoothlyScalable(const QString &family, const QString &style) const { - if (QGuiApplicationPrivate::platformIntegration()->fontDatabase()->fontsAlwaysScalable()) - return true; - bool smoothScalable = false; QString familyName, foundryName; parseFontName(family, foundryName, familyName); -- cgit v1.2.3 From f6eb570c7dee2ec92383607c614db91f31804707 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Thu, 29 Sep 2016 11:59:01 +0200 Subject: Darwin: normalize all watched paths to composed from MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This will be done by all POSIX APIs for strings coming in that way, but because other code (like NSWhateverViews) will most likely return decomposed form, we make sure that those are in composed form too. Task-number: QTBUG-55896 Change-Id: I065e11cee6b59706d4346ed20d4b59b9b95163b8 Reviewed-by: Morten Johan Sørvig --- src/corelib/io/qfilesystemwatcher_fsevents.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/corelib/io/qfilesystemwatcher_fsevents.mm b/src/corelib/io/qfilesystemwatcher_fsevents.mm index c6fa6c9846..6af9e5f5ef 100644 --- a/src/corelib/io/qfilesystemwatcher_fsevents.mm +++ b/src/corelib/io/qfilesystemwatcher_fsevents.mm @@ -343,7 +343,7 @@ QStringList QFseventsFileSystemWatcherEngine::addPaths(const QStringList &paths, QStringList p = paths; QMutableListIterator it(p); while (it.hasNext()) { - QString origPath = it.next(); + QString origPath = it.next().normalized(QString::NormalizationForm_C); QString realPath = origPath; if (realPath.endsWith(QDir::separator())) realPath = realPath.mid(0, realPath.size() - 1); -- cgit v1.2.3 From 843247e1c509ec3ce55a2e2051b83fcfa6634135 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Fri, 14 Oct 2016 13:05:00 +0200 Subject: Call raise on the window that contains the widget and not the widget When the mouse is clicked on the widget in a window while a popup is visible then it should raise just the window and not the widget inside it. If the widget is in a stacked layout then calling raise() on it can cause it to appear on top so avoid this by calling raise() directly on the window. Task-number: QTBUG-52670 Change-Id: Idd287c6cc7038c57e14e92f4a3e1c50985925684 Reviewed-by: Friedemann Kleint --- src/widgets/kernel/qwidgetwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp index 95f63025fb..40c488857e 100644 --- a/src/widgets/kernel/qwidgetwindow.cpp +++ b/src/widgets/kernel/qwidgetwindow.cpp @@ -529,7 +529,7 @@ void QWidgetWindow::handleMouseEvent(QMouseEvent *event) // activate window of the widget under mouse pointer if (!w->isActiveWindow()) { w->activateWindow(); - w->raise(); + w->window()->raise(); } QWindow *win = w->windowHandle(); -- cgit v1.2.3 From e2d8c7bf2203cbc0c7ff923caf3132881aafa0b0 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Thu, 1 Sep 2016 11:53:15 +0200 Subject: Don't change the size of widgets just because it is in a floating dock When a QDockWidget was floating on macOS then it would force the size of various widgets, such as buttons, comboboxes, to be the smallest needed rather than the size they had when it was docked. Task-number: QTBUG-7460 Task-number: QTBUG-52354 Change-Id: Id348180934f113f3a9a9ce5622a9af03eed04108 Reviewed-by: Jake Petroules --- src/widgets/styles/qmacstyle_mac.mm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/widgets/styles/qmacstyle_mac.mm b/src/widgets/styles/qmacstyle_mac.mm index 46918a2d5f..84445bfce4 100644 --- a/src/widgets/styles/qmacstyle_mac.mm +++ b/src/widgets/styles/qmacstyle_mac.mm @@ -1034,6 +1034,8 @@ static QSize qt_aqua_get_known_size(QStyle::ContentsType ct, const QWidget *widg #if defined(QMAC_QAQUASTYLE_SIZE_CONSTRAIN) || defined(DEBUG_SIZE_CONSTRAINT) static QAquaWidgetSize qt_aqua_guess_size(const QWidget *widg, QSize large, QSize small, QSize mini) { + Q_UNUSED(widg); + if (large == QSize(-1, -1)) { if (small != QSize(-1, -1)) return QAquaSizeSmall; @@ -1049,7 +1051,7 @@ static QAquaWidgetSize qt_aqua_guess_size(const QWidget *widg, QSize large, QSiz } #ifndef QT_NO_MAINWINDOW - if (qobject_cast(widg->window()) || qEnvironmentVariableIsSet("QWIDGET_ALL_SMALL")) { + if (qEnvironmentVariableIsSet("QWIDGET_ALL_SMALL")) { //if (small.width() != -1 || small.height() != -1) return QAquaSizeSmall; } else if (qEnvironmentVariableIsSet("QWIDGET_ALL_MINI")) { -- cgit v1.2.3 From 9c83d7f871f95b1cc03fb404bd602df32056b9cb Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Fri, 30 Sep 2016 15:39:03 -0700 Subject: QCocoaMenuBar: Update even if no window is attached Then we need to check if the current active (or focused) window has any menubar associated. In case there isn't, and the menubar has no window associated, then we should update immediately. The previous condition is still valid. Change-Id: I4532ccc87354d91c76b53f5433dc3944b9e29584 Task-number: QTBUG-56275 Reviewed-by: Erik Verbruggen --- src/plugins/platforms/cocoa/qcocoamenubar.h | 1 + src/plugins/platforms/cocoa/qcocoamenubar.mm | 28 +++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/plugins/platforms/cocoa/qcocoamenubar.h b/src/plugins/platforms/cocoa/qcocoamenubar.h index e84da7aeb0..2865dd2460 100644 --- a/src/plugins/platforms/cocoa/qcocoamenubar.h +++ b/src/plugins/platforms/cocoa/qcocoamenubar.h @@ -70,6 +70,7 @@ private: static QCocoaWindow *findWindowForMenubar(); static QCocoaMenuBar *findGlobalMenubar(); + bool needsImmediateUpdate(); bool shouldDisable(QCocoaWindow *active) const; NSMenuItem *nativeItemForMenu(QCocoaMenu *menu) const; diff --git a/src/plugins/platforms/cocoa/qcocoamenubar.mm b/src/plugins/platforms/cocoa/qcocoamenubar.mm index 3523182e6d..82aebf8cf3 100644 --- a/src/plugins/platforms/cocoa/qcocoamenubar.mm +++ b/src/plugins/platforms/cocoa/qcocoamenubar.mm @@ -89,6 +89,32 @@ QCocoaMenuBar::~QCocoaMenuBar() } } +bool QCocoaMenuBar::needsImmediateUpdate() +{ + if (m_window && m_window->window()->isActive()) { + return true; + } else if (!m_window) { + // Only update if the focus/active window has no + // menubar, which means it'll be using this menubar. + // This is to avoid a modification in a parentless + // menubar to affect a window-assigned menubar. + QWindow *fw = QGuiApplication::focusWindow(); + if (!fw) { + // Same if there's no focus window, BTW. + return true; + } else { + QCocoaWindow *cw = static_cast(fw->handle()); + if (cw && !cw->menubar()) + return true; + } + } + + // Either the menubar is attached to a non-active window, + // or the application's focus window has its own menubar + // (which is different from this one) + return false; +} + void QCocoaMenuBar::insertMenu(QPlatformMenu *platformMenu, QPlatformMenu *before) { QCocoaMenu *menu = static_cast(platformMenu); @@ -129,7 +155,7 @@ void QCocoaMenuBar::insertMenu(QPlatformMenu *platformMenu, QPlatformMenu *befor syncMenu(menu); - if (m_window && m_window->window()->isActive()) + if (needsImmediateUpdate()) updateMenuBarImmediately(); } -- cgit v1.2.3 From 26ac91c832c2a8db1327e24e6ff88eef82cc4530 Mon Sep 17 00:00:00 2001 From: Anton Kudryavtsev Date: Wed, 19 Oct 2016 12:59:18 +0300 Subject: qwindowsdirect2dintegration.cpp: replace QVector with QVarLengthArray QVector was used as just RAII for local array. It's inefficient usage of CoW type. So use QVarLengthArray instead. Change-Id: I494ecc49af9049569a65e258581137bad3ce7dc7 Reviewed-by: Edward Welbourne Reviewed-by: Marc Mutz --- src/plugins/platforms/direct2d/qwindowsdirect2dintegration.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/plugins/platforms/direct2d/qwindowsdirect2dintegration.cpp b/src/plugins/platforms/direct2d/qwindowsdirect2dintegration.cpp index 1d24247d75..da4a4e6ce6 100644 --- a/src/plugins/platforms/direct2d/qwindowsdirect2dintegration.cpp +++ b/src/plugins/platforms/direct2d/qwindowsdirect2dintegration.cpp @@ -52,6 +52,8 @@ #include #include +#include + QT_BEGIN_NAMESPACE class QWindowsDirect2DEventDispatcher : public QWindowsGuiEventDispatcher @@ -106,7 +108,7 @@ public: if (_tcscat_s(filename, bufSize, __TEXT("\\d2d1.dll")) == 0) { DWORD versionInfoSize = GetFileVersionInfoSize(filename, NULL); if (versionInfoSize) { - QVector info(versionInfoSize); + QVarLengthArray info(versionInfoSize); if (GetFileVersionInfo(filename, NULL, versionInfoSize, info.data())) { UINT size; DWORD *fi; -- cgit v1.2.3 From c30e62c7750b804bfe6f3ed29914ebb42890230d Mon Sep 17 00:00:00 2001 From: Anton Kudryavtsev Date: Wed, 19 Oct 2016 14:27:51 +0300 Subject: Plugins: use const (and const APIs) more For CoW types, prefer const methods to avoid needless detach()ing. Change-Id: I625d57c0c19e87ac2de681bb16d0cc5a7a59b366 Reviewed-by: Edward Welbourne --- src/plugins/platforms/android/androidjnimain.cpp | 2 +- src/plugins/platforms/eglfs/api/qeglfsdeviceintegration.cpp | 2 +- .../eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmintegration.cpp | 2 +- src/plugins/platforms/qnx/qqnxwindow.cpp | 2 +- src/plugins/platforms/xcb/qxcbmime.cpp | 2 +- src/plugins/platforms/xcb/qxcbsessionmanager.cpp | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp index c79198d7fe..370c3426f5 100644 --- a/src/plugins/platforms/android/androidjnimain.cpp +++ b/src/plugins/platforms/android/androidjnimain.cpp @@ -514,7 +514,7 @@ static jboolean startQtApplication(JNIEnv *env, jobject /*object*/, jstring para if (m_applicationParams.length()) { // Obtain a handle to the main library (the library that contains the main() function). // This library should already be loaded, and calling dlopen() will just return a reference to it. - m_mainLibraryHnd = dlopen(m_applicationParams.first().data(), 0); + m_mainLibraryHnd = dlopen(m_applicationParams.constFirst().data(), 0); if (Q_UNLIKELY(!m_mainLibraryHnd)) { qCritical() << "dlopen failed:" << dlerror(); return false; diff --git a/src/plugins/platforms/eglfs/api/qeglfsdeviceintegration.cpp b/src/plugins/platforms/eglfs/api/qeglfsdeviceintegration.cpp index 48e0af5479..3e1e93f1e4 100644 --- a/src/plugins/platforms/eglfs/api/qeglfsdeviceintegration.cpp +++ b/src/plugins/platforms/eglfs/api/qeglfsdeviceintegration.cpp @@ -199,7 +199,7 @@ void QEglFSDeviceIntegration::screenDestroy() QEglFSIntegration *platformIntegration = static_cast( QGuiApplicationPrivate::platformIntegration()); while (!app->screens().isEmpty()) - platformIntegration->removeScreen(app->screens().last()->handle()); + platformIntegration->removeScreen(app->screens().constLast()->handle()); } QSizeF QEglFSDeviceIntegration::physicalScreenSize() const diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmintegration.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmintegration.cpp index a78f445995..38419a55c8 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmintegration.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmintegration.cpp @@ -126,7 +126,7 @@ QEglFSKmsDevice *QEglFSKmsGbmIntegration::createDevice(const QString &devicePath } else { QDeviceDiscovery *d = QDeviceDiscovery::create(QDeviceDiscovery::Device_VideoMask); - QStringList devices = d->scanConnectedDevices(); + const QStringList devices = d->scanConnectedDevices(); qCDebug(qLcEglfsKmsDebug) << "Found the following video devices:" << devices; d->deleteLater(); diff --git a/src/plugins/platforms/qnx/qqnxwindow.cpp b/src/plugins/platforms/qnx/qqnxwindow.cpp index 7b3a5ec70c..6fd0191e43 100644 --- a/src/plugins/platforms/qnx/qqnxwindow.cpp +++ b/src/plugins/platforms/qnx/qqnxwindow.cpp @@ -569,7 +569,7 @@ void QQnxWindow::requestActivateWindow() for (int i = 1; i < windowList.size(); ++i) windowList.at(i-1)->setFocus(windowList.at(i)->nativeHandle()); - windowList.last()->setFocus(windowList.last()->nativeHandle()); + windowList.last()->setFocus(windowList.constLast()->nativeHandle()); } screen_flush_context(m_screenContext, 0); diff --git a/src/plugins/platforms/xcb/qxcbmime.cpp b/src/plugins/platforms/xcb/qxcbmime.cpp index 3643b3e975..7592eb2887 100644 --- a/src/plugins/platforms/xcb/qxcbmime.cpp +++ b/src/plugins/platforms/xcb/qxcbmime.cpp @@ -220,7 +220,7 @@ QVariant QXcbMime::mimeConvertToFormat(QXcbConnection *connection, xcb_atom_t a, // The atomName variable is not used because mimeAtomToString() // converts "text/x-moz-url" to "text/uri-list". if (!list.isEmpty() && connection->atomName(a) == "text/x-moz-url") - return list.first(); + return list.constFirst(); return list; } else { return str; diff --git a/src/plugins/platforms/xcb/qxcbsessionmanager.cpp b/src/plugins/platforms/xcb/qxcbsessionmanager.cpp index 8744fcba3e..2303ccf806 100644 --- a/src/plugins/platforms/xcb/qxcbsessionmanager.cpp +++ b/src/plugins/platforms/xcb/qxcbsessionmanager.cpp @@ -146,7 +146,7 @@ static void sm_setProperty(const QString &name, const QStringList &value) for (QStringList::ConstIterator it = value.begin(); it != value.end(); ++it) { prop[count].length = (*it).length(); vl.append((*it).toUtf8()); - prop[count].value = (char*)vl.last().data(); + prop[count].value = (char*)vl.constLast().data(); ++count; } sm_setProperty(name.toLatin1().data(), SmLISTofARRAY8, count, prop); -- cgit v1.2.3 From 0cffe2135e7303bd103bdf888a345fe0a8b94cd6 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 14 Sep 2016 11:29:37 -0700 Subject: qversiontagging.h: Don't tag binaries in static mode Though there should have been no ill-effects, they happen. Task-number: QTBUG-52605 Change-Id: I9093948278414644a416fffd147444078edc3183 Reviewed-by: Oswald Buddenhagen Reviewed-by: Thiago Macieira --- src/corelib/global/qversiontagging.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/corelib/global/qversiontagging.h b/src/corelib/global/qversiontagging.h index fa824d1c89..b46bb7aa77 100644 --- a/src/corelib/global/qversiontagging.h +++ b/src/corelib/global/qversiontagging.h @@ -54,7 +54,7 @@ QT_BEGIN_NAMESPACE * There will only be one copy of the section in the output library or application. */ -#if defined(QT_BUILD_CORE_LIB) || defined(QT_BOOTSTRAPPED) || defined(QT_NO_VERSION_TAGGING) +#if defined(QT_BUILD_CORE_LIB) || defined(QT_BOOTSTRAPPED) || defined(QT_NO_VERSION_TAGGING) || defined(QT_STATIC) // don't make tags in QtCore, bootstrapped systems or if the user asked not to #elif defined(Q_CC_GNU) && !defined(Q_OS_ANDROID) # if defined(Q_PROCESSOR_X86) && (defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD_KERNEL)) -- cgit v1.2.3 From 8daa050ed2bc3502f19ae38e2c3060941a19a5a6 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 14 Sep 2016 15:07:23 -0700 Subject: Fix syncqt warning about wrong include syncqt says: QtGui: WARNING: /Users/tjmaciei/src/qt/qt5/qtbase/src/gui/kernel/qevent.h includes qiodevice.h when it should include QtCore/qiodevice.h Change-Id: I9093948278414644a416fffd14744fe9c6c9c5f8 Reviewed-by: Kai Koehne --- src/gui/kernel/qevent.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/gui/kernel/qevent.h b/src/gui/kernel/qevent.h index 570212966f..7fdad24f52 100644 --- a/src/gui/kernel/qevent.h +++ b/src/gui/kernel/qevent.h @@ -51,7 +51,7 @@ #include #include // ### Qt 6: Remove #include -#include // ### Qt 6: Replace by and forward declare QFile +#include // ### Qt 6: Replace by and forward declare QFile #include #include // ### Qt 6: Replace by forward declaration -- cgit v1.2.3 From 951b34453b575a314971a00c81e03a29082857b1 Mon Sep 17 00:00:00 2001 From: Jesus Fernandez Date: Wed, 12 Oct 2016 15:14:46 +0200 Subject: Include intrin.h header when using MSVC Allows the usage of _BitScanForward, _BitScanReverse, __popcnt and __popcnt16 functions. Fixes part of the build with MSVC15. Change-Id: I5ec37184209196ad19beddb4d6a36f9a9fd3b315 Reviewed-by: Thiago Macieira --- src/corelib/tools/qalgorithms.h | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src') diff --git a/src/corelib/tools/qalgorithms.h b/src/corelib/tools/qalgorithms.h index 6e472e8b22..038f4149c3 100644 --- a/src/corelib/tools/qalgorithms.h +++ b/src/corelib/tools/qalgorithms.h @@ -42,6 +42,10 @@ #include +#if defined(Q_CC_MSVC) +#include +#endif + QT_BEGIN_NAMESPACE QT_WARNING_PUSH QT_WARNING_DISABLE_GCC("-Wdeprecated-declarations") -- cgit v1.2.3 From 443c9c1db5dc2b3eb8fb754ff3b63f0b7d68e7e1 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Mon, 24 Oct 2016 16:48:53 +0200 Subject: Remove QSegfaultHandler class The origin of the class predate git history, but it has been apparently unused in Qt since Qt 4.5 times. Removing this relieves us from documenting its custom license. Change-Id: Ie91be5f0b2fbaf10dc212c44ebd37e6b9d781592 Reviewed-by: Lars Knoll --- src/corelib/kernel/kernel.pri | 2 - src/corelib/kernel/qcrashhandler.cpp | 421 ----------------------------------- src/corelib/kernel/qcrashhandler_p.h | 79 ------- 3 files changed, 502 deletions(-) delete mode 100644 src/corelib/kernel/qcrashhandler.cpp delete mode 100644 src/corelib/kernel/qcrashhandler_p.h (limited to 'src') diff --git a/src/corelib/kernel/kernel.pri b/src/corelib/kernel/kernel.pri index a78397e46c..7799113d30 100644 --- a/src/corelib/kernel/kernel.pri +++ b/src/corelib/kernel/kernel.pri @@ -140,14 +140,12 @@ nacl { unix|integrity { SOURCES += \ kernel/qcore_unix.cpp \ - kernel/qcrashhandler.cpp \ kernel/qeventdispatcher_unix.cpp \ kernel/qtimerinfo_unix.cpp !darwin|nacl: SOURCES += kernel/qelapsedtimer_unix.cpp HEADERS += \ kernel/qcore_unix_p.h \ - kernel/qcrashhandler_p.h \ kernel/qeventdispatcher_unix_p.h \ kernel/qpoll_p.h \ kernel/qtimerinfo_unix_p.h diff --git a/src/corelib/kernel/qcrashhandler.cpp b/src/corelib/kernel/qcrashhandler.cpp deleted file mode 100644 index 46bb8b7c11..0000000000 --- a/src/corelib/kernel/qcrashhandler.cpp +++ /dev/null @@ -1,421 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/************************************************************************* - * - * stacktrace.c 1.2 1998/12/21 - * - * Copyright (c) 1998 by Bjorn Reese - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND - * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. - * - ************************************************************************/ - -#include "qplatformdefs.h" -#include "private/qcrashhandler_p.h" -#include "qbytearray.h" // for qvsnprintf() - -#ifndef QT_NO_CRASHHANDLER - -#include -#include -#include - -QT_BEGIN_NAMESPACE - -QtCrashHandler QSegfaultHandler::callback = 0; - -#if defined(__GLIBC__) && (__GLIBC__ >= 2) && !defined(__UCLIBC__) && !defined(QT_LINUXBASE) -QT_BEGIN_INCLUDE_NAMESPACE -# include "qstring.h" -# include -QT_END_INCLUDE_NAMESPACE - -static void print_backtrace(FILE *outb) -{ - void *stack[128]; - int stack_size = backtrace(stack, sizeof(stack) / sizeof(void *)); - char **stack_symbols = backtrace_symbols(stack, stack_size); - fprintf(outb, "Stack [%d]:\n", stack_size); - if(FILE *cppfilt = popen("c++filt", "rw")) { - dup2(fileno(outb), fileno(cppfilt)); - for(int i = stack_size-1; i>=0; --i) - fwrite(stack_symbols[i], 1, strlen(stack_symbols[i]), cppfilt); - pclose(cppfilt); - } else { - for(int i = stack_size-1; i>=0; --i) - fprintf(outb, "#%d %p [%s]\n", i, stack[i], stack_symbols[i]); - } -} -static void init_backtrace(char **, int) -{ -} - -#else /* Don't use the GLIBC callback */ -/* Code sourced from: */ -QT_BEGIN_INCLUDE_NAMESPACE -#include -#include -#include -#include -#include -#if defined(Q_OS_IRIX) && defined(USE_LIBEXC) -# include -#endif -QT_END_INCLUDE_NAMESPACE - - -static char *globalProgName = NULL; -static bool backtrace_command(FILE *outb, const char *format, ...) -{ - - bool ret = false; - char buffer[50]; - - /* - * Please note that vsnprintf() is not ASync safe (ie. cannot safely - * be used from a signal handler.) If this proves to be a problem - * then the cmd string can be built by more basic functions such as - * strcpy, strcat, and a home-made integer-to-ascii function. - */ - va_list args; - char cmd[512]; - va_start(args, format); - qvsnprintf(cmd, 512, format, args); - va_end(args); - - char *foo = cmd; -#if 0 - foo = "echo hi"; -#endif - if(FILE *inb = popen(foo, "r")) { - while(!feof(inb)) { - int len = fread(buffer, 1, sizeof(buffer), inb); - if(!len) - break; - if(!ret) { - fwrite("Output from ", 1, strlen("Output from "), outb); - strtok(cmd, " "); - fwrite(cmd, 1, strlen(cmd), outb); - fwrite("\n", 1, 1, outb); - ret = true; - } - fwrite(buffer, 1, len, outb); - } - fclose(inb); - } - return ret; -} - -static void init_backtrace(char **argv, int argc) -{ - if(argc >= 1) - globalProgName = argv[0]; -} - -static void print_backtrace(FILE *outb) -{ - /* - * In general dbx seems to do a better job than gdb. - * - * Different dbx implementations require different flags/commands. - */ -#if defined(Q_OS_AIX) - if(backtrace_command(outb, "dbx -a %d 2>/dev/null </dev/null </dev/null <&1 </dev/null </dev/null </dev/null </dev/null </dev/null </dev/null </dev/null </dev/null </dev/null <&1 < </dev/null </dev/null < - -#ifndef QT_NO_CRASHHANDLER - -QT_BEGIN_NAMESPACE - -typedef void (*QtCrashHandler)(); - -class Q_CORE_EXPORT QSegfaultHandler -{ - friend void qt_signal_handler(int); - static QtCrashHandler callback; -public: - static void initialize(char **, int); - - inline static void installCrashHandler(QtCrashHandler h) { callback = h; } - inline static QtCrashHandler crashHandler() { return callback; } - -private: -}; - -QT_END_NAMESPACE - -#endif // QT_NO_CRASHHANDLER - -#endif // QCRASHHANDLER_P_H -- cgit v1.2.3 From 60dbd80e5a26182b3ed9e2c60bb7212dfd32632b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Somers?= Date: Wed, 28 Sep 2016 10:13:27 +0200 Subject: Document that qFuzzyCompare does not work on NaN or infinity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On a discussion in the Development mailing list it became clear that qFuzzyCompare does not work for NaN or infinity values. That was not mentioned in the method documentation though. This patch fixes that hiatus. It also clarifies how to deal with the comparing to 0.0 limitation. Change-Id: I8b6d54cc0c1136e79b0d7be1a62bc9ed394d2575 Reviewed-by: Topi Reiniö Reviewed-by: Martin Smith --- src/corelib/global/qglobal.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp index 6d7fbce946..59799b07bb 100644 --- a/src/corelib/global/qglobal.cpp +++ b/src/corelib/global/qglobal.cpp @@ -4109,8 +4109,10 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters) Compares the floating point value \a p1 and \a p2 and returns \c true if they are considered equal, otherwise \c false. - Note that comparing values where either \a p1 or \a p2 is 0.0 will not work. - The solution to this is to compare against values greater than or equal to 1.0. + Note that comparing values where either \a p1 or \a p2 is 0.0 will not work, + nor does comparing values where one of the values is NaN or infinity. + If one of the values is always 0.0, use qFuzzyIsNull instead. If one of the + values is likely to be 0.0, one solution is to add 1.0 to both values. \snippet code/src_corelib_global_qglobal.cpp 46 -- cgit v1.2.3 From 99ce5d5e85007cb656cd48ab161be14af8f16238 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Wed, 28 Sep 2016 13:58:56 +0200 Subject: iOS: refactor usage of photos into optional plugin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Starting from iOS 10, apps that tries to access photos on the device need to specify the reason for this up front by adding the key 'NSPhotoLibraryUsageDescription' into Info.plist. If the key is missing, the app will be rejected from AppStore. This causes problems for the iOS plugin as it stands since parts of it already tries to access photos, e.g to show an image picker dialog if a file dialog is set to open QStandardPaths::PicturesLocation. This means that currently, all apps written with Qt will be rejected from AppStore unless the developer adds this key, whether he tries to access photos or not. To solve this, we choose to split the plugin into two parts, one that contains the core functionality, and one that contains optional support. The latter will need to be enabled explicit by the developer in the pro file, or in this case, indirectly by adding the right key to the Info.plist. This patch refactors the code in the plugin that gives access to photos into a separate optional plugin called 'nsphotolibrarysupport'. Change-Id: Ic4351eb0bbfffdf840fd88cd00bb29a25907798f Reviewed-by: Tor Arne Vestbø Reviewed-by: Jake Petroules --- src/gui/gui.pro | 1 + src/plugins/platforms/ios/ios.pro | 63 +-- src/plugins/platforms/ios/kernel.pro | 58 +++ .../nsphotolibrarysupport.pro | 22 + .../ios/optional/nsphotolibrarysupport/plugin.json | 3 + .../ios/optional/nsphotolibrarysupport/plugin.mm | 64 +++ .../qiosfileengineassetslibrary.h | 76 ++++ .../qiosfileengineassetslibrary.mm | 469 +++++++++++++++++++++ .../nsphotolibrarysupport/qiosfileenginefactory.h | 55 +++ .../qiosimagepickercontroller.h | 42 ++ .../qiosimagepickercontroller.mm | 66 +++ src/plugins/platforms/ios/optional/optional.pro | 2 + src/plugins/platforms/ios/qiosfiledialog.h | 2 + src/plugins/platforms/ios/qiosfiledialog.mm | 79 ++-- .../platforms/ios/qiosfileengineassetslibrary.h | 76 ---- .../platforms/ios/qiosfileengineassetslibrary.mm | 469 --------------------- src/plugins/platforms/ios/qiosfileenginefactory.h | 55 --- src/plugins/platforms/ios/qiosintegration.h | 7 +- src/plugins/platforms/ios/qiosintegration.mm | 8 + .../platforms/ios/qiosoptionalplugininterface.h | 59 +++ 20 files changed, 967 insertions(+), 709 deletions(-) create mode 100644 src/plugins/platforms/ios/kernel.pro create mode 100644 src/plugins/platforms/ios/optional/nsphotolibrarysupport/nsphotolibrarysupport.pro create mode 100644 src/plugins/platforms/ios/optional/nsphotolibrarysupport/plugin.json create mode 100644 src/plugins/platforms/ios/optional/nsphotolibrarysupport/plugin.mm create mode 100644 src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.h create mode 100644 src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.mm create mode 100644 src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileenginefactory.h create mode 100644 src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosimagepickercontroller.h create mode 100644 src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosimagepickercontroller.mm create mode 100644 src/plugins/platforms/ios/optional/optional.pro delete mode 100644 src/plugins/platforms/ios/qiosfileengineassetslibrary.h delete mode 100644 src/plugins/platforms/ios/qiosfileengineassetslibrary.mm delete mode 100644 src/plugins/platforms/ios/qiosfileenginefactory.h create mode 100644 src/plugins/platforms/ios/qiosoptionalplugininterface.h (limited to 'src') diff --git a/src/gui/gui.pro b/src/gui/gui.pro index 69434e801f..2cdb3a7ab7 100644 --- a/src/gui/gui.pro +++ b/src/gui/gui.pro @@ -9,6 +9,7 @@ QMAKE_DOCS = $$PWD/doc/qtgui.qdocconf MODULE_PLUGIN_TYPES = \ platforms \ + platforms/darwin \ xcbglintegrations \ platformthemes \ platforminputcontexts \ diff --git a/src/plugins/platforms/ios/ios.pro b/src/plugins/platforms/ios/ios.pro index 545db8c093..594ccefcf1 100644 --- a/src/plugins/platforms/ios/ios.pro +++ b/src/plugins/platforms/ios/ios.pro @@ -1,61 +1,2 @@ -TARGET = qios - -QT += core-private gui-private platformsupport-private -LIBS += -framework Foundation -framework UIKit -framework QuartzCore -framework AssetsLibrary - -OBJECTIVE_SOURCES = \ - plugin.mm \ - qiosintegration.mm \ - qioseventdispatcher.mm \ - qioswindow.mm \ - qiosscreen.mm \ - qiosbackingstore.mm \ - qiosapplicationdelegate.mm \ - qiosapplicationstate.mm \ - qiosviewcontroller.mm \ - qioscontext.mm \ - qiosinputcontext.mm \ - qiostheme.mm \ - qiosglobal.mm \ - qiosservices.mm \ - quiview.mm \ - qiosclipboard.mm \ - quiaccessibilityelement.mm \ - qiosplatformaccessibility.mm \ - qiostextresponder.mm \ - qiosmenu.mm \ - qiosfileengineassetslibrary.mm \ - qiosfiledialog.mm - -HEADERS = \ - qiosintegration.h \ - qioseventdispatcher.h \ - qioswindow.h \ - qiosscreen.h \ - qiosbackingstore.h \ - qiosapplicationdelegate.h \ - qiosapplicationstate.h \ - qiosviewcontroller.h \ - qioscontext.h \ - qiosinputcontext.h \ - qiostheme.h \ - qiosglobal.h \ - qiosservices.h \ - quiview.h \ - qiosclipboard.h \ - quiaccessibilityelement.h \ - qiosplatformaccessibility.h \ - qiostextresponder.h \ - qiosmenu.h \ - qiosfileenginefactory.h \ - qiosfileengineassetslibrary.h \ - qiosfiledialog.h - -OTHER_FILES = \ - quiview_textinput.mm \ - quiview_accessibility.mm - -PLUGIN_TYPE = platforms -PLUGIN_CLASS_NAME = QIOSIntegrationPlugin -!equals(TARGET, $$QT_DEFAULT_QPA_PLUGIN): PLUGIN_EXTENDS = - -load(qt_plugin) +TEMPLATE = subdirs +SUBDIRS = kernel.pro optional diff --git a/src/plugins/platforms/ios/kernel.pro b/src/plugins/platforms/ios/kernel.pro new file mode 100644 index 0000000000..84035877c5 --- /dev/null +++ b/src/plugins/platforms/ios/kernel.pro @@ -0,0 +1,58 @@ +TARGET = qios + +QT += core-private gui-private platformsupport-private +LIBS += -framework Foundation -framework UIKit -framework QuartzCore + +OBJECTIVE_SOURCES = \ + plugin.mm \ + qiosintegration.mm \ + qioseventdispatcher.mm \ + qioswindow.mm \ + qiosscreen.mm \ + qiosbackingstore.mm \ + qiosapplicationdelegate.mm \ + qiosapplicationstate.mm \ + qiosviewcontroller.mm \ + qioscontext.mm \ + qiosinputcontext.mm \ + qiostheme.mm \ + qiosglobal.mm \ + qiosservices.mm \ + quiview.mm \ + qiosclipboard.mm \ + quiaccessibilityelement.mm \ + qiosplatformaccessibility.mm \ + qiostextresponder.mm \ + qiosmenu.mm \ + qiosfiledialog.mm + +HEADERS = \ + qiosintegration.h \ + qioseventdispatcher.h \ + qioswindow.h \ + qiosscreen.h \ + qiosbackingstore.h \ + qiosapplicationdelegate.h \ + qiosapplicationstate.h \ + qiosviewcontroller.h \ + qioscontext.h \ + qiosinputcontext.h \ + qiostheme.h \ + qiosglobal.h \ + qiosservices.h \ + quiview.h \ + qiosclipboard.h \ + quiaccessibilityelement.h \ + qiosplatformaccessibility.h \ + qiostextresponder.h \ + qiosmenu.h \ + qiosfiledialog.h + +OTHER_FILES = \ + quiview_textinput.mm \ + quiview_accessibility.mm + +PLUGIN_TYPE = platforms +PLUGIN_CLASS_NAME = QIOSIntegrationPlugin +!equals(TARGET, $$QT_DEFAULT_QPA_PLUGIN): PLUGIN_EXTENDS = - +load(qt_plugin) diff --git a/src/plugins/platforms/ios/optional/nsphotolibrarysupport/nsphotolibrarysupport.pro b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/nsphotolibrarysupport.pro new file mode 100644 index 0000000000..f4588dda03 --- /dev/null +++ b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/nsphotolibrarysupport.pro @@ -0,0 +1,22 @@ +TARGET = qiosnsphotolibrarysupport + +QT += core gui gui-private +LIBS += -framework UIKit -framework AssetsLibrary + +HEADERS = \ + qiosfileengineassetslibrary.h \ + qiosfileenginefactory.h \ + qiosimagepickercontroller.h + +OBJECTIVE_SOURCES = \ + plugin.mm \ + qiosfileengineassetslibrary.mm \ + qiosimagepickercontroller.mm \ + +OTHER_FILES = \ + plugin.json + +PLUGIN_CLASS_NAME = QIosOptionalPlugin_NSPhotoLibrary +PLUGIN_EXTENDS = - +PLUGIN_TYPE = platforms/darwin +load(qt_plugin) diff --git a/src/plugins/platforms/ios/optional/nsphotolibrarysupport/plugin.json b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/plugin.json new file mode 100644 index 0000000000..4491fb3d59 --- /dev/null +++ b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/plugin.json @@ -0,0 +1,3 @@ +{ + "Keys": [ "NSPhotoLibrarySupport" ] +} diff --git a/src/plugins/platforms/ios/optional/nsphotolibrarysupport/plugin.mm b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/plugin.mm new file mode 100644 index 0000000000..2ec0d33a41 --- /dev/null +++ b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/plugin.mm @@ -0,0 +1,64 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** 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 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "../../qiosoptionalplugininterface.h" +#include "../../qiosfiledialog.h" + +#include "qiosimagepickercontroller.h" +#include "qiosfileenginefactory.h" + +QT_BEGIN_NAMESPACE + +class QIosOptionalPlugin_NSPhotoLibrary : public QObject, QIosOptionalPluginInterface +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID QIosOptionalPluginInterface_iid FILE "plugin.json") + Q_INTERFACES(QIosOptionalPluginInterface) + +public: + explicit QIosOptionalPlugin_NSPhotoLibrary(QObject* = 0) {}; + ~QIosOptionalPlugin_NSPhotoLibrary() {} + + UIViewController* createImagePickerController(QIOSFileDialog *fileDialog) const override + { + return [[[QIOSImagePickerController alloc] initWithQIOSFileDialog:fileDialog] autorelease]; + } + +private: + QIOSFileEngineFactory m_fileEngineFactory; + +}; + +QT_END_NAMESPACE + +#include "plugin.moc" diff --git a/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.h b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.h new file mode 100644 index 0000000000..0e29a1003e --- /dev/null +++ b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.h @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** 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 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QIOSFILEENGINEASSETSLIBRARY_H +#define QIOSFILEENGINEASSETSLIBRARY_H + +#include + +Q_FORWARD_DECLARE_OBJC_CLASS(ALAsset); +class QIOSAssetData; + +class QIOSFileEngineAssetsLibrary : public QAbstractFileEngine +{ +public: + QIOSFileEngineAssetsLibrary(const QString &fileName); + ~QIOSFileEngineAssetsLibrary(); + + bool open(QIODevice::OpenMode openMode) Q_DECL_OVERRIDE; + bool close() Q_DECL_OVERRIDE; + FileFlags fileFlags(FileFlags type) const Q_DECL_OVERRIDE; + qint64 size() const Q_DECL_OVERRIDE; + qint64 read(char *data, qint64 maxlen) Q_DECL_OVERRIDE; + qint64 pos() const Q_DECL_OVERRIDE; + bool seek(qint64 pos) Q_DECL_OVERRIDE; + QString fileName(FileName file) const Q_DECL_OVERRIDE; + void setFileName(const QString &file) Q_DECL_OVERRIDE; + QStringList entryList(QDir::Filters filters, const QStringList &filterNames) const Q_DECL_OVERRIDE; + +#ifndef QT_NO_FILESYSTEMITERATOR + Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) Q_DECL_OVERRIDE; + Iterator *endEntryList() Q_DECL_OVERRIDE; +#endif + + void setError(QFile::FileError error, const QString &str) { QAbstractFileEngine::setError(error, str); } + +private: + QString m_fileName; + QString m_assetUrl; + qint64 m_offset; + mutable QIOSAssetData *m_data; + + ALAsset *loadAsset() const; +}; + +#endif // QIOSFILEENGINEASSETSLIBRARY_H + diff --git a/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.mm b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.mm new file mode 100644 index 0000000000..2e88c37c01 --- /dev/null +++ b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.mm @@ -0,0 +1,469 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** 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 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qiosfileengineassetslibrary.h" + +#import +#import + +#include +#include +#include +#include +#include + +static QThreadStorage g_iteratorCurrentUrl; +static QThreadStorage > g_assetDataCache; + +static const int kBufferSize = 10; +static ALAsset *kNoAsset = 0; + +static bool ensureAuthorizationDialogNotBlocked() +{ + if ([ALAssetsLibrary authorizationStatus] != ALAuthorizationStatusNotDetermined) + return true; + + if (static_cast(QObjectPrivate::get(qApp))->in_exec) + return true; + + if ([NSThread isMainThread]) { + // The dialog is about to show, but since main has not finished, the dialog will be held + // back until the launch completes. This is problematic since we cannot successfully return + // back to the caller before the asset is ready, which also includes showing the dialog. To + // work around this, we create an event loop to that will complete the launch (return from the + // applicationDidFinishLaunching callback). But this will only work if we're on the main thread. + QEventLoop loop; + QTimer::singleShot(1, &loop, &QEventLoop::quit); + loop.exec(); + } else { + NSLog(@"QIOSFileEngine: unable to show assets authorization dialog from non-gui thread before QApplication is executing."); + return false; + } + + return true; +} + +// ------------------------------------------------------------------------- + +class QIOSAssetEnumerator +{ +public: + QIOSAssetEnumerator(ALAssetsLibrary *assetsLibrary, ALAssetsGroupType type) + : m_semWriteAsset(dispatch_semaphore_create(kBufferSize)) + , m_semReadAsset(dispatch_semaphore_create(0)) + , m_stop(false) + , m_assetsLibrary([assetsLibrary retain]) + , m_type(type) + , m_buffer(QVector(kBufferSize)) + , m_readIndex(0) + , m_writeIndex(0) + , m_nextAssetReady(false) + { + if (!ensureAuthorizationDialogNotBlocked()) + writeAsset(kNoAsset); + else + startEnumerate(); + } + + ~QIOSAssetEnumerator() + { + m_stop = true; + + // Flush and autorelease remaining assets in the buffer + while (hasNext()) + next(); + + // Documentation states that we need to balance out calls to 'wait' + // and 'signal'. Since the enumeration function always will be one 'wait' + // ahead, we need to signal m_semProceedToNextAsset one last time. + dispatch_semaphore_signal(m_semWriteAsset); + dispatch_release(m_semReadAsset); + dispatch_release(m_semWriteAsset); + + [m_assetsLibrary autorelease]; + } + + bool hasNext() + { + if (!m_nextAssetReady) { + dispatch_semaphore_wait(m_semReadAsset, DISPATCH_TIME_FOREVER); + m_nextAssetReady = true; + } + return m_buffer[m_readIndex] != kNoAsset; + } + + ALAsset *next() + { + Q_ASSERT(m_nextAssetReady); + Q_ASSERT(m_buffer[m_readIndex]); + + ALAsset *asset = [m_buffer[m_readIndex] autorelease]; + dispatch_semaphore_signal(m_semWriteAsset); + + m_readIndex = (m_readIndex + 1) % kBufferSize; + m_nextAssetReady = false; + return asset; + } + +private: + dispatch_semaphore_t m_semWriteAsset; + dispatch_semaphore_t m_semReadAsset; + std::atomic_bool m_stop; + + ALAssetsLibrary *m_assetsLibrary; + ALAssetsGroupType m_type; + QVector m_buffer; + int m_readIndex; + int m_writeIndex; + bool m_nextAssetReady; + + void writeAsset(ALAsset *asset) + { + dispatch_semaphore_wait(m_semWriteAsset, DISPATCH_TIME_FOREVER); + m_buffer[m_writeIndex] = [asset retain]; + dispatch_semaphore_signal(m_semReadAsset); + m_writeIndex = (m_writeIndex + 1) % kBufferSize; + } + + void startEnumerate() + { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + [m_assetsLibrary enumerateGroupsWithTypes:m_type usingBlock:^(ALAssetsGroup *group, BOOL *stopEnumerate) { + + if (!group) { + writeAsset(kNoAsset); + return; + } + + if (m_stop) { + *stopEnumerate = true; + return; + } + + [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stopEnumerate) { + Q_UNUSED(index); + if (!asset || ![[asset valueForProperty:ALAssetPropertyType] isEqual:ALAssetTypePhoto]) + return; + + writeAsset(asset); + *stopEnumerate = m_stop; + }]; + } failureBlock:^(NSError *error) { + NSLog(@"QIOSFileEngine: %@", error); + writeAsset(kNoAsset); + }]; + }); + } + +}; + +// ------------------------------------------------------------------------- + +class QIOSAssetData : public QObject +{ +public: + QIOSAssetData(const QString &assetUrl, QIOSFileEngineAssetsLibrary *engine) + : m_asset(0) + , m_assetUrl(assetUrl) + , m_assetLibrary(0) + { + if (!ensureAuthorizationDialogNotBlocked()) + return; + + if (QIOSAssetData *assetData = g_assetDataCache.localData()) { + // It's a common pattern that QFiles pointing to the same path are created and destroyed + // several times during a single event loop cycle. To avoid loading the same asset + // over and over, we check if the last loaded asset has not been destroyed yet, and try to + // reuse its data. + if (assetData->m_assetUrl == assetUrl) { + m_assetLibrary = [assetData->m_assetLibrary retain]; + m_asset = [assetData->m_asset retain]; + return; + } + } + + // We can only load images from the asset library async. And this might take time, since it + // involves showing the authorization dialog. But the QFile API is synchronuous, so we need to + // wait until we have access to the data. [ALAssetLibrary assetForUrl:] will shedule a block on + // the current thread. But instead of spinning the event loop to force the block to execute, we + // wrap the call inside a synchronuous dispatch queue so that it executes on another thread. + dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + NSURL *url = [NSURL URLWithString:assetUrl.toNSString()]; + m_assetLibrary = [[ALAssetsLibrary alloc] init]; + [m_assetLibrary assetForURL:url resultBlock:^(ALAsset *asset) { + + if (!asset) { + // When an asset couldn't be loaded, chances are that it belongs to ALAssetsGroupPhotoStream. + // Such assets can be stored in the cloud and might need to be downloaded first. Unfortunately, + // forcing that to happen is hidden behind private APIs ([ALAsset requestDefaultRepresentation]). + // As a work-around, we search for it instead, since that will give us a pointer to the asset. + QIOSAssetEnumerator e(m_assetLibrary, ALAssetsGroupPhotoStream); + while (e.hasNext()) { + ALAsset *a = e.next(); + QString url = QUrl::fromNSURL([a valueForProperty:ALAssetPropertyAssetURL]).toString(); + if (url == assetUrl) { + asset = a; + break; + } + } + } + + if (!asset) + engine->setError(QFile::OpenError, QLatin1String("could not open image")); + + m_asset = [asset retain]; + dispatch_semaphore_signal(semaphore); + } failureBlock:^(NSError *error) { + engine->setError(QFile::OpenError, QString::fromNSString(error.localizedDescription)); + dispatch_semaphore_signal(semaphore); + }]; + }); + + dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); + dispatch_release(semaphore); + + g_assetDataCache.setLocalData(this); + } + + ~QIOSAssetData() + { + [m_assetLibrary release]; + [m_asset release]; + if (g_assetDataCache.localData() == this) + g_assetDataCache.setLocalData(0); + } + + ALAsset *m_asset; + +private: + QString m_assetUrl; + ALAssetsLibrary *m_assetLibrary; +}; + +// ------------------------------------------------------------------------- + +#ifndef QT_NO_FILESYSTEMITERATOR + +class QIOSFileEngineIteratorAssetsLibrary : public QAbstractFileEngineIterator +{ +public: + QIOSAssetEnumerator *m_enumerator; + + QIOSFileEngineIteratorAssetsLibrary( + QDir::Filters filters, const QStringList &nameFilters) + : QAbstractFileEngineIterator(filters, nameFilters) + , m_enumerator(new QIOSAssetEnumerator([[[ALAssetsLibrary alloc] init] autorelease], ALAssetsGroupAll)) + { + } + + ~QIOSFileEngineIteratorAssetsLibrary() + { + delete m_enumerator; + g_iteratorCurrentUrl.setLocalData(QString()); + } + + QString next() Q_DECL_OVERRIDE + { + // Cache the URL that we are about to return, since QDir will immediately create a + // new file engine on the file and ask if it exists. Unless we do this, we end up + // creating a new ALAsset just to verify its existence, which will be especially + // costly for assets belonging to ALAssetsGroupPhotoStream. + ALAsset *asset = m_enumerator->next(); + QString url = QUrl::fromNSURL([asset valueForProperty:ALAssetPropertyAssetURL]).toString(); + g_iteratorCurrentUrl.setLocalData(url); + return url; + } + + bool hasNext() const Q_DECL_OVERRIDE + { + return m_enumerator->hasNext(); + } + + QString currentFileName() const Q_DECL_OVERRIDE + { + return g_iteratorCurrentUrl.localData(); + } + + QFileInfo currentFileInfo() const Q_DECL_OVERRIDE + { + return QFileInfo(currentFileName()); + } +}; + +#endif + +// ------------------------------------------------------------------------- + +QIOSFileEngineAssetsLibrary::QIOSFileEngineAssetsLibrary(const QString &fileName) + : m_offset(0) + , m_data(0) +{ + setFileName(fileName); +} + +QIOSFileEngineAssetsLibrary::~QIOSFileEngineAssetsLibrary() +{ + close(); +} + +ALAsset *QIOSFileEngineAssetsLibrary::loadAsset() const +{ + if (!m_data) + m_data = new QIOSAssetData(m_assetUrl, const_cast(this)); + return m_data->m_asset; +} + +bool QIOSFileEngineAssetsLibrary::open(QIODevice::OpenMode openMode) +{ + if (openMode & (QIODevice::WriteOnly | QIODevice::Text)) + return false; + return loadAsset(); +} + +bool QIOSFileEngineAssetsLibrary::close() +{ + if (m_data) { + // Delete later, so that we can reuse the asset if a QFile is + // opened with the same path during the same event loop cycle. + m_data->deleteLater(); + m_data = 0; + } + return true; +} + +QAbstractFileEngine::FileFlags QIOSFileEngineAssetsLibrary::fileFlags(QAbstractFileEngine::FileFlags type) const +{ + QAbstractFileEngine::FileFlags flags = 0; + const bool isDir = (m_assetUrl == QLatin1String("assets-library://")); + const bool exists = isDir || m_assetUrl == g_iteratorCurrentUrl.localData() || loadAsset(); + + if (!exists) + return flags; + + if (type & FlagsMask) + flags |= ExistsFlag; + if (type & PermsMask) { + ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus]; + if (status != ALAuthorizationStatusRestricted && status != ALAuthorizationStatusDenied) + flags |= ReadOwnerPerm | ReadUserPerm | ReadGroupPerm | ReadOtherPerm; + } + if (type & TypesMask) + flags |= isDir ? DirectoryType : FileType; + + return flags; +} + +qint64 QIOSFileEngineAssetsLibrary::size() const +{ + if (ALAsset *asset = loadAsset()) + return [[asset defaultRepresentation] size]; + return 0; +} + +qint64 QIOSFileEngineAssetsLibrary::read(char *data, qint64 maxlen) +{ + ALAsset *asset = loadAsset(); + if (!asset) + return -1; + + qint64 bytesRead = qMin(maxlen, size() - m_offset); + if (!bytesRead) + return 0; + + NSError *error = 0; + [[asset defaultRepresentation] getBytes:(uint8_t *)data fromOffset:m_offset length:bytesRead error:&error]; + + if (error) { + setError(QFile::ReadError, QString::fromNSString(error.localizedDescription)); + return -1; + } + + m_offset += bytesRead; + return bytesRead; +} + +qint64 QIOSFileEngineAssetsLibrary::pos() const +{ + return m_offset; +} + +bool QIOSFileEngineAssetsLibrary::seek(qint64 pos) +{ + if (pos >= size()) + return false; + m_offset = pos; + return true; +} + +QString QIOSFileEngineAssetsLibrary::fileName(FileName file) const +{ + Q_UNUSED(file); + return m_fileName; +} + +void QIOSFileEngineAssetsLibrary::setFileName(const QString &file) +{ + if (m_data) + close(); + m_fileName = file; + // QUrl::fromLocalFile() will remove double slashes. Since the asset url is + // passed around as a file name in the app (and converted to/from a file url, e.g + // in QFileDialog), we need to ensure that m_assetUrl ends up being valid. + int index = file.indexOf(QLatin1String("/asset")); + if (index == -1) + m_assetUrl = QLatin1String("assets-library://"); + else + m_assetUrl = QLatin1String("assets-library:/") + file.mid(index); +} + +QStringList QIOSFileEngineAssetsLibrary::entryList(QDir::Filters filters, const QStringList &filterNames) const +{ + return QAbstractFileEngine::entryList(filters, filterNames); +} + +#ifndef QT_NO_FILESYSTEMITERATOR + +QAbstractFileEngine::Iterator *QIOSFileEngineAssetsLibrary::beginEntryList( + QDir::Filters filters, const QStringList &filterNames) +{ + return new QIOSFileEngineIteratorAssetsLibrary(filters, filterNames); +} + +QAbstractFileEngine::Iterator *QIOSFileEngineAssetsLibrary::endEntryList() +{ + return 0; +} + +#endif diff --git a/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileenginefactory.h b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileenginefactory.h new file mode 100644 index 0000000000..29f543caae --- /dev/null +++ b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileenginefactory.h @@ -0,0 +1,55 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** 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 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QIOSFILEENGINEFACTORY_H +#define QIOSFILEENGINEFACTORY_H + +#include +#include +#include "qiosfileengineassetslibrary.h" + +class QIOSFileEngineFactory : public QAbstractFileEngineHandler +{ +public: + QAbstractFileEngine* create(const QString &fileName) const + { + static QLatin1String assetsScheme("assets-library:"); + + if (fileName.toLower().startsWith(assetsScheme)) + return new QIOSFileEngineAssetsLibrary(fileName); + + return 0; + } +}; + +#endif // QIOSFILEENGINEFACTORY_H diff --git a/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosimagepickercontroller.h b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosimagepickercontroller.h new file mode 100644 index 0000000000..df3f6b9fa3 --- /dev/null +++ b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosimagepickercontroller.h @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** 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 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#import + +#include "../../qiosfiledialog.h" + +@interface QIOSImagePickerController : UIImagePickerController { + QIOSFileDialog *m_fileDialog; +} +- (id)initWithQIOSFileDialog:(QIOSFileDialog *)fileDialog; +@end diff --git a/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosimagepickercontroller.mm b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosimagepickercontroller.mm new file mode 100644 index 0000000000..f9662b964a --- /dev/null +++ b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosimagepickercontroller.mm @@ -0,0 +1,66 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** 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 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#import + +#include "qiosimagepickercontroller.h" + +@implementation QIOSImagePickerController + +- (id)initWithQIOSFileDialog:(QIOSFileDialog *)fileDialog +{ + self = [super init]; + if (self) { + m_fileDialog = fileDialog; + [self setSourceType:UIImagePickerControllerSourceTypePhotoLibrary]; + [self setDelegate:self]; + } + return self; +} + +- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info +{ + Q_UNUSED(picker); + NSURL *url = [info objectForKey:UIImagePickerControllerReferenceURL]; + QUrl fileUrl = QUrl::fromLocalFile(QString::fromNSString([url description])); + m_fileDialog->selectedFilesChanged(QList() << fileUrl); + emit m_fileDialog->accept(); +} + +- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker +{ + Q_UNUSED(picker) + emit m_fileDialog->reject(); +} + +@end diff --git a/src/plugins/platforms/ios/optional/optional.pro b/src/plugins/platforms/ios/optional/optional.pro new file mode 100644 index 0000000000..5e3421a025 --- /dev/null +++ b/src/plugins/platforms/ios/optional/optional.pro @@ -0,0 +1,2 @@ +TEMPLATE = subdirs +SUBDIRS = nsphotolibrarysupport diff --git a/src/plugins/platforms/ios/qiosfiledialog.h b/src/plugins/platforms/ios/qiosfiledialog.h index b4bf85edd9..668cf18caf 100644 --- a/src/plugins/platforms/ios/qiosfiledialog.h +++ b/src/plugins/platforms/ios/qiosfiledialog.h @@ -66,6 +66,8 @@ private: QList m_selection; QEventLoop m_eventLoop; UIViewController *m_viewController; + + bool showImagePickerDialog(QWindow *parent); }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/ios/qiosfiledialog.mm b/src/plugins/platforms/ios/qiosfiledialog.mm index 7c32784e9d..a70eb11ef8 100644 --- a/src/plugins/platforms/ios/qiosfiledialog.mm +++ b/src/plugins/platforms/ios/qiosfiledialog.mm @@ -31,52 +31,18 @@ ** ****************************************************************************/ -#include "qiosfiledialog.h" - #import #include #include +#include -@interface QIOSImagePickerController : UIImagePickerController { - QIOSFileDialog *m_fileDialog; -} -@end - -@implementation QIOSImagePickerController - -- (id)initWithQIOSFileDialog:(QIOSFileDialog *)fileDialog -{ - self = [super init]; - if (self) { - m_fileDialog = fileDialog; - [self setSourceType:UIImagePickerControllerSourceTypePhotoLibrary]; - [self setDelegate:self]; - } - return self; -} - -- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info -{ - Q_UNUSED(picker); - NSURL *url = [info objectForKey:UIImagePickerControllerReferenceURL]; - QUrl fileUrl = QUrl::fromLocalFile(QString::fromNSString([url description])); - m_fileDialog->selectedFilesChanged(QList() << fileUrl); - emit m_fileDialog->accept(); -} - -- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker -{ - Q_UNUSED(picker) - emit m_fileDialog->reject(); -} - -@end - -// -------------------------------------------------------------------------- +#include "qiosfiledialog.h" +#include "qiosintegration.h" +#include "qiosoptionalplugininterface.h" QIOSFileDialog::QIOSFileDialog() - : m_viewController(0) + : m_viewController(Q_NULLPTR) { } @@ -98,17 +64,36 @@ bool QIOSFileDialog::show(Qt::WindowFlags windowFlags, Qt::WindowModality window bool acceptOpen = options()->acceptMode() == QFileDialogOptions::AcceptOpen; QString directory = options()->initialDirectory().toLocalFile(); - if (acceptOpen && directory.startsWith(QLatin1String("assets-library:"))) { - m_viewController = [[QIOSImagePickerController alloc] initWithQIOSFileDialog:this]; - UIWindow *window = parent ? reinterpret_cast(parent->winId()).window - : [UIApplication sharedApplication].keyWindow; - [window.rootViewController presentViewController:m_viewController animated:YES completion:nil]; - return true; - } + if (acceptOpen && directory.startsWith(QLatin1String("assets-library:"))) + return showImagePickerDialog(parent); return false; } +bool QIOSFileDialog::showImagePickerDialog(QWindow *parent) +{ + if (!m_viewController) { + QFactoryLoader *plugins = QIOSIntegration::instance()->optionalPlugins(); + for (int i = 0; i < plugins->metaData().size(); ++i) { + QIosOptionalPluginInterface *plugin = qobject_cast(plugins->instance(i)); + m_viewController = [plugin->createImagePickerController(this) retain]; + if (m_viewController) + break; + } + } + + if (!m_viewController) { + qWarning() << "QIOSFileDialog: Could not resolve Qt plugin that gives access to photos on iOS"; + return false; + } + + UIWindow *window = parent ? reinterpret_cast(parent->winId()).window + : [UIApplication sharedApplication].keyWindow; + [window.rootViewController presentViewController:m_viewController animated:YES completion:nil]; + + return true; +} + void QIOSFileDialog::hide() { // QFileDialog will remember the last directory set, and open subsequent dialogs in the same @@ -120,6 +105,8 @@ void QIOSFileDialog::hide() emit directoryEntered(QUrl::fromLocalFile(QDir::currentPath())); [m_viewController dismissViewControllerAnimated:YES completion:nil]; + [m_viewController release]; + m_viewController = Q_NULLPTR; m_eventLoop.exit(); } diff --git a/src/plugins/platforms/ios/qiosfileengineassetslibrary.h b/src/plugins/platforms/ios/qiosfileengineassetslibrary.h deleted file mode 100644 index 37bbc7bf23..0000000000 --- a/src/plugins/platforms/ios/qiosfileengineassetslibrary.h +++ /dev/null @@ -1,76 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** 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 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QIOSFILEENGINEASSETSLIBRARY_H -#define QIOSFILEENGINEASSETSLIBRARY_H - -#include - -Q_FORWARD_DECLARE_OBJC_CLASS(ALAsset); -class QIOSAssetData; - -class QIOSFileEngineAssetsLibrary : public QAbstractFileEngine -{ -public: - QIOSFileEngineAssetsLibrary(const QString &fileName); - ~QIOSFileEngineAssetsLibrary(); - - bool open(QIODevice::OpenMode openMode) Q_DECL_OVERRIDE; - bool close() Q_DECL_OVERRIDE; - FileFlags fileFlags(FileFlags type) const Q_DECL_OVERRIDE; - qint64 size() const Q_DECL_OVERRIDE; - qint64 read(char *data, qint64 maxlen) Q_DECL_OVERRIDE; - qint64 pos() const Q_DECL_OVERRIDE; - bool seek(qint64 pos) Q_DECL_OVERRIDE; - QString fileName(FileName file) const Q_DECL_OVERRIDE; - void setFileName(const QString &file) Q_DECL_OVERRIDE; - QStringList entryList(QDir::Filters filters, const QStringList &filterNames) const Q_DECL_OVERRIDE; - -#ifndef QT_NO_FILESYSTEMITERATOR - Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) Q_DECL_OVERRIDE; - Iterator *endEntryList() Q_DECL_OVERRIDE; -#endif - - void setError(QFile::FileError error, const QString &str) { QAbstractFileEngine::setError(error, str); } - -private: - QString m_fileName; - QString m_assetUrl; - qint64 m_offset; - mutable QIOSAssetData *m_data; - - ALAsset *loadAsset() const; -}; - -#endif // QIOSFILEENGINEASSETSLIBRARY_H - diff --git a/src/plugins/platforms/ios/qiosfileengineassetslibrary.mm b/src/plugins/platforms/ios/qiosfileengineassetslibrary.mm deleted file mode 100644 index bb12c164d6..0000000000 --- a/src/plugins/platforms/ios/qiosfileengineassetslibrary.mm +++ /dev/null @@ -1,469 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** 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 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qiosfileengineassetslibrary.h" - -#import -#import - -#include -#include -#include -#include -#include - -static QThreadStorage g_iteratorCurrentUrl; -static QThreadStorage > g_assetDataCache; - -static const int kBufferSize = 10; -static ALAsset *kNoAsset = 0; - -static bool ensureAuthorizationDialogNotBlocked() -{ - if ([ALAssetsLibrary authorizationStatus] != ALAuthorizationStatusNotDetermined) - return true; - - if (static_cast(QObjectPrivate::get(qApp))->in_exec) - return true; - - if ([NSThread isMainThread]) { - // The dialog is about to show, but since main has not finished, the dialog will be held - // back until the launch completes. This is problematic since we cannot successfully return - // back to the caller before the asset is ready, which also includes showing the dialog. To - // work around this, we create an event loop to that will complete the launch (return from the - // applicationDidFinishLaunching callback). But this will only work if we're on the main thread. - QEventLoop loop; - QTimer::singleShot(1, &loop, &QEventLoop::quit); - loop.exec(); - } else { - NSLog(@"QIOSFileEngine: unable to show assets authorization dialog from non-gui thread before QApplication is executing."); - return false; - } - - return true; -} - -// ------------------------------------------------------------------------- - -class QIOSAssetEnumerator -{ -public: - QIOSAssetEnumerator(ALAssetsLibrary *assetsLibrary, ALAssetsGroupType type) - : m_semWriteAsset(dispatch_semaphore_create(kBufferSize)) - , m_semReadAsset(dispatch_semaphore_create(0)) - , m_stop(false) - , m_assetsLibrary([assetsLibrary retain]) - , m_type(type) - , m_buffer(QVector(kBufferSize)) - , m_readIndex(0) - , m_writeIndex(0) - , m_nextAssetReady(false) - { - if (!ensureAuthorizationDialogNotBlocked()) - writeAsset(kNoAsset); - else - startEnumerate(); - } - - ~QIOSAssetEnumerator() - { - m_stop = true; - - // Flush and autorelease remaining assets in the buffer - while (hasNext()) - next(); - - // Documentation states that we need to balance out calls to 'wait' - // and 'signal'. Since the enumeration function always will be one 'wait' - // ahead, we need to signal m_semProceedToNextAsset one last time. - dispatch_semaphore_signal(m_semWriteAsset); - dispatch_release(m_semReadAsset); - dispatch_release(m_semWriteAsset); - - [m_assetsLibrary autorelease]; - } - - bool hasNext() - { - if (!m_nextAssetReady) { - dispatch_semaphore_wait(m_semReadAsset, DISPATCH_TIME_FOREVER); - m_nextAssetReady = true; - } - return m_buffer[m_readIndex] != kNoAsset; - } - - ALAsset *next() - { - Q_ASSERT(m_nextAssetReady); - Q_ASSERT(m_buffer[m_readIndex]); - - ALAsset *asset = [m_buffer[m_readIndex] autorelease]; - dispatch_semaphore_signal(m_semWriteAsset); - - m_readIndex = (m_readIndex + 1) % kBufferSize; - m_nextAssetReady = false; - return asset; - } - -private: - dispatch_semaphore_t m_semWriteAsset; - dispatch_semaphore_t m_semReadAsset; - std::atomic_bool m_stop; - - ALAssetsLibrary *m_assetsLibrary; - ALAssetsGroupType m_type; - QVector m_buffer; - int m_readIndex; - int m_writeIndex; - bool m_nextAssetReady; - - void writeAsset(ALAsset *asset) - { - dispatch_semaphore_wait(m_semWriteAsset, DISPATCH_TIME_FOREVER); - m_buffer[m_writeIndex] = [asset retain]; - dispatch_semaphore_signal(m_semReadAsset); - m_writeIndex = (m_writeIndex + 1) % kBufferSize; - } - - void startEnumerate() - { - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - [m_assetsLibrary enumerateGroupsWithTypes:m_type usingBlock:^(ALAssetsGroup *group, BOOL *stopEnumerate) { - - if (!group) { - writeAsset(kNoAsset); - return; - } - - if (m_stop) { - *stopEnumerate = true; - return; - } - - [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stopEnumerate) { - Q_UNUSED(index); - if (!asset || ![[asset valueForProperty:ALAssetPropertyType] isEqual:ALAssetTypePhoto]) - return; - - writeAsset(asset); - *stopEnumerate = m_stop; - }]; - } failureBlock:^(NSError *error) { - NSLog(@"QIOSFileEngine: %@", error); - writeAsset(kNoAsset); - }]; - }); - } - -}; - -// ------------------------------------------------------------------------- - -class QIOSAssetData : public QObject -{ -public: - QIOSAssetData(const QString &assetUrl, QIOSFileEngineAssetsLibrary *engine) - : m_asset(0) - , m_assetUrl(assetUrl) - , m_assetLibrary(0) - { - if (!ensureAuthorizationDialogNotBlocked()) - return; - - if (QIOSAssetData *assetData = g_assetDataCache.localData()) { - // It's a common pattern that QFiles pointing to the same path are created and destroyed - // several times during a single event loop cycle. To avoid loading the same asset - // over and over, we check if the last loaded asset has not been destroyed yet, and try to - // reuse its data. - if (assetData->m_assetUrl == assetUrl) { - m_assetLibrary = [assetData->m_assetLibrary retain]; - m_asset = [assetData->m_asset retain]; - return; - } - } - - // We can only load images from the asset library async. And this might take time, since it - // involves showing the authorization dialog. But the QFile API is synchronuous, so we need to - // wait until we have access to the data. [ALAssetLibrary assetForUrl:] will shedule a block on - // the current thread. But instead of spinning the event loop to force the block to execute, we - // wrap the call inside a synchronuous dispatch queue so that it executes on another thread. - dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); - - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - NSURL *url = [NSURL URLWithString:assetUrl.toNSString()]; - m_assetLibrary = [[ALAssetsLibrary alloc] init]; - [m_assetLibrary assetForURL:url resultBlock:^(ALAsset *asset) { - - if (!asset) { - // When an asset couldn't be loaded, chances are that it belongs to ALAssetsGroupPhotoStream. - // Such assets can be stored in the cloud and might need to be downloaded first. Unfortunately, - // forcing that to happen is hidden behind private APIs ([ALAsset requestDefaultRepresentation]). - // As a work-around, we search for it instead, since that will give us a pointer to the asset. - QIOSAssetEnumerator e(m_assetLibrary, ALAssetsGroupPhotoStream); - while (e.hasNext()) { - ALAsset *a = e.next(); - QString url = QUrl::fromNSURL([a valueForProperty:ALAssetPropertyAssetURL]).toString(); - if (url == assetUrl) { - asset = a; - break; - } - } - } - - if (!asset) - engine->setError(QFile::OpenError, QLatin1String("could not open image")); - - m_asset = [asset retain]; - dispatch_semaphore_signal(semaphore); - } failureBlock:^(NSError *error) { - engine->setError(QFile::OpenError, QString::fromNSString(error.localizedDescription)); - dispatch_semaphore_signal(semaphore); - }]; - }); - - dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); - dispatch_release(semaphore); - - g_assetDataCache.setLocalData(this); - } - - ~QIOSAssetData() - { - [m_assetLibrary release]; - [m_asset release]; - if (g_assetDataCache.localData() == this) - g_assetDataCache.setLocalData(0); - } - - ALAsset *m_asset; - -private: - QString m_assetUrl; - ALAssetsLibrary *m_assetLibrary; -}; - -// ------------------------------------------------------------------------- - -#ifndef QT_NO_FILESYSTEMITERATOR - -class QIOSFileEngineIteratorAssetsLibrary : public QAbstractFileEngineIterator -{ -public: - QIOSAssetEnumerator *m_enumerator; - - QIOSFileEngineIteratorAssetsLibrary( - QDir::Filters filters, const QStringList &nameFilters) - : QAbstractFileEngineIterator(filters, nameFilters) - , m_enumerator(new QIOSAssetEnumerator([[[ALAssetsLibrary alloc] init] autorelease], ALAssetsGroupAll)) - { - } - - ~QIOSFileEngineIteratorAssetsLibrary() - { - delete m_enumerator; - g_iteratorCurrentUrl.setLocalData(QString()); - } - - QString next() Q_DECL_OVERRIDE - { - // Cache the URL that we are about to return, since QDir will immediately create a - // new file engine on the file and ask if it exists. Unless we do this, we end up - // creating a new ALAsset just to verify its existence, which will be especially - // costly for assets belonging to ALAssetsGroupPhotoStream. - ALAsset *asset = m_enumerator->next(); - QString url = QUrl::fromNSURL([asset valueForProperty:ALAssetPropertyAssetURL]).toString(); - g_iteratorCurrentUrl.setLocalData(url); - return url; - } - - bool hasNext() const Q_DECL_OVERRIDE - { - return m_enumerator->hasNext(); - } - - QString currentFileName() const Q_DECL_OVERRIDE - { - return g_iteratorCurrentUrl.localData(); - } - - QFileInfo currentFileInfo() const Q_DECL_OVERRIDE - { - return QFileInfo(currentFileName()); - } -}; - -#endif - -// ------------------------------------------------------------------------- - -QIOSFileEngineAssetsLibrary::QIOSFileEngineAssetsLibrary(const QString &fileName) - : m_offset(0) - , m_data(0) -{ - setFileName(fileName); -} - -QIOSFileEngineAssetsLibrary::~QIOSFileEngineAssetsLibrary() -{ - close(); -} - -ALAsset *QIOSFileEngineAssetsLibrary::loadAsset() const -{ - if (!m_data) - m_data = new QIOSAssetData(m_assetUrl, const_cast(this)); - return m_data->m_asset; -} - -bool QIOSFileEngineAssetsLibrary::open(QIODevice::OpenMode openMode) -{ - if (openMode & (QIODevice::WriteOnly | QIODevice::Text)) - return false; - return loadAsset(); -} - -bool QIOSFileEngineAssetsLibrary::close() -{ - if (m_data) { - // Delete later, so that we can reuse the asset if a QFile is - // opened with the same path during the same event loop cycle. - m_data->deleteLater(); - m_data = 0; - } - return true; -} - -QAbstractFileEngine::FileFlags QIOSFileEngineAssetsLibrary::fileFlags(QAbstractFileEngine::FileFlags type) const -{ - QAbstractFileEngine::FileFlags flags = 0; - const bool isDir = (m_assetUrl == QLatin1String("assets-library://")); - const bool exists = isDir || m_assetUrl == g_iteratorCurrentUrl.localData() || loadAsset(); - - if (!exists) - return flags; - - if (type & FlagsMask) - flags |= ExistsFlag; - if (type & PermsMask) { - ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus]; - if (status != ALAuthorizationStatusRestricted && status != ALAuthorizationStatusDenied) - flags |= ReadOwnerPerm | ReadUserPerm | ReadGroupPerm | ReadOtherPerm; - } - if (type & TypesMask) - flags |= isDir ? DirectoryType : FileType; - - return flags; -} - -qint64 QIOSFileEngineAssetsLibrary::size() const -{ - if (ALAsset *asset = loadAsset()) - return [[asset defaultRepresentation] size]; - return 0; -} - -qint64 QIOSFileEngineAssetsLibrary::read(char *data, qint64 maxlen) -{ - ALAsset *asset = loadAsset(); - if (!asset) - return -1; - - qint64 bytesRead = qMin(maxlen, size() - m_offset); - if (!bytesRead) - return 0; - - NSError *error = 0; - [[asset defaultRepresentation] getBytes:(uint8_t *)data fromOffset:m_offset length:bytesRead error:&error]; - - if (error) { - setError(QFile::ReadError, QString::fromNSString(error.localizedDescription)); - return -1; - } - - m_offset += bytesRead; - return bytesRead; -} - -qint64 QIOSFileEngineAssetsLibrary::pos() const -{ - return m_offset; -} - -bool QIOSFileEngineAssetsLibrary::seek(qint64 pos) -{ - if (pos >= size()) - return false; - m_offset = pos; - return true; -} - -QString QIOSFileEngineAssetsLibrary::fileName(FileName file) const -{ - Q_UNUSED(file); - return m_fileName; -} - -void QIOSFileEngineAssetsLibrary::setFileName(const QString &file) -{ - if (m_data) - close(); - m_fileName = file; - // QUrl::fromLocalFile() will remove double slashes. Since the asset url is - // passed around as a file name in the app (and converted to/from a file url, e.g - // in QFileDialog), we need to ensure that m_assetUrl ends up being valid. - int index = file.indexOf(QLatin1String("/asset")); - if (index == -1) - m_assetUrl = QLatin1String("assets-library://"); - else - m_assetUrl = QLatin1String("assets-library:/") + file.mid(index); -} - -QStringList QIOSFileEngineAssetsLibrary::entryList(QDir::Filters filters, const QStringList &filterNames) const -{ - return QAbstractFileEngine::entryList(filters, filterNames); -} - -#ifndef QT_NO_FILESYSTEMITERATOR - -QAbstractFileEngine::Iterator *QIOSFileEngineAssetsLibrary::beginEntryList( - QDir::Filters filters, const QStringList &filterNames) -{ - return new QIOSFileEngineIteratorAssetsLibrary(filters, filterNames); -} - -QAbstractFileEngine::Iterator *QIOSFileEngineAssetsLibrary::endEntryList() -{ - return 0; -} - -#endif diff --git a/src/plugins/platforms/ios/qiosfileenginefactory.h b/src/plugins/platforms/ios/qiosfileenginefactory.h deleted file mode 100644 index a8604c77d1..0000000000 --- a/src/plugins/platforms/ios/qiosfileenginefactory.h +++ /dev/null @@ -1,55 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** 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 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QIOSFILEENGINEFACTORY_H -#define QIOSFILEENGINEFACTORY_H - -#include -#include -#include "qiosfileengineassetslibrary.h" - -class QIOSFileEngineFactory : public QAbstractFileEngineHandler -{ -public: - QAbstractFileEngine* create(const QString &fileName) const - { - static QLatin1String assetsScheme("assets-library:"); - - if (fileName.toLower().startsWith(assetsScheme)) - return new QIOSFileEngineAssetsLibrary(fileName); - - return 0; - } -}; - -#endif // QIOSFILEENGINEFACTORY_H diff --git a/src/plugins/platforms/ios/qiosintegration.h b/src/plugins/platforms/ios/qiosintegration.h index 7d23fe1d62..25eb8990cb 100644 --- a/src/plugins/platforms/ios/qiosintegration.h +++ b/src/plugins/platforms/ios/qiosintegration.h @@ -38,8 +38,9 @@ #include #include +#include + #include "qiosapplicationstate.h" -#include "qiosfileenginefactory.h" QT_BEGIN_NAMESPACE @@ -91,6 +92,8 @@ public: void setDebugWindowManagement(bool); bool debugWindowManagement() const; + QFactoryLoader *optionalPlugins() { return m_optionalPlugins; } + private: QPlatformFontDatabase *m_fontDatabase; QPlatformClipboard *m_clipboard; @@ -99,7 +102,7 @@ private: QIOSApplicationState m_applicationState; QIOSServices *m_platformServices; mutable QPlatformAccessibility *m_accessibility; - QIOSFileEngineFactory m_fileEngineFactory; + QFactoryLoader *m_optionalPlugins; bool m_debugWindowManagement; }; diff --git a/src/plugins/platforms/ios/qiosintegration.mm b/src/plugins/platforms/ios/qiosintegration.mm index 85b5c477cc..d33c8cf47c 100644 --- a/src/plugins/platforms/ios/qiosintegration.mm +++ b/src/plugins/platforms/ios/qiosintegration.mm @@ -43,6 +43,7 @@ #include "qiosinputcontext.h" #include "qiostheme.h" #include "qiosservices.h" +#include "qiosoptionalplugininterface.h" #include @@ -68,6 +69,7 @@ QIOSIntegration::QIOSIntegration() , m_inputContext(0) , m_platformServices(new QIOSServices) , m_accessibility(0) + , m_optionalPlugins(new QFactoryLoader(QIosOptionalPluginInterface_iid, QLatin1String("/platforms/darwin"))) , m_debugWindowManagement(false) { if (![UIApplication sharedApplication]) { @@ -112,6 +114,9 @@ QIOSIntegration::QIOSIntegration() m_touchDevice->setCapabilities(touchCapabilities); QWindowSystemInterface::registerTouchDevice(m_touchDevice); QMacInternalPasteboardMime::initializeMimeTypes(); + + for (int i = 0; i < m_optionalPlugins->metaData().size(); ++i) + qobject_cast(m_optionalPlugins->instance(i))->initPlugin(); } QIOSIntegration::~QIOSIntegration() @@ -134,6 +139,9 @@ QIOSIntegration::~QIOSIntegration() delete m_accessibility; m_accessibility = 0; + + delete m_optionalPlugins; + m_optionalPlugins = 0; } bool QIOSIntegration::hasCapability(Capability cap) const diff --git a/src/plugins/platforms/ios/qiosoptionalplugininterface.h b/src/plugins/platforms/ios/qiosoptionalplugininterface.h new file mode 100644 index 0000000000..bcb8978e02 --- /dev/null +++ b/src/plugins/platforms/ios/qiosoptionalplugininterface.h @@ -0,0 +1,59 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** 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 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QIOPLUGININTERFACE_H +#define QIOPLUGININTERFACE_H + +#include + +#include "qiosfiledialog.h" + +QT_BEGIN_NAMESPACE + +Q_FORWARD_DECLARE_OBJC_CLASS(UIViewController); + +#define QIosOptionalPluginInterface_iid "org.qt-project.Qt.QPA.ios.optional" + +class QIosOptionalPluginInterface +{ +public: + virtual ~QIosOptionalPluginInterface() {} + virtual void initPlugin() const {}; + virtual UIViewController* createImagePickerController(QIOSFileDialog *) const { return Q_NULLPTR; }; +}; + +Q_DECLARE_INTERFACE(QIosOptionalPluginInterface, QIosOptionalPluginInterface_iid) + +QT_END_NAMESPACE + +#endif // QIOPLUGININTERFACE_H -- cgit v1.2.3 From 78ee77f49122ac525590715a0a034965e3e59adf Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Tue, 4 Oct 2016 15:04:04 +0200 Subject: iOS: link photo lib plugin based on Info.plist contents MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the application's Info.plist contains the key 'NSPhotoLibraryUsageDescription', we know that we can safely link in qiosnsphotolibrarysupport without violating AppStore requirements. This is a simple feature that doesn't introduce additional qmake API for doing app deployment with optional iOS QPA plugins. [ChangeLog][iOS] Starting from iOS 10, Apple requires all apps that need access to photos to have the key 'NSPhotoLibraryUsageDescription' in the Info.plist. Therefore, to get the same support in Qt (when, e.g., using a file dialog), the Info.plist assigned to QMAKE_INFO_PLIST will need this key as well. Change-Id: I7a93afe24b589cad96d5a1d9e2a155ad1671178a Reviewed-by: Tor Arne Vestbø Reviewed-by: Jake Petroules --- src/widgets/dialogs/qfiledialog.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src') diff --git a/src/widgets/dialogs/qfiledialog.cpp b/src/widgets/dialogs/qfiledialog.cpp index 61f5f7b0d2..f8e4299397 100644 --- a/src/widgets/dialogs/qfiledialog.cpp +++ b/src/widgets/dialogs/qfiledialog.cpp @@ -896,6 +896,9 @@ void QFileDialogPrivate::_q_goToUrl(const QUrl &url) {QStandardPaths::standardLocations(QStandardPaths::PicturesLocation).last()}, a native image picker dialog will be used for accessing the user's photo album. The filename returned can be loaded using QFile and related APIs. + For this to be enabled, the Info.plist assigned to QMAKE_INFO_PLIST in the + project file must contain the key \c NSPhotoLibraryUsageDescription. See + Info.plist documentation from Apple for more information regarding this key. This feature was added in Qt 5.5. */ void QFileDialog::setDirectory(const QString &directory) -- cgit v1.2.3 From aa2e2a8d5e4712d93879098675c0a46df0fd7a41 Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Tue, 25 Oct 2016 11:56:33 +0200 Subject: Android: Fix synthesized oblique for non-latin scripts In 5e3e34731b7880ac775e8f1fa156ce016e6820f1, a default implementation of QPlatformFontDatabase::fallbacksForFamily() was added, but this implementation included only the fonts with a matching style in the returned list. The result of this was that if a font face for a specific language did not have e.g. an italic font, then we would show missing glyph boxes instead. On Android, it would be impossible to show any italic text in Chinese, Japanese, Hebrew, or Arabic. [ChangeLog][QtGui][Text] Fixed synthesized oblique for non-latin text on platforms using the basic font database, such as Android. Task-number: QTBUG-51223 Change-Id: I494d8ad87292b65d4380a2e600c1c0dc7fc8f937 Reviewed-by: Lars Knoll Reviewed-by: Konstantin Ritt --- src/gui/text/qfontdatabase.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp index 04081a5ca7..f1b2e84a1e 100644 --- a/src/gui/text/qfontdatabase.cpp +++ b/src/gui/text/qfontdatabase.cpp @@ -805,7 +805,8 @@ QStringList QPlatformFontDatabase::fallbacksForFamily(const QString &family, QFo Q_UNUSED(family); Q_UNUSED(styleHint); - QStringList retList; + QStringList preferredFallbacks; + QStringList otherFallbacks; size_t writingSystem = std::find(scriptForWritingSystem, scriptForWritingSystem + QFontDatabase::WritingSystemsCount, @@ -826,18 +827,18 @@ QStringList QPlatformFontDatabase::fallbacksForFamily(const QString &family, QFo QtFontFoundry *foundry = f->foundries[j]; for (int k = 0; k < foundry->count; ++k) { - if (style == foundry->styles[k]->key.style) { - if (foundry->name.isEmpty()) - retList.append(f->name); - else - retList.append(f->name + QLatin1String(" [") + foundry->name + QLatin1Char(']')); - break; - } + QString name = foundry->name.isEmpty() + ? f->name + : f->name + QLatin1String(" [") + foundry->name + QLatin1Char(']'); + if (style == foundry->styles[k]->key.style) + preferredFallbacks.append(name); + else + otherFallbacks.append(name); } } } - return retList; + return preferredFallbacks + otherFallbacks; } static void initializeDb(); -- cgit v1.2.3 From b9af823ef7a4131bc61b07620e7825d757df69db Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Tue, 18 Oct 2016 13:09:37 +0200 Subject: qiosfileengineassetslibrary: replace Q_DECL_OVERRIDE with override Change-Id: Iba67e1a1fa86dff3c82543597351b597be69ed1f Reviewed-by: Jake Petroules --- .../qiosfileengineassetslibrary.h | 24 +++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.h b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.h index 0e29a1003e..89696751c6 100644 --- a/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.h +++ b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.h @@ -45,20 +45,20 @@ public: QIOSFileEngineAssetsLibrary(const QString &fileName); ~QIOSFileEngineAssetsLibrary(); - bool open(QIODevice::OpenMode openMode) Q_DECL_OVERRIDE; - bool close() Q_DECL_OVERRIDE; - FileFlags fileFlags(FileFlags type) const Q_DECL_OVERRIDE; - qint64 size() const Q_DECL_OVERRIDE; - qint64 read(char *data, qint64 maxlen) Q_DECL_OVERRIDE; - qint64 pos() const Q_DECL_OVERRIDE; - bool seek(qint64 pos) Q_DECL_OVERRIDE; - QString fileName(FileName file) const Q_DECL_OVERRIDE; - void setFileName(const QString &file) Q_DECL_OVERRIDE; - QStringList entryList(QDir::Filters filters, const QStringList &filterNames) const Q_DECL_OVERRIDE; + bool open(QIODevice::OpenMode openMode) override; + bool close() override; + FileFlags fileFlags(FileFlags type) const override; + qint64 size() const override; + qint64 read(char *data, qint64 maxlen) override; + qint64 pos() const override; + bool seek(qint64 pos) override; + QString fileName(FileName file) const override; + void setFileName(const QString &file) override; + QStringList entryList(QDir::Filters filters, const QStringList &filterNames) const override; #ifndef QT_NO_FILESYSTEMITERATOR - Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) Q_DECL_OVERRIDE; - Iterator *endEntryList() Q_DECL_OVERRIDE; + Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) override; + Iterator *endEntryList() override; #endif void setError(QFile::FileError error, const QString &str) { QAbstractFileEngine::setError(error, str); } -- cgit v1.2.3 From e8b55a6d2a6e44337b75dd0d116b1b020a437631 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Wed, 19 Oct 2016 20:22:10 +0200 Subject: Document qGuiApp and tweap qApp Change-Id: I2cd865da0e081251a2702c11cb83dde35444693a Reviewed-by: Edward Welbourne --- src/gui/kernel/qguiapplication.cpp | 10 ++++++++++ src/widgets/kernel/qapplication.cpp | 9 +++------ 2 files changed, 13 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 9cbcd714ab..950385f0ce 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -344,6 +344,16 @@ void QWindowGeometrySpecification::applyTo(QWindow *window) const static QWindowGeometrySpecification windowGeometrySpecification = Q_WINDOW_GEOMETRY_SPECIFICATION_INITIALIZER; +/*! + \macro qGuiApp + \relates QGuiApplication + + A global pointer referring to the unique application object. + Only valid for use when that object is a QGuiApplication. + + \sa QCoreApplication::instance(), qApp +*/ + /*! \class QGuiApplication \brief The QGuiApplication class manages the GUI application's control diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp index b64d6e2159..93ee820c98 100644 --- a/src/widgets/kernel/qapplication.cpp +++ b/src/widgets/kernel/qapplication.cpp @@ -4229,13 +4229,10 @@ void QApplication::beep() \relates QApplication A global pointer referring to the unique application object. It is - equivalent to the pointer returned by the QCoreApplication::instance() - function except that, in GUI applications, it is a pointer to a - QApplication instance. + equivalent to QCoreApplication::instance(), but cast as a QApplication pointer, + so only valid when the unique application object is a QApplication. - Only one application object can be created. - - \sa QCoreApplication::instance() + \sa QCoreApplication::instance(), qGuiApp */ /*! -- cgit v1.2.3 From 4e196159077a820e99bc8bd306d31d0ccaa17c57 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Wed, 26 Oct 2016 11:19:19 +0200 Subject: qmacmime: convert UTF-16 using QTextCodec MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The current implementation of QMacPasteboardMimeUnicodeText didn't contain any logic to handle unicode text with a byte order mark (BOM). According to the docs (*), 'public.utf16-plain-text' can have an optional BOM. Because of that, Qt would fail encoding UTF-16 text from the pasteboard if it had a BOM. Additionally, perhaps because of a bug in iOS 10, UTF-16 text placed on the pasteboard by Qt ends up being encoded wrong by native apps, unless the text has a BOM. Rather than hard-coding UTF-16 encoding/decoding in qmacmime, we now leave it to QTextCodec. QTextCodec will add a BOM by default, and can handle decoding of UTF-16 both with, and without, a BOM. *: https://developer.apple.com/library/content/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html Task-number: QTBUG-56229 Change-Id: I3a08deb0262350c67e5622cf23eb3c3a4907ec39 Reviewed-by: Tor Arne Vestbø --- src/platformsupport/clipboard/qmacmime.mm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/platformsupport/clipboard/qmacmime.mm b/src/platformsupport/clipboard/qmacmime.mm index 2e3257cfcf..cdb5d6b08e 100644 --- a/src/platformsupport/clipboard/qmacmime.mm +++ b/src/platformsupport/clipboard/qmacmime.mm @@ -405,8 +405,7 @@ QVariant QMacPasteboardMimeUnicodeText::convertToMime(const QString &mimetype, Q if (flavor == QLatin1String("public.utf8-plain-text")) { ret = QString::fromUtf8(firstData); } else if (flavor == QLatin1String("public.utf16-plain-text")) { - ret = QString(reinterpret_cast(firstData.constData()), - firstData.size() / sizeof(QChar)); + ret = QTextCodec::codecForName("UTF-16")->toUnicode(firstData); } else { qWarning("QMime::convertToMime: unhandled mimetype: %s", qPrintable(mimetype)); } @@ -420,7 +419,7 @@ QList QMacPasteboardMimeUnicodeText::convertFromMime(const QString & if (flavor == QLatin1String("public.utf8-plain-text")) ret.append(string.toUtf8()); else if (flavor == QLatin1String("public.utf16-plain-text")) - ret.append(QByteArray((char*)string.utf16(), string.length()*2)); + ret.append(QTextCodec::codecForName("UTF-16")->fromUnicode(string)); return ret; } -- cgit v1.2.3 From 04f0a69e96fca03c18e0c7eaaab7babc49e35198 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Tue, 25 Oct 2016 15:22:01 +0200 Subject: Replace PKGCONFIG+=foo usages with QMAKE_USE replace explicit pkg-config uses with the results of configure tests, for consistency. Change-Id: I3587db6085798ea7a49f8871fc6838eb687a6391 Reviewed-by: Oswald Buddenhagen --- src/corelib/configure.json | 1 - src/corelib/global/global.pri | 6 +----- src/gui/configure.json | 3 --- src/platformsupport/input/evdevtouch/evdevtouch.pri | 3 +-- src/plugins/bearer/connman/connman.pro | 1 - .../platforms/eglfs/deviceintegration/eglfs_viv_wl/eglfs_viv_wl.pro | 3 +-- src/plugins/platforms/mirclient/mirclient.pro | 3 +-- 7 files changed, 4 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/corelib/configure.json b/src/corelib/configure.json index fbbbef4f21..e7eb5fe482 100644 --- a/src/corelib/configure.json +++ b/src/corelib/configure.json @@ -61,7 +61,6 @@ "journald": { "label": "journald", "test": "unix/journald", - "export": "", "sources": [ { "type": "pkgConfig", "args": "libsystemd" }, { "type": "pkgConfig", "args": "libsystemd-journal" } diff --git a/src/corelib/global/global.pri b/src/corelib/global/global.pri index 6a8948822c..f74662b464 100644 --- a/src/corelib/global/global.pri +++ b/src/corelib/global/global.pri @@ -53,11 +53,7 @@ slog2 { } journald { - CONFIG += link_pkgconfig - packagesExist(libsystemd): \ - PKGCONFIG_PRIVATE += libsystemd - else: \ - PKGCONFIG_PRIVATE += libsystemd-journal + QMAKE_USE_PRIVATE += journald DEFINES += QT_USE_JOURNALD } diff --git a/src/gui/configure.json b/src/gui/configure.json index b361679101..f4e2faf08b 100644 --- a/src/gui/configure.json +++ b/src/gui/configure.json @@ -165,7 +165,6 @@ }, "mirclient": { "label": "Mir client libraries", - "export": "", "test": "qpa/mirclient", "sources": [ { "type": "pkgConfig", "args": "egl mirclient ubuntu-platform-api" } @@ -173,7 +172,6 @@ }, "mtdev": { "label": "mtdev", - "export": "", "test": "unix/mtdev", "sources": [ { "type": "pkgConfig", "args": "mtdev" } @@ -204,7 +202,6 @@ }, "wayland_server": { "label": "Wayland Server", - "export": "", "test": "qpa/wayland-server", "sources": [ { "type": "pkgConfig", "args": "wayland-server" } diff --git a/src/platformsupport/input/evdevtouch/evdevtouch.pri b/src/platformsupport/input/evdevtouch/evdevtouch.pri index 58fafcd8f9..0ad236e882 100644 --- a/src/platformsupport/input/evdevtouch/evdevtouch.pri +++ b/src/platformsupport/input/evdevtouch/evdevtouch.pri @@ -12,6 +12,5 @@ qtConfig(libudev): \ QMAKE_USE_PRIVATE += libudev qtConfig(mtdev) { - CONFIG += link_pkgconfig - PKGCONFIG_PRIVATE += mtdev + QMAKE_USE_PRIVATE += mtdev } diff --git a/src/plugins/bearer/connman/connman.pro b/src/plugins/bearer/connman/connman.pro index 9f3fff304b..065ed11dad 100644 --- a/src/plugins/bearer/connman/connman.pro +++ b/src/plugins/bearer/connman/connman.pro @@ -1,7 +1,6 @@ TARGET = qconnmanbearer QT = core network-private dbus -CONFIG += link_pkgconfig HEADERS += qconnmanservice_linux_p.h \ ../linux_common/qofonoservice_linux_p.h \ diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_viv_wl/eglfs_viv_wl.pro b/src/plugins/platforms/eglfs/deviceintegration/eglfs_viv_wl/eglfs_viv_wl.pro index f934fd85ed..065a103376 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_viv_wl/eglfs_viv_wl.pro +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_viv_wl/eglfs_viv_wl.pro @@ -14,8 +14,7 @@ HEADERS += $$PWD/qeglfsvivwlintegration.h OTHER_FILES += $$PWD/eglfs_viv_wl.json -CONFIG += link_pkgconfig -PKGCONFIG_PRIVATE += wayland-server +QMAKE_USE_PRIVATE += wayland_server PLUGIN_TYPE = egldeviceintegrations PLUGIN_CLASS_NAME = QEglFSVivWaylandIntegrationPlugin diff --git a/src/plugins/platforms/mirclient/mirclient.pro b/src/plugins/platforms/mirclient/mirclient.pro index 623f7bf97b..0ba63601a9 100644 --- a/src/plugins/platforms/mirclient/mirclient.pro +++ b/src/plugins/platforms/mirclient/mirclient.pro @@ -10,8 +10,7 @@ DEFINES += MESA_EGL_NO_X11_HEADERS QMAKE_CXXFLAGS += -fvisibility=hidden -fvisibility-inlines-hidden -std=c++11 -Werror -Wall QMAKE_LFLAGS += -std=c++11 -Wl,-no-undefined -CONFIG += link_pkgconfig -PKGCONFIG += egl mirclient ubuntu-platform-api +QMAKE_USE_PRIVATE += mirclient SOURCES = \ qmirclientbackingstore.cpp \ -- cgit v1.2.3 From 99331f661d6ef88f9bb964133ee4eaf8b6d74e80 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Mon, 24 Oct 2016 10:17:35 +0200 Subject: Fix QStandardPaths::FontsLocation to be compliant with the latest XDG spec According to the latest XDG spec, FontsLocation should point to XDG_DATA_DIR/fonts, not ~/.fonts. Task-number: QTBUG-55507 Change-Id: Ia62ffe172abbb93d5ce7fd58bdf038ff13954f1b Reviewed-by: David Faure --- src/corelib/io/qstandardpaths_unix.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/corelib/io/qstandardpaths_unix.cpp b/src/corelib/io/qstandardpaths_unix.cpp index 0561e5833f..7974dc8cca 100644 --- a/src/corelib/io/qstandardpaths_unix.cpp +++ b/src/corelib/io/qstandardpaths_unix.cpp @@ -245,7 +245,7 @@ QString QStandardPaths::writableLocation(StandardLocation type) break; case FontsLocation: - path = QDir::homePath() + QLatin1String("/.fonts"); + path = writableLocation(GenericDataLocation) + QLatin1String("/fonts"); break; case MusicLocation: @@ -340,6 +340,9 @@ QStringList QStandardPaths::standardLocations(StandardLocation type) for (int i = 0; i < dirs.count(); ++i) appendOrganizationAndApp(dirs[i]); break; + case FontsLocation: + dirs += QDir::homePath() + QLatin1String("/.fonts"); + break; default: break; } -- cgit v1.2.3 From 8da1828d7a1fb025b051fb6a1cd1607169085c15 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 20 Oct 2016 15:37:34 +0200 Subject: QtWidgets: Remove function documentation from Qt 4 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes qdoc warnings: qtbase/src/widgets/kernel/qwidget.cpp:13053: warning: Cannot find 'macCGHandle(...)' in '\fn' Qt::HANDLE QWidget::macCGHandle() const qtbase/src/widgets/kernel/qwidget.cpp:13062: warning: Cannot find 'macQDHandle(...)' in '\fn' Qt::HANDLE QWidget::macQDHandle() const qtbase/src/widgets/kernel/qwidget.cpp:13071: warning: Cannot find 'x11Info(...)' in '\fn' const QX11Info &QWidget::x11Info() const qtbase/src/widgets/kernel/qwidget.cpp:13080: warning: Cannot find 'x11PictureHandle(...)' in '\fn' Qt::HANDLE QWidget::x11PictureHandle() const They were accidentally re-added in e6ddae07e1e571a7a6e0c531b961dbddcd217643. Change-Id: I1531a795ad182bc0b54d70d52e83422e782cc948 Reviewed-by: Tor Arne Vestbø --- src/widgets/kernel/qwidget.cpp | 39 --------------------------------------- 1 file changed, 39 deletions(-) (limited to 'src') diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index cf52a21716..c7026781b5 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -13050,45 +13050,6 @@ QDebug operator<<(QDebug debug, const QWidget *widget) } #endif // !QT_NO_DEBUG_STREAM -/*! \fn Qt::HANDLE QWidget::macCGHandle() const - \internal - - Returns the CoreGraphics handle of the widget. Use of this function is not portable. - This function will return 0 if no painter context can be established, or if the handle - could not be created. - - \warning This function is only available on \macos. -*/ -/*! \fn Qt::HANDLE QWidget::macQDHandle() const - \internal - - Returns the QuickDraw handle of the widget. Use of this function is not portable. - This function will return 0 if QuickDraw is not supported, or if the handle could - not be created. - - \warning This function is only available on \macos. -*/ -/*! \fn const QX11Info &QWidget::x11Info() const - \internal - - Returns information about the configuration of the X display used to display - the widget. - - \warning This function is only available on X11. -*/ - -/*! \fn Qt::HANDLE QWidget::x11PictureHandle() const - \internal - - Returns the X11 picture handle of the widget for XRender - support. Use of this function is not portable. This function will - return 0 if XRender support is not compiled into Qt, if the - XRender extension is not supported on the X11 display, or if the - handle could not be created. - - \warning This function is only available on X11. - -*/ QT_END_NAMESPACE #include "moc_qwidget.cpp" -- cgit v1.2.3 From 7f0d43fd332519e2689ffbff8198590d768864bc Mon Sep 17 00:00:00 2001 From: Dongmei Wang Date: Fri, 30 Sep 2016 12:01:02 -0700 Subject: Don't overlap the menu scrollers with QAction items The QAction items overlap with the menu scrollers. The patch is to set correct clip regions for QAction items in order not to overlap with the scroll arrows. Change-Id: Ie724bd2be522daf5935fb489523b5d5f32bb7f71 Reviewed-by: Gabriel de Dietrich --- src/widgets/widgets/qmenu.cpp | 89 ++++++++++++++++++++++++++++++------------- 1 file changed, 62 insertions(+), 27 deletions(-) (limited to 'src') diff --git a/src/widgets/widgets/qmenu.cpp b/src/widgets/widgets/qmenu.cpp index a983dc6fde..b0c9512344 100644 --- a/src/widgets/widgets/qmenu.cpp +++ b/src/widgets/widgets/qmenu.cpp @@ -2539,51 +2539,85 @@ void QMenu::paintEvent(QPaintEvent *e) menuOpt.tabWidth = 0; style()->drawPrimitive(QStyle::PE_PanelMenu, &menuOpt, &p, this); + //calculate the scroll up / down rect + const int fw = style()->pixelMetric(QStyle::PM_MenuPanelWidth, 0, this); + QRect scrollUpRect, scrollDownRect; + if (d->scroll) { + if (d->scroll->scrollFlags & QMenuPrivate::QMenuScroller::ScrollUp) + scrollUpRect.setRect(fw, fw, width() - (fw * 2), d->scrollerHeight()); + + if (d->scroll->scrollFlags & QMenuPrivate::QMenuScroller::ScrollDown) + scrollDownRect.setRect(fw, height() - d->scrollerHeight() - fw, width() - (fw * 2), + d->scrollerHeight()); + } + + //calculate the tear off rect + QRect tearOffRect; + if (d->tearoff) { + tearOffRect.setRect(fw, fw, width() - (fw * 2), + style()->pixelMetric(QStyle::PM_MenuTearoffHeight, 0, this)); + if (d->scroll && d->scroll->scrollFlags & QMenuPrivate::QMenuScroller::ScrollUp) + tearOffRect.translate(0, d->scrollerHeight()); + } + //draw the items that need updating.. + QRect scrollUpTearOffRect = scrollUpRect.united(tearOffRect); for (int i = 0; i < d->actions.count(); ++i) { QAction *action = d->actions.at(i); - QRect adjustedActionRect = d->actionRects.at(i); - if (!e->rect().intersects(adjustedActionRect) + QRect actionRect = d->actionRects.at(i); + if (!e->rect().intersects(actionRect) || d->widgetItems.value(action)) continue; //set the clip region to be extra safe (and adjust for the scrollers) + emptyArea -= QRegion(actionRect); + + QRect adjustedActionRect = actionRect; + if (adjustedActionRect.intersects(scrollUpTearOffRect)) { + if (adjustedActionRect.bottom() <= scrollUpTearOffRect.bottom()) + continue; + else + adjustedActionRect.setTop(scrollUpTearOffRect.bottom()+1); + } + + if (adjustedActionRect.intersects(scrollDownRect)) { + if (adjustedActionRect.top() >= scrollDownRect.top()) + continue; + else + adjustedActionRect.setBottom(scrollDownRect.top()-1); + } + QRegion adjustedActionReg(adjustedActionRect); - emptyArea -= adjustedActionReg; p.setClipRegion(adjustedActionReg); QStyleOptionMenuItem opt; initStyleOption(&opt, action); - opt.rect = adjustedActionRect; + opt.rect = actionRect; style()->drawControl(QStyle::CE_MenuItem, &opt, &p, this); } - const int fw = style()->pixelMetric(QStyle::PM_MenuPanelWidth, 0, this); - //draw the scroller regions.. - if (d->scroll) { + if (!scrollUpRect.isEmpty()) { menuOpt.menuItemType = QStyleOptionMenuItem::Scroller; menuOpt.state |= QStyle::State_Enabled; - if (d->scroll->scrollFlags & QMenuPrivate::QMenuScroller::ScrollUp) { - menuOpt.rect.setRect(fw, fw, width() - (fw * 2), d->scrollerHeight()); - emptyArea -= QRegion(menuOpt.rect); - p.setClipRect(menuOpt.rect); - style()->drawControl(QStyle::CE_MenuScroller, &menuOpt, &p, this); - } - if (d->scroll->scrollFlags & QMenuPrivate::QMenuScroller::ScrollDown) { - menuOpt.rect.setRect(fw, height() - d->scrollerHeight() - fw, width() - (fw * 2), - d->scrollerHeight()); - emptyArea -= QRegion(menuOpt.rect); - menuOpt.state |= QStyle::State_DownArrow; - p.setClipRect(menuOpt.rect); - style()->drawControl(QStyle::CE_MenuScroller, &menuOpt, &p, this); - } + menuOpt.rect = scrollUpRect; + emptyArea -= QRegion(menuOpt.rect); + p.setClipRect(menuOpt.rect); + style()->drawControl(QStyle::CE_MenuScroller, &menuOpt, &p, this); + } + + if (!scrollDownRect.isEmpty()) { + menuOpt.menuItemType = QStyleOptionMenuItem::Scroller; + menuOpt.state |= QStyle::State_Enabled; + menuOpt.state |= QStyle::State_DownArrow; + menuOpt.rect = scrollDownRect; + emptyArea -= QRegion(menuOpt.rect); + p.setClipRect(menuOpt.rect); + style()->drawControl(QStyle::CE_MenuScroller, &menuOpt, &p, this); } + //paint the tear off.. - if (d->tearoff) { + if (!tearOffRect.isEmpty()) { menuOpt.menuItemType = QStyleOptionMenuItem::TearOff; - menuOpt.rect.setRect(fw, fw, width() - (fw * 2), - style()->pixelMetric(QStyle::PM_MenuTearoffHeight, 0, this)); - if (d->scroll && d->scroll->scrollFlags & QMenuPrivate::QMenuScroller::ScrollUp) - menuOpt.rect.translate(0, d->scrollerHeight()); + menuOpt.rect = tearOffRect; emptyArea -= QRegion(menuOpt.rect); p.setClipRect(menuOpt.rect); menuOpt.state = QStyle::State_None; @@ -2591,6 +2625,7 @@ void QMenu::paintEvent(QPaintEvent *e) menuOpt.state |= QStyle::State_Selected; style()->drawControl(QStyle::CE_MenuTearoff, &menuOpt, &p, this); } + //draw border if (fw) { QRegion borderReg; @@ -2609,7 +2644,7 @@ void QMenu::paintEvent(QPaintEvent *e) style()->drawPrimitive(QStyle::PE_FrameMenu, &frame, &p, this); } - //finally the rest of the space + //finally the rest of the spaces p.setClipRegion(emptyArea); menuOpt.state = QStyle::State_None; menuOpt.menuItemType = QStyleOptionMenuItem::EmptyArea; -- cgit v1.2.3 From c8c3d39e2116251133fb3ee25b615a1522685861 Mon Sep 17 00:00:00 2001 From: Dongmei Wang Date: Tue, 4 Oct 2016 13:05:15 -0700 Subject: Paint menu scrollers, tear off on top of QWidgetAction items The menu scrollers and the tear off items are painted in the layer of QMenu. In a case that QMenu contains QWidgetAction items, the items are painted under QWidgetAction items. They are visually hidden unless QWidgetAction items' background is transparent. The tear off doesn't work since QWidgetAction item on top of it grabs mouse events. To fix the issue, add two child widgets in QMenu, paint the scroll up and the tear off items in one child widget and the scroll down item in the other one. Both child widgets are painted on top of overlapping sibling menu item widgets. Change-Id: I7eaef21b667b388fbb78b60664f4a4bd91215309 Reviewed-by: Gabriel de Dietrich --- src/widgets/widgets/qmenu.cpp | 139 +++++++++++++++++++++++++++++++++--------- src/widgets/widgets/qmenu_p.h | 21 ++++++- 2 files changed, 130 insertions(+), 30 deletions(-) (limited to 'src') diff --git a/src/widgets/widgets/qmenu.cpp b/src/widgets/widgets/qmenu.cpp index b0c9512344..36a8a96b79 100644 --- a/src/widgets/widgets/qmenu.cpp +++ b/src/widgets/widgets/qmenu.cpp @@ -816,6 +816,93 @@ void QMenuPrivate::updateLayoutDirection() } } +void QMenuPrivate::drawScroller(QPainter *painter, QMenuPrivate::ScrollerTearOffItem::Type type, const QRect &rect) +{ + if (!painter || rect.isEmpty()) + return; + + if (!scroll || !(scroll->scrollFlags & (QMenuPrivate::QMenuScroller::ScrollUp + | QMenuPrivate::QMenuScroller::ScrollDown))) + return; + + Q_Q(QMenu); + QStyleOptionMenuItem menuOpt; + menuOpt.initFrom(q); + menuOpt.state = QStyle::State_None; + menuOpt.checkType = QStyleOptionMenuItem::NotCheckable; + menuOpt.maxIconWidth = 0; + menuOpt.tabWidth = 0; + menuOpt.rect = rect; + menuOpt.menuItemType = QStyleOptionMenuItem::Scroller; + menuOpt.state |= QStyle::State_Enabled; + if (type == QMenuPrivate::ScrollerTearOffItem::ScrollDown) + menuOpt.state |= QStyle::State_DownArrow; + + painter->setClipRect(menuOpt.rect); + q->style()->drawControl(QStyle::CE_MenuScroller, &menuOpt, painter, q); +} + +void QMenuPrivate::drawTearOff(QPainter *painter, const QRect &rect) +{ + if (!painter || rect.isEmpty()) + return; + + if (!tearoff) + return; + + Q_Q(QMenu); + QStyleOptionMenuItem menuOpt; + menuOpt.initFrom(q); + menuOpt.state = QStyle::State_None; + menuOpt.checkType = QStyleOptionMenuItem::NotCheckable; + menuOpt.maxIconWidth = 0; + menuOpt.tabWidth = 0; + menuOpt.rect = rect; + menuOpt.menuItemType = QStyleOptionMenuItem::TearOff; + if (tearoffHighlighted) + menuOpt.state |= QStyle::State_Selected; + + painter->setClipRect(menuOpt.rect); + q->style()->drawControl(QStyle::CE_MenuTearoff, &menuOpt, painter, q); +} + +QMenuPrivate::ScrollerTearOffItem::ScrollerTearOffItem(QMenuPrivate::ScrollerTearOffItem::Type type, QMenuPrivate *mPrivate, QWidget *parent, Qt::WindowFlags f) + : QWidget(parent, f), menuPrivate(mPrivate), scrollType(type) +{ + if (parent) + setMouseTracking(parent->style()->styleHint(QStyle::SH_Menu_MouseTracking, 0, parent)); +} + +void QMenuPrivate::ScrollerTearOffItem::paintEvent(QPaintEvent *e) +{ + if (!e->rect().intersects(rect())) + return; + + QPainter p(this); + QWidget *parent = parentWidget(); + + //paint scroll up / down arrows + menuPrivate->drawScroller(&p, scrollType, QRect(0, 0, width(), menuPrivate->scrollerHeight())); + //paint the tear off + if (scrollType == QMenuPrivate::ScrollerTearOffItem::ScrollUp) { + QRect rect(0, 0, width(), parent->style()->pixelMetric(QStyle::PM_MenuTearoffHeight, 0, parent)); + if (menuPrivate->scroll && menuPrivate->scroll->scrollFlags & QMenuPrivate::QMenuScroller::ScrollUp) + rect.translate(0, menuPrivate->scrollerHeight()); + menuPrivate->drawTearOff(&p, rect); + } +} + +void QMenuPrivate::ScrollerTearOffItem::updateScrollerRects(const QRect &rect) +{ + if (rect.isEmpty()) + setVisible(false); + else { + setGeometry(rect); + raise(); + setVisible(true); + } +} + /*! Returns the action associated with this menu. @@ -2595,35 +2682,20 @@ void QMenu::paintEvent(QPaintEvent *e) style()->drawControl(QStyle::CE_MenuItem, &opt, &p, this); } - if (!scrollUpRect.isEmpty()) { - menuOpt.menuItemType = QStyleOptionMenuItem::Scroller; - menuOpt.state |= QStyle::State_Enabled; - menuOpt.rect = scrollUpRect; - emptyArea -= QRegion(menuOpt.rect); - p.setClipRect(menuOpt.rect); - style()->drawControl(QStyle::CE_MenuScroller, &menuOpt, &p, this); - } - - if (!scrollDownRect.isEmpty()) { - menuOpt.menuItemType = QStyleOptionMenuItem::Scroller; - menuOpt.state |= QStyle::State_Enabled; - menuOpt.state |= QStyle::State_DownArrow; - menuOpt.rect = scrollDownRect; - emptyArea -= QRegion(menuOpt.rect); - p.setClipRect(menuOpt.rect); - style()->drawControl(QStyle::CE_MenuScroller, &menuOpt, &p, this); - } + emptyArea -= QRegion(scrollUpTearOffRect); + emptyArea -= QRegion(scrollDownRect); - //paint the tear off.. - if (!tearOffRect.isEmpty()) { - menuOpt.menuItemType = QStyleOptionMenuItem::TearOff; - menuOpt.rect = tearOffRect; - emptyArea -= QRegion(menuOpt.rect); - p.setClipRect(menuOpt.rect); - menuOpt.state = QStyle::State_None; - if (d->tearoffHighlighted) - menuOpt.state |= QStyle::State_Selected; - style()->drawControl(QStyle::CE_MenuTearoff, &menuOpt, &p, this); + if (d->scrollUpTearOffItem || d->scrollDownItem) { + if (d->scrollUpTearOffItem) + d->scrollUpTearOffItem->updateScrollerRects(scrollUpTearOffRect); + if (d->scrollDownItem) + d->scrollDownItem->updateScrollerRects(scrollDownRect); + } else { + //paint scroll up /down + d->drawScroller(&p, QMenuPrivate::ScrollerTearOffItem::ScrollUp, scrollUpRect); + d->drawScroller(&p, QMenuPrivate::ScrollerTearOffItem::ScrollDown, scrollDownRect); + //paint the tear off.. + d->drawTearOff(&p, tearOffRect); } //draw border @@ -3356,8 +3428,17 @@ void QMenu::actionEvent(QActionEvent *e) } if (QWidgetAction *wa = qobject_cast(e->action())) { QWidget *widget = wa->requestWidget(this); - if (widget) + if (widget) { d->widgetItems.insert(wa, widget); + if (d->scroll) { + if (!d->scrollUpTearOffItem) + d->scrollUpTearOffItem = + new QMenuPrivate::ScrollerTearOffItem(QMenuPrivate::ScrollerTearOffItem::ScrollUp, d, this); + if (!d->scrollDownItem) + d->scrollDownItem = + new QMenuPrivate::ScrollerTearOffItem(QMenuPrivate::ScrollerTearOffItem::ScrollDown, d, this); + } + } } } else if (e->type() == QEvent::ActionRemoved) { e->action()->disconnect(this); diff --git a/src/widgets/widgets/qmenu_p.h b/src/widgets/widgets/qmenu_p.h index 3166e6f6cd..64291e842f 100644 --- a/src/widgets/widgets/qmenu_p.h +++ b/src/widgets/widgets/qmenu_p.h @@ -276,7 +276,8 @@ public: cancelAction(0), #endif scroll(0), eventLoop(0), tearoff(0), tornoff(0), tearoffHighlighted(0), - hasCheckableItems(0), doChildEffects(false), platformMenu(0) + hasCheckableItems(0), doChildEffects(false), platformMenu(0), + scrollUpTearOffItem(nullptr), scrollDownItem(nullptr) { } ~QMenuPrivate() @@ -445,6 +446,24 @@ public: QPointer actionAboutToTrigger; QPointer noReplayFor; + + class ScrollerTearOffItem : public QWidget { + public: + enum Type { ScrollUp, ScrollDown }; + ScrollerTearOffItem(Type type, QMenuPrivate *mPrivate, + QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags()); + void paintEvent(QPaintEvent *e) Q_DECL_OVERRIDE; + void updateScrollerRects(const QRect &rect); + + private: + QMenuPrivate *menuPrivate; + Type scrollType; + }; + ScrollerTearOffItem *scrollUpTearOffItem; + ScrollerTearOffItem *scrollDownItem; + + void drawScroller(QPainter *painter, ScrollerTearOffItem::Type type, const QRect &rect); + void drawTearOff(QPainter *painter, const QRect &rect); }; #endif // QT_NO_MENU -- cgit v1.2.3 From 145587a521c9c757d20220c9957b9003d66ccf7b Mon Sep 17 00:00:00 2001 From: James McDonnell Date: Wed, 26 Oct 2016 11:03:11 -0400 Subject: Recontribute QUrl::fromUserInput Recontribute QUrl::fromUserInput under the corporate license agreement; i.e. remove the separate BSD license from the code. Change-Id: I1e0b4aab921fb20d2fd558fe732cea596ecbc9ca Reviewed-by: Lars Knoll --- src/corelib/io/qurl.cpp | 30 ------------------------------ 1 file changed, 30 deletions(-) (limited to 'src') diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp index c165aef5a2..cdc6b964e7 100644 --- a/src/corelib/io/qurl.cpp +++ b/src/corelib/io/qurl.cpp @@ -4128,35 +4128,6 @@ static bool isIp6(const QString &text) return !text.isEmpty() && QIPAddressUtils::parseIp6(address, text.begin(), text.end()) == 0; } -// The following code has the following copyright: -/* - Copyright (C) Research In Motion Limited 2009. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Research In Motion Limited nor the - contributors may be used to endorse or promote products derived - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY Research In Motion Limited ''AS IS'' AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL Research In Motion Limited BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - - /*! Returns a valid URL from a user supplied \a userInput string if one can be deducted. In the case that is not possible, an invalid QUrl() is returned. @@ -4275,6 +4246,5 @@ QUrl QUrl::fromUserInput(const QString &userInput) return QUrl(); } -// end of BSD code QT_END_NAMESPACE -- cgit v1.2.3 From 456f0e0f1a4fb422b029c5abd30e2e622435f76a Mon Sep 17 00:00:00 2001 From: Vyacheslav Koscheev Date: Thu, 27 Oct 2016 11:06:09 +0700 Subject: Compilation fix If qreal is float, then android-clang compilation was breaking here Change-Id: Ieccc357ecbbea5cbb22a5808dd0791795240a985 Reviewed-by: Marc Mutz --- src/gui/text/qfontengine_ft.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp index 1711865e59..199e207578 100644 --- a/src/gui/text/qfontengine_ft.cpp +++ b/src/gui/text/qfontengine_ft.cpp @@ -1790,7 +1790,7 @@ void QFontEngineFT::unlockAlphaMapForGlyph() static inline bool is2dRotation(const QTransform &t) { return qFuzzyCompare(t.m11(), t.m22()) && qFuzzyCompare(t.m12(), -t.m21()) - && qFuzzyCompare(t.m11()*t.m22() - t.m12()*t.m21(), 1.0); + && qFuzzyCompare(t.m11()*t.m22() - t.m12()*t.m21(), qreal(1.0)); } QFontEngineFT::Glyph *QFontEngineFT::loadGlyphFor(glyph_t g, -- cgit v1.2.3 From 5a92b6e8beeb9aa6d3d904c7901f13a6b22502f6 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Tue, 25 Oct 2016 10:23:20 +0200 Subject: Document use of 3rd party code in qgrayraster qgrayraster_p.h, qgrayraster.cpp contain code from Freetype which unfortunately cannot be excluded by e.g. '-no-freetype'. Document this code therefore separately. Change-Id: I20d79e984013b2aec874774ddc765b1dc57ebe0e Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/gui/painting/qt_attribution.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/gui/painting/qt_attribution.json (limited to 'src') diff --git a/src/gui/painting/qt_attribution.json b/src/gui/painting/qt_attribution.json new file mode 100644 index 0000000000..f635cf98ac --- /dev/null +++ b/src/gui/painting/qt_attribution.json @@ -0,0 +1,14 @@ +{ + "Id": "grayraster", + "Name": "Anti-aliasing rasterizer from FreeType 2", + "QDocModule": "qtgui", + "QtUsage": "Used in Qt GUI.", + "Path": "qgrayraster.c", + + "Description": "FreeType is a freely available software library to render fonts.", + "Homepage": "http://www.freetype.org", + "License": "Freetype Project License or GNU General Public License v2.0 only", + "LicenseId": "FTL or GPL-2.0", + "LicenseFile": "../../3rdparty/freetype/docs/LICENSE.TXT", + "Copyright": "Copyright 2006-2015 by David Turner, Robert Wilhelm, and Werner Lemberg." +} -- cgit v1.2.3 From d19f01acbf9547762150a479793b84898f1a115e Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Tue, 18 Oct 2016 13:02:34 +0200 Subject: nsphotolibrarysupport: add missing namespace macros Change-Id: Ib2014dc64dfcc1ea8de63a1668907ace6d26c530 Reviewed-by: Jake Petroules --- .../ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.h | 5 +++++ .../optional/nsphotolibrarysupport/qiosfileengineassetslibrary.mm | 4 ++++ .../ios/optional/nsphotolibrarysupport/qiosfileenginefactory.h | 4 ++++ 3 files changed, 13 insertions(+) (limited to 'src') diff --git a/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.h b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.h index 89696751c6..d4dc77b1a3 100644 --- a/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.h +++ b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.h @@ -37,6 +37,9 @@ #include Q_FORWARD_DECLARE_OBJC_CLASS(ALAsset); + +QT_BEGIN_NAMESPACE + class QIOSAssetData; class QIOSFileEngineAssetsLibrary : public QAbstractFileEngine @@ -72,5 +75,7 @@ private: ALAsset *loadAsset() const; }; +QT_END_NAMESPACE + #endif // QIOSFILEENGINEASSETSLIBRARY_H diff --git a/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.mm b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.mm index 2e88c37c01..110348d32b 100644 --- a/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.mm +++ b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileengineassetslibrary.mm @@ -42,6 +42,8 @@ #include #include +QT_BEGIN_NAMESPACE + static QThreadStorage g_iteratorCurrentUrl; static QThreadStorage > g_assetDataCache; @@ -466,4 +468,6 @@ QAbstractFileEngine::Iterator *QIOSFileEngineAssetsLibrary::endEntryList() return 0; } +QT_END_NAMESPACE + #endif diff --git a/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileenginefactory.h b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileenginefactory.h index 29f543caae..f41de5f8ec 100644 --- a/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileenginefactory.h +++ b/src/plugins/platforms/ios/optional/nsphotolibrarysupport/qiosfileenginefactory.h @@ -38,6 +38,8 @@ #include #include "qiosfileengineassetslibrary.h" +QT_BEGIN_NAMESPACE + class QIOSFileEngineFactory : public QAbstractFileEngineHandler { public: @@ -52,4 +54,6 @@ public: } }; +QT_END_NAMESPACE + #endif // QIOSFILEENGINEFACTORY_H -- cgit v1.2.3 From 0e2d38b4477ffec6941d0f88cfa7bf92a8b79843 Mon Sep 17 00:00:00 2001 From: Alex Trotsenko Date: Mon, 24 Oct 2016 19:16:13 +0300 Subject: QAbstractSocket: avoid unspecified behavior in writing on TCP Passing zero as size parameter to QAbstractSocketEngine::write() has unspecified behavior, at least for TCP sockets. This could happen on flush() when writeBuffer is empty or on writeData() with size 0. Avoid by explicitly checking against zero size. Change-Id: I070630d244ce6c3de3da94f84c2cded2c7a4b081 Reviewed-by: Edward Welbourne --- src/network/socket/qabstractsocket.cpp | 4 ++-- src/network/socket/qnativesocketengine.cpp | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp index 3d665270fd..f28dc6698a 100644 --- a/src/network/socket/qabstractsocket.cpp +++ b/src/network/socket/qabstractsocket.cpp @@ -881,7 +881,7 @@ bool QAbstractSocketPrivate::flush() const char *ptr = writeBuffer.readPointer(); // Attempt to write it all in one chunk. - qint64 written = socketEngine->write(ptr, nextSize); + qint64 written = nextSize ? socketEngine->write(ptr, nextSize) : Q_INT64_C(0); if (written < 0) { #if defined (QABSTRACTSOCKET_DEBUG) qDebug() << "QAbstractSocketPrivate::flush() write error, aborting." << socketEngine->errorString(); @@ -2477,7 +2477,7 @@ qint64 QAbstractSocket::writeData(const char *data, qint64 size) if (!d->isBuffered && d->socketType == TcpSocket && d->socketEngine && d->writeBuffer.isEmpty()) { // This code is for the new Unbuffered QTcpSocket use case - qint64 written = d->socketEngine->write(data, size); + qint64 written = size ? d->socketEngine->write(data, size) : Q_INT64_C(0); if (written < 0) { d->setError(d->socketEngine->error(), d->socketEngine->errorString()); return written; diff --git a/src/network/socket/qnativesocketengine.cpp b/src/network/socket/qnativesocketengine.cpp index 805acde860..86d13d82a2 100644 --- a/src/network/socket/qnativesocketengine.cpp +++ b/src/network/socket/qnativesocketengine.cpp @@ -846,6 +846,10 @@ qint64 QNativeSocketEngine::writeDatagram(const char *data, qint64 size, const Q /*! Writes a block of \a size bytes from \a data to the socket. Returns the number of bytes written, or -1 if an error occurred. + + Passing zero as the \a size parameter on a connected UDP socket + will send an empty datagram. For other socket types results are + unspecified. */ qint64 QNativeSocketEngine::write(const char *data, qint64 size) { -- cgit v1.2.3 From 3daa76d49499a1b03ff8296d3aab8f6fa4c23267 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Thu, 27 Oct 2016 14:06:49 +0200 Subject: iOS: ensure we return a non-null clipboard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit QPlatformIntegration::clipboard() is not allowed to return null. This will lead to a crash as soon as someone tries to access QClipboard. Change-Id: I3c1e7cdc5103fe4424f9739a09f599d6c0af40b2 Reviewed-by: Tor Arne Vestbø Reviewed-by: Jake Petroules --- src/plugins/platforms/ios/qiosintegration.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/plugins/platforms/ios/qiosintegration.mm b/src/plugins/platforms/ios/qiosintegration.mm index 82b5f3b755..44e636bae6 100644 --- a/src/plugins/platforms/ios/qiosintegration.mm +++ b/src/plugins/platforms/ios/qiosintegration.mm @@ -227,7 +227,7 @@ QPlatformClipboard *QIOSIntegration::clipboard() const #ifndef Q_OS_TVOS return m_clipboard; #else - return 0; + return QPlatformIntegration::clipboard(); #endif } #endif -- cgit v1.2.3 From 5700644a4268fdf8717b83a63e4843dcb86814b6 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Thu, 27 Oct 2016 13:50:21 +0200 Subject: iOS: guard iOS only code to not break tvOS build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit inputAssistantItem is not available on tvOS. Change-Id: Icff684d6299688fbeaf40ffcb32ff9c46371b305 Reviewed-by: Tor Arne Vestbø Reviewed-by: Jake Petroules --- src/plugins/platforms/ios/qiostextresponder.mm | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src') diff --git a/src/plugins/platforms/ios/qiostextresponder.mm b/src/plugins/platforms/ios/qiostextresponder.mm index d7b0a323ad..e8d216fbc2 100644 --- a/src/plugins/platforms/ios/qiostextresponder.mm +++ b/src/plugins/platforms/ios/qiostextresponder.mm @@ -236,6 +236,8 @@ self.inputView = [[[WrapperView alloc] initWithView:inputView] autorelease]; if (UIView *accessoryView = static_cast(platformData.value(kImePlatformDataInputAccessoryView).value())) self.inputAccessoryView = [[[WrapperView alloc] initWithView:accessoryView] autorelease]; + +#ifndef Q_OS_TVOS if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_9_0) { if (platformData.value(kImePlatformDataHideShortcutsBar).toBool()) { // According to the docs, leadingBarButtonGroups/trailingBarButtonGroups should be set to nil to hide the shortcuts bar. @@ -247,6 +249,7 @@ self.inputAssistantItem.trailingBarButtonGroups = @[trailing]; } } +#endif self.undoManager.groupsByEvent = NO; [self rebuildUndoStack]; -- cgit v1.2.3 From af3e697ad60358d5a68b8692ee4d2e4f92ab65f8 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 13 Sep 2016 08:34:06 +0200 Subject: QWindowsXPStyle: Use qreal scale factors in theme drawing helpers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This improves support for fractional scale factors. Task-number: QTBUG-49374 Change-Id: Ied6579ee831f3ea29f238baaffa67374ea6823d9 Reviewed-by: Morten Johan Sørvig --- src/widgets/styles/qwindowsxpstyle.cpp | 36 ++++++++++++++++---------------- src/widgets/styles/qwindowsxpstyle_p_p.h | 4 ++-- 2 files changed, 20 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/widgets/styles/qwindowsxpstyle.cpp b/src/widgets/styles/qwindowsxpstyle.cpp index 3017707117..e85d0360f9 100644 --- a/src/widgets/styles/qwindowsxpstyle.cpp +++ b/src/widgets/styles/qwindowsxpstyle.cpp @@ -803,7 +803,7 @@ bool QWindowsXPStylePrivate::drawBackground(XPThemeData &themeData) bool translucentToplevel = false; const QPaintDevice *paintDevice = painter->device(); - const qreal aditionalDevicePixelRatio = themeData.widget ? themeData.widget->devicePixelRatio() : 1; + const qreal aditionalDevicePixelRatio = themeData.widget ? themeData.widget->devicePixelRatioF() : qreal(1); if (paintDevice->devType() == QInternal::Widget) { const QWidget *window = static_cast(paintDevice)->window(); translucentToplevel = window->testAttribute(Qt::WA_TranslucentBackground); @@ -832,28 +832,28 @@ bool QWindowsXPStylePrivate::drawBackground(XPThemeData &themeData) const HDC dc = canDrawDirectly ? hdcForWidgetBackingStore(themeData.widget) : HDC(0); const bool result = dc - ? drawBackgroundDirectly(dc, themeData, qRound(aditionalDevicePixelRatio)) - : drawBackgroundThruNativeBuffer(themeData, qRound(aditionalDevicePixelRatio)); + ? drawBackgroundDirectly(dc, themeData, aditionalDevicePixelRatio) + : drawBackgroundThruNativeBuffer(themeData, aditionalDevicePixelRatio); painter->restore(); return result; } -static inline QRect scaleRect(const QRect &r, int factor) +static inline QRectF scaleRect(const QRectF &r, qreal factor) { return r.isValid() && factor > 1 - ? QRect(r.topLeft() * factor, r.size() * factor) + ? QRectF(r.topLeft() * factor, r.size() * factor) : r; } -static QRegion scaleRegion(const QRegion ®ion, int factor) +static QRegion scaleRegion(const QRegion ®ion, qreal factor) { - if (region.isEmpty() || factor == 1) + if (region.isEmpty() || qFuzzyCompare(factor, qreal(1))) return region; if (region.rectCount() == 1) - return QRegion(scaleRect(region.boundingRect(), factor)); + return QRegion(scaleRect(QRectF(region.boundingRect()), factor).toRect()); QRegion result; foreach (const QRect &rect, region.rects()) - result += QRect(rect.topLeft() * factor, rect.size() * factor); + result += QRectF(QPointF(rect.topLeft()) * factor, QSizeF(rect.size() * factor)).toRect(); return result; } @@ -862,13 +862,12 @@ static QRegion scaleRegion(const QRegion ®ion, int factor) Do not use this if you need to perform other transformations on the resulting data. */ -bool QWindowsXPStylePrivate::drawBackgroundDirectly(HDC dc, XPThemeData &themeData, int additionalDevicePixelRatio) +bool QWindowsXPStylePrivate::drawBackgroundDirectly(HDC dc, XPThemeData &themeData, qreal additionalDevicePixelRatio) { QPainter *painter = themeData.painter; - QPoint redirectionDelta(int(painter->deviceMatrix().dx()), - int(painter->deviceMatrix().dy())); - QRect area = scaleRect(themeData.rect, additionalDevicePixelRatio).translated(redirectionDelta); + const QPointF redirectionDelta(painter->deviceMatrix().dx(), painter->deviceMatrix().dy()); + const QRect area = scaleRect(QRectF(themeData.rect), additionalDevicePixelRatio).translated(redirectionDelta).toRect(); QRegion sysRgn = painter->paintEngine()->systemClip(); if (sysRgn.isEmpty()) @@ -876,7 +875,7 @@ bool QWindowsXPStylePrivate::drawBackgroundDirectly(HDC dc, XPThemeData &themeDa else sysRgn &= area; if (painter->hasClipping()) - sysRgn &= scaleRegion(painter->clipRegion(), additionalDevicePixelRatio).translated(redirectionDelta); + sysRgn &= scaleRegion(painter->clipRegion(), additionalDevicePixelRatio).translated(redirectionDelta.toPoint()); HRGN hrgn = qt_hrgn_from_qregion(sysRgn); SelectClipRgn(dc, hrgn); @@ -948,15 +947,16 @@ bool QWindowsXPStylePrivate::drawBackgroundDirectly(HDC dc, XPThemeData &themeDa engine). */ bool QWindowsXPStylePrivate::drawBackgroundThruNativeBuffer(XPThemeData &themeData, - int additionalDevicePixelRatio) + qreal additionalDevicePixelRatio) { QPainter *painter = themeData.painter; - QRect rect = scaleRect(themeData.rect, additionalDevicePixelRatio); + QRectF rectF = scaleRect(QRectF(themeData.rect), additionalDevicePixelRatio); if ((themeData.rotate + 90) % 180 == 0) { // Catch 90,270,etc.. degree flips. - rect = QRect(0, 0, rect.height(), rect.width()); + rectF = QRectF(0, 0, rectF.height(), rectF.width()); } - rect.moveTo(0,0); + rectF.moveTo(0, 0); + QRect rect = rectF.toRect(); int partId = themeData.partId; int stateId = themeData.stateId; int w = rect.width(); diff --git a/src/widgets/styles/qwindowsxpstyle_p_p.h b/src/widgets/styles/qwindowsxpstyle_p_p.h index 51541ed218..5a6a23511f 100644 --- a/src/widgets/styles/qwindowsxpstyle_p_p.h +++ b/src/widgets/styles/qwindowsxpstyle_p_p.h @@ -388,8 +388,8 @@ public: void setTransparency(QWidget *widget, XPThemeData &themeData); bool drawBackground(XPThemeData &themeData); - bool drawBackgroundThruNativeBuffer(XPThemeData &themeData, int aditionalDevicePixelRatio); - bool drawBackgroundDirectly(HDC dc, XPThemeData &themeData, int aditionalDevicePixelRatio); + bool drawBackgroundThruNativeBuffer(XPThemeData &themeData, qreal aditionalDevicePixelRatio); + bool drawBackgroundDirectly(HDC dc, XPThemeData &themeData, qreal aditionalDevicePixelRatio); bool hasAlphaChannel(const QRect &rect); bool fixAlphaChannel(const QRect &rect); -- cgit v1.2.3 From f9a80e06ac928bf796d013dd7fba10ba30827202 Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Fri, 3 Jun 2016 16:22:21 -0700 Subject: Move Windows font DB and engines to QtFontDatabaseSupport This allows creating or extending QPA plugins to provide access to QFont and related types. It concerns both GDI and DirectWrite engines, as well as the regular and the freetype based font databases. The qt.qpa.fonts logging category has been moved together into the QWindowsFontDatabase related files to avoid depending on the qwindowscontext.h header file. Finally, QwindowsNativeImage is following pending a future refactor with similar code in qpixmap_win.cpp and the Windows XP style. Change-Id: Iddff2f3d715e3ab7695e6c2052b7596a01fd6fa8 Reviewed-by: Friedemann Kleint --- .../fontdatabases/fontdatabases.pro | 4 + .../fontdatabases/windows/qwindowsfontdatabase.cpp | 1984 ++++++++++++++++++++ .../windows/qwindowsfontdatabase_ft.cpp | 437 +++++ .../windows/qwindowsfontdatabase_ft_p.h | 79 + .../fontdatabases/windows/qwindowsfontdatabase_p.h | 160 ++ .../fontdatabases/windows/qwindowsfontengine.cpp | 1330 +++++++++++++ .../fontdatabases/windows/qwindowsfontengine_p.h | 186 ++ .../windows/qwindowsfontenginedirectwrite.cpp | 999 ++++++++++ .../windows/qwindowsfontenginedirectwrite_p.h | 154 ++ .../fontdatabases/windows/qwindowsnativeimage.cpp | 159 ++ .../fontdatabases/windows/qwindowsnativeimage_p.h | 89 + .../fontdatabases/windows/windows.pri | 33 + src/platformsupport/platformsupport.pro | 2 +- src/plugins/platforms/direct2d/direct2d.pro | 3 +- .../direct2d/qwindowsdirect2dpaintengine.cpp | 4 +- .../platforms/windows/qwindowsbackingstore.cpp | 2 +- src/plugins/platforms/windows/qwindowscontext.cpp | 1 - src/plugins/platforms/windows/qwindowscontext.h | 1 - .../platforms/windows/qwindowsfontdatabase.cpp | 1960 ------------------- .../platforms/windows/qwindowsfontdatabase.h | 133 -- .../platforms/windows/qwindowsfontdatabase_ft.cpp | 438 ----- .../platforms/windows/qwindowsfontdatabase_ft.h | 68 - .../platforms/windows/qwindowsfontengine.cpp | 1328 ------------- src/plugins/platforms/windows/qwindowsfontengine.h | 187 -- .../windows/qwindowsfontenginedirectwrite.cpp | 1000 ---------- .../windows/qwindowsfontenginedirectwrite.h | 143 -- .../platforms/windows/qwindowsintegration.cpp | 4 +- .../platforms/windows/qwindowsintegration.h | 6 +- .../platforms/windows/qwindowsnativeimage.cpp | 150 -- .../platforms/windows/qwindowsnativeimage.h | 78 - .../platforms/windows/qwindowsnativeinterface.cpp | 2 +- src/plugins/platforms/windows/qwindowstheme.cpp | 2 +- src/plugins/platforms/windows/qwindowswindow.cpp | 1 - src/plugins/platforms/windows/windows.pri | 21 - 34 files changed, 5628 insertions(+), 5520 deletions(-) create mode 100644 src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp create mode 100644 src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp create mode 100644 src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft_p.h create mode 100644 src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h create mode 100644 src/platformsupport/fontdatabases/windows/qwindowsfontengine.cpp create mode 100644 src/platformsupport/fontdatabases/windows/qwindowsfontengine_p.h create mode 100644 src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite.cpp create mode 100644 src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite_p.h create mode 100644 src/platformsupport/fontdatabases/windows/qwindowsnativeimage.cpp create mode 100644 src/platformsupport/fontdatabases/windows/qwindowsnativeimage_p.h create mode 100644 src/platformsupport/fontdatabases/windows/windows.pri delete mode 100644 src/plugins/platforms/windows/qwindowsfontdatabase.cpp delete mode 100644 src/plugins/platforms/windows/qwindowsfontdatabase.h delete mode 100644 src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp delete mode 100644 src/plugins/platforms/windows/qwindowsfontdatabase_ft.h delete mode 100644 src/plugins/platforms/windows/qwindowsfontengine.cpp delete mode 100644 src/plugins/platforms/windows/qwindowsfontengine.h delete mode 100644 src/plugins/platforms/windows/qwindowsfontenginedirectwrite.cpp delete mode 100644 src/plugins/platforms/windows/qwindowsfontenginedirectwrite.h delete mode 100644 src/plugins/platforms/windows/qwindowsnativeimage.cpp delete mode 100644 src/plugins/platforms/windows/qwindowsnativeimage.h (limited to 'src') diff --git a/src/platformsupport/fontdatabases/fontdatabases.pro b/src/platformsupport/fontdatabases/fontdatabases.pro index 7ffeda6fe2..7fc4ecc115 100644 --- a/src/platformsupport/fontdatabases/fontdatabases.pro +++ b/src/platformsupport/fontdatabases/fontdatabases.pro @@ -20,6 +20,10 @@ darwin:!if(watchos:CONFIG(simulator, simulator|device)) { include($$PWD/fontconfig/fontconfig.pri) } } + + win32:!winrt { + include($$PWD/windows/windows.pri) + } } load(qt_module) diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp new file mode 100644 index 0000000000..ad653ab95d --- /dev/null +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp @@ -0,0 +1,1984 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwindowsfontdatabase_p.h" +#include "qwindowsfontdatabase_ft_p.h" // for default font +#include "qwindowsfontengine_p.h" +#include "qwindowsfontenginedirectwrite_p.h" +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#if !defined(QT_NO_DIRECTWRITE) +# if defined(QT_USE_DIRECTWRITE2) +# include +# else +# include +# endif +# include +#endif + +QT_BEGIN_NAMESPACE + +Q_LOGGING_CATEGORY(lcQpaFonts, "qt.qpa.fonts") + +#ifndef QT_NO_DIRECTWRITE +// ### fixme: Consider direct linking of dwrite.dll once Windows Vista pre SP2 is dropped (QTBUG-49711) + +typedef HRESULT (WINAPI *DWriteCreateFactoryType)(DWRITE_FACTORY_TYPE, const IID &, IUnknown **); + +static inline DWriteCreateFactoryType resolveDWriteCreateFactory() +{ + if (QSysInfo::windowsVersion() < QSysInfo::WV_VISTA) + return Q_NULLPTR; + QSystemLibrary library(QStringLiteral("dwrite")); + QFunctionPointer result = library.resolve("DWriteCreateFactory"); + if (Q_UNLIKELY(!result)) { + qWarning("Unable to load dwrite.dll"); + return Q_NULLPTR; + } + return reinterpret_cast(result); +} + +static void createDirectWriteFactory(IDWriteFactory **factory) +{ + *factory = Q_NULLPTR; + + static const DWriteCreateFactoryType dWriteCreateFactory = resolveDWriteCreateFactory(); + if (!dWriteCreateFactory) + return; + + IUnknown *result = NULL; +#if defined(QT_USE_DIRECTWRITE2) + dWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory2), &result); +#endif + + if (result == NULL) { + if (FAILED(dWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory), &result))) { + qErrnoWarning("DWriteCreateFactory failed"); + return; + } + } + + *factory = static_cast(result); +} + +static inline bool useDirectWrite(QFont::HintingPreference hintingPreference, + const QString &familyName = QString(), + bool isColorFont = false) +{ + const unsigned options = QWindowsFontDatabase::fontOptions(); + if (Q_UNLIKELY(options & QWindowsFontDatabase::DontUseDirectWriteFonts)) + return false; + + // At some scales, GDI will misrender the MingLiU font, so we force use of + // DirectWrite to work around the issue. + if (Q_UNLIKELY(familyName.startsWith(QLatin1String("MingLiU")))) + return true; + + if (isColorFont) + return (options & QWindowsFontDatabase::DontUseColorFonts) == 0; + + return hintingPreference == QFont::PreferNoHinting + || hintingPreference == QFont::PreferVerticalHinting + || (QHighDpiScaling::isActive() && hintingPreference == QFont::PreferDefaultHinting); +} +#endif // !QT_NO_DIRECTWRITE + +// Helper classes for creating font engines directly from font data +namespace { + +# pragma pack(1) + + // Common structure for all formats of the "name" table + struct NameTable + { + quint16 format; + quint16 count; + quint16 stringOffset; + }; + + struct NameRecord + { + quint16 platformID; + quint16 encodingID; + quint16 languageID; + quint16 nameID; + quint16 length; + quint16 offset; + }; + + struct OffsetSubTable + { + quint32 scalerType; + quint16 numTables; + quint16 searchRange; + quint16 entrySelector; + quint16 rangeShift; + }; + + struct TableDirectory + { + quint32 identifier; + quint32 checkSum; + quint32 offset; + quint32 length; + }; + + struct OS2Table + { + quint16 version; + qint16 avgCharWidth; + quint16 weightClass; + quint16 widthClass; + quint16 type; + qint16 subscriptXSize; + qint16 subscriptYSize; + qint16 subscriptXOffset; + qint16 subscriptYOffset; + qint16 superscriptXSize; + qint16 superscriptYSize; + qint16 superscriptXOffset; + qint16 superscriptYOffset; + qint16 strikeOutSize; + qint16 strikeOutPosition; + qint16 familyClass; + quint8 panose[10]; + quint32 unicodeRanges[4]; + quint8 vendorID[4]; + quint16 selection; + quint16 firstCharIndex; + quint16 lastCharIndex; + qint16 typoAscender; + qint16 typoDescender; + qint16 typoLineGap; + quint16 winAscent; + quint16 winDescent; + quint32 codepageRanges[2]; + qint16 height; + qint16 capHeight; + quint16 defaultChar; + quint16 breakChar; + quint16 maxContext; + }; + +# pragma pack() + + class EmbeddedFont + { + public: + EmbeddedFont(const QByteArray &fontData) : m_fontData(fontData) {} + + QString changeFamilyName(const QString &newFamilyName); + QByteArray data() const { return m_fontData; } + TableDirectory *tableDirectoryEntry(const QByteArray &tagName); + QString familyName(TableDirectory *nameTableDirectory = 0); + + private: + QByteArray m_fontData; + }; + + TableDirectory *EmbeddedFont::tableDirectoryEntry(const QByteArray &tagName) + { + Q_ASSERT(tagName.size() == 4); + quint32 tagId = *(reinterpret_cast(tagName.constData())); + const size_t fontDataSize = m_fontData.size(); + if (Q_UNLIKELY(fontDataSize < sizeof(OffsetSubTable))) + return 0; + + OffsetSubTable *offsetSubTable = reinterpret_cast(m_fontData.data()); + TableDirectory *tableDirectory = reinterpret_cast(offsetSubTable + 1); + + const size_t tableCount = qFromBigEndian(offsetSubTable->numTables); + if (Q_UNLIKELY(fontDataSize < sizeof(OffsetSubTable) + sizeof(TableDirectory) * tableCount)) + return 0; + + TableDirectory *tableDirectoryEnd = tableDirectory + tableCount; + for (TableDirectory *entry = tableDirectory; entry < tableDirectoryEnd; ++entry) { + if (entry->identifier == tagId) + return entry; + } + + return 0; + } + + QString EmbeddedFont::familyName(TableDirectory *nameTableDirectoryEntry) + { + QString name; + + if (nameTableDirectoryEntry == 0) + nameTableDirectoryEntry = tableDirectoryEntry("name"); + + if (nameTableDirectoryEntry != 0) { + quint32 offset = qFromBigEndian(nameTableDirectoryEntry->offset); + if (Q_UNLIKELY(quint32(m_fontData.size()) < offset + sizeof(NameTable))) + return QString(); + + NameTable *nameTable = reinterpret_cast(m_fontData.data() + offset); + NameRecord *nameRecord = reinterpret_cast(nameTable + 1); + + quint16 nameTableCount = qFromBigEndian(nameTable->count); + if (Q_UNLIKELY(quint32(m_fontData.size()) < offset + sizeof(NameRecord) * nameTableCount)) + return QString(); + + for (int i = 0; i < nameTableCount; ++i, ++nameRecord) { + if (qFromBigEndian(nameRecord->nameID) == 1 + && qFromBigEndian(nameRecord->platformID) == 3 // Windows + && qFromBigEndian(nameRecord->languageID) == 0x0409) { // US English + quint16 stringOffset = qFromBigEndian(nameTable->stringOffset); + quint16 nameOffset = qFromBigEndian(nameRecord->offset); + quint16 nameLength = qFromBigEndian(nameRecord->length); + + if (Q_UNLIKELY(quint32(m_fontData.size()) < offset + stringOffset + nameOffset + nameLength)) + return QString(); + + const void *ptr = reinterpret_cast(nameTable) + + stringOffset + + nameOffset; + + const quint16 *s = reinterpret_cast(ptr); + const quint16 *e = s + nameLength / sizeof(quint16); + while (s != e) + name += QChar( qFromBigEndian(*s++)); + break; + } + } + } + + return name; + } + + QString EmbeddedFont::changeFamilyName(const QString &newFamilyName) + { + TableDirectory *nameTableDirectoryEntry = tableDirectoryEntry("name"); + if (nameTableDirectoryEntry == 0) + return QString(); + + QString oldFamilyName = familyName(nameTableDirectoryEntry); + + // Reserve size for name table header, five required name records and string + const int requiredRecordCount = 5; + quint16 nameIds[requiredRecordCount] = { 1, 2, 3, 4, 6 }; + + int sizeOfHeader = sizeof(NameTable) + sizeof(NameRecord) * requiredRecordCount; + int newFamilyNameSize = newFamilyName.size() * int(sizeof(quint16)); + + const QString regularString = QString::fromLatin1("Regular"); + int regularStringSize = regularString.size() * int(sizeof(quint16)); + + // Align table size of table to 32 bits (pad with 0) + int fullSize = ((sizeOfHeader + newFamilyNameSize + regularStringSize) & ~3) + 4; + + QByteArray newNameTable(fullSize, char(0)); + + { + NameTable *nameTable = reinterpret_cast(newNameTable.data()); + nameTable->count = qbswap(requiredRecordCount); + nameTable->stringOffset = qbswap(sizeOfHeader); + + NameRecord *nameRecord = reinterpret_cast(nameTable + 1); + for (int i = 0; i < requiredRecordCount; ++i, nameRecord++) { + nameRecord->nameID = qbswap(nameIds[i]); + nameRecord->encodingID = qbswap(1); + nameRecord->languageID = qbswap(0x0409); + nameRecord->platformID = qbswap(3); + nameRecord->length = qbswap(newFamilyNameSize); + + // Special case for sub-family + if (nameIds[i] == 4) { + nameRecord->offset = qbswap(newFamilyNameSize); + nameRecord->length = qbswap(regularStringSize); + } + } + + // nameRecord now points to string data + quint16 *stringStorage = reinterpret_cast(nameRecord); + const quint16 *sourceString = newFamilyName.utf16(); + for (int i = 0; i < newFamilyName.size(); ++i) + stringStorage[i] = qbswap(sourceString[i]); + stringStorage += newFamilyName.size(); + + sourceString = regularString.utf16(); + for (int i = 0; i < regularString.size(); ++i) + stringStorage[i] = qbswap(sourceString[i]); + } + + quint32 *p = reinterpret_cast(newNameTable.data()); + quint32 *tableEnd = reinterpret_cast(newNameTable.data() + fullSize); + + quint32 checkSum = 0; + while (p < tableEnd) + checkSum += qFromBigEndian(*(p++)); + + nameTableDirectoryEntry->checkSum = qbswap(checkSum); + nameTableDirectoryEntry->offset = qbswap(m_fontData.size()); + nameTableDirectoryEntry->length = qbswap(fullSize); + + m_fontData.append(newNameTable); + + return oldFamilyName; + } + +#if !defined(QT_NO_DIRECTWRITE) + + class DirectWriteFontFileStream: public IDWriteFontFileStream + { + public: + DirectWriteFontFileStream(const QByteArray &fontData) + : m_fontData(fontData) + , m_referenceCount(0) + { + } + virtual ~DirectWriteFontFileStream() + { + } + + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **object); + ULONG STDMETHODCALLTYPE AddRef(); + ULONG STDMETHODCALLTYPE Release(); + + HRESULT STDMETHODCALLTYPE ReadFileFragment(const void **fragmentStart, UINT64 fileOffset, + UINT64 fragmentSize, OUT void **fragmentContext); + void STDMETHODCALLTYPE ReleaseFileFragment(void *fragmentContext); + HRESULT STDMETHODCALLTYPE GetFileSize(OUT UINT64 *fileSize); + HRESULT STDMETHODCALLTYPE GetLastWriteTime(OUT UINT64 *lastWriteTime); + + private: + QByteArray m_fontData; + ULONG m_referenceCount; + }; + + HRESULT STDMETHODCALLTYPE DirectWriteFontFileStream::QueryInterface(REFIID iid, void **object) + { + if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileStream)) { + *object = this; + AddRef(); + return S_OK; + } else { + *object = NULL; + return E_NOINTERFACE; + } + } + + ULONG STDMETHODCALLTYPE DirectWriteFontFileStream::AddRef() + { + return InterlockedIncrement(&m_referenceCount); + } + + ULONG STDMETHODCALLTYPE DirectWriteFontFileStream::Release() + { + ULONG newCount = InterlockedDecrement(&m_referenceCount); + if (newCount == 0) + delete this; + return newCount; + } + + HRESULT STDMETHODCALLTYPE DirectWriteFontFileStream::ReadFileFragment( + const void **fragmentStart, + UINT64 fileOffset, + UINT64 fragmentSize, + OUT void **fragmentContext) + { + *fragmentContext = NULL; + if (fileOffset + fragmentSize <= quint64(m_fontData.size())) { + *fragmentStart = m_fontData.data() + fileOffset; + return S_OK; + } else { + *fragmentStart = NULL; + return E_FAIL; + } + } + + void STDMETHODCALLTYPE DirectWriteFontFileStream::ReleaseFileFragment(void *) + { + } + + HRESULT STDMETHODCALLTYPE DirectWriteFontFileStream::GetFileSize(UINT64 *fileSize) + { + *fileSize = m_fontData.size(); + return S_OK; + } + + HRESULT STDMETHODCALLTYPE DirectWriteFontFileStream::GetLastWriteTime(UINT64 *lastWriteTime) + { + *lastWriteTime = 0; + return E_NOTIMPL; + } + + class DirectWriteFontFileLoader: public IDWriteFontFileLoader + { + public: + DirectWriteFontFileLoader() : m_referenceCount(0) {} + virtual ~DirectWriteFontFileLoader() + { + } + + inline void addKey(const void *key, const QByteArray &fontData) + { + Q_ASSERT(!m_fontDatas.contains(key)); + m_fontDatas.insert(key, fontData); + } + + inline void removeKey(const void *key) + { + m_fontDatas.remove(key); + } + + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **object); + ULONG STDMETHODCALLTYPE AddRef(); + ULONG STDMETHODCALLTYPE Release(); + + HRESULT STDMETHODCALLTYPE CreateStreamFromKey(void const *fontFileReferenceKey, + UINT32 fontFileReferenceKeySize, + OUT IDWriteFontFileStream **fontFileStream); + + private: + ULONG m_referenceCount; + QHash m_fontDatas; + }; + + HRESULT STDMETHODCALLTYPE DirectWriteFontFileLoader::QueryInterface(const IID &iid, + void **object) + { + if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileLoader)) { + *object = this; + AddRef(); + return S_OK; + } else { + *object = NULL; + return E_NOINTERFACE; + } + } + + ULONG STDMETHODCALLTYPE DirectWriteFontFileLoader::AddRef() + { + return InterlockedIncrement(&m_referenceCount); + } + + ULONG STDMETHODCALLTYPE DirectWriteFontFileLoader::Release() + { + ULONG newCount = InterlockedDecrement(&m_referenceCount); + if (newCount == 0) + delete this; + return newCount; + } + + HRESULT STDMETHODCALLTYPE DirectWriteFontFileLoader::CreateStreamFromKey( + void const *fontFileReferenceKey, + UINT32 fontFileReferenceKeySize, + IDWriteFontFileStream **fontFileStream) + { + Q_UNUSED(fontFileReferenceKeySize); + + if (fontFileReferenceKeySize != sizeof(const void *)) { + qWarning("%s: Wrong key size", __FUNCTION__); + return E_FAIL; + } + + const void *key = *reinterpret_cast(fontFileReferenceKey); + *fontFileStream = NULL; + if (!m_fontDatas.contains(key)) + return E_FAIL; + + QByteArray fontData = m_fontDatas.value(key); + DirectWriteFontFileStream *stream = new DirectWriteFontFileStream(fontData); + stream->AddRef(); + *fontFileStream = stream; + + return S_OK; + } + + class CustomFontFileLoader + { + public: + CustomFontFileLoader() : m_directWriteFontFileLoader(Q_NULLPTR) + { + createDirectWriteFactory(&m_directWriteFactory); + + if (m_directWriteFactory) { + m_directWriteFontFileLoader = new DirectWriteFontFileLoader(); + m_directWriteFactory->RegisterFontFileLoader(m_directWriteFontFileLoader); + } + } + + ~CustomFontFileLoader() + { + if (m_directWriteFactory != 0 && m_directWriteFontFileLoader != 0) + m_directWriteFactory->UnregisterFontFileLoader(m_directWriteFontFileLoader); + + if (m_directWriteFactory != 0) + m_directWriteFactory->Release(); + } + + void addKey(const void *key, const QByteArray &fontData) + { + if (m_directWriteFontFileLoader != 0) + m_directWriteFontFileLoader->addKey(key, fontData); + } + + void removeKey(const void *key) + { + if (m_directWriteFontFileLoader != 0) + m_directWriteFontFileLoader->removeKey(key); + } + + IDWriteFontFileLoader *loader() const + { + return m_directWriteFontFileLoader; + } + + private: + IDWriteFactory *m_directWriteFactory; + DirectWriteFontFileLoader *m_directWriteFontFileLoader; + }; + +#endif + +} // Anonymous namespace + +/*! + \struct QWindowsFontEngineData + \brief Static constant data shared by the font engines. + \ingroup qt-lighthouse-win +*/ + +QWindowsFontEngineData::QWindowsFontEngineData() + : clearTypeEnabled(false) + , fontSmoothingGamma(QWindowsFontDatabase::fontSmoothingGamma()) +#if !defined(QT_NO_DIRECTWRITE) + , directWriteFactory(0) + , directWriteGdiInterop(0) +#endif +{ + // from qapplication_win.cpp + UINT result = 0; + if (SystemParametersInfo(SPI_GETFONTSMOOTHINGTYPE, 0, &result, 0)) + clearTypeEnabled = (result == FE_FONTSMOOTHINGCLEARTYPE); + + const qreal gray_gamma = 2.31; + for (int i=0; i<256; ++i) + pow_gamma[i] = uint(qRound(qPow(i / qreal(255.), gray_gamma) * 2047)); + + HDC displayDC = GetDC(0); + hdc = CreateCompatibleDC(displayDC); + ReleaseDC(0, displayDC); +} + +unsigned QWindowsFontDatabase::m_fontOptions = 0; + +void QWindowsFontDatabase::setFontOptions(unsigned options) +{ + m_fontOptions = options & (QWindowsFontDatabase::DontUseDirectWriteFonts | + QWindowsFontDatabase::DontUseColorFonts); +} + +unsigned QWindowsFontDatabase::fontOptions() +{ + return m_fontOptions; +} + +QWindowsFontEngineData::~QWindowsFontEngineData() +{ + if (hdc) + DeleteDC(hdc); +#if !defined(QT_NO_DIRECTWRITE) + if (directWriteGdiInterop) + directWriteGdiInterop->Release(); + if (directWriteFactory) + directWriteFactory->Release(); +#endif +} + +qreal QWindowsFontDatabase::fontSmoothingGamma() +{ + int winSmooth; + qreal result = 1; + if (SystemParametersInfo(0x200C /* SPI_GETFONTSMOOTHINGCONTRAST */, 0, &winSmooth, 0)) + result = qreal(winSmooth) / qreal(1000.0); + + // Safeguard ourselves against corrupt registry values... + if (result > 5 || result < 1) + result = qreal(1.4); + return result; +} + +#if !defined(QT_NO_DIRECTWRITE) +static inline bool initDirectWrite(QWindowsFontEngineData *d) +{ + if (!d->directWriteFactory) { + createDirectWriteFactory(&d->directWriteFactory); + if (!d->directWriteFactory) + return false; + } + if (!d->directWriteGdiInterop) { + const HRESULT hr = d->directWriteFactory->GetGdiInterop(&d->directWriteGdiInterop); + if (FAILED(hr)) { + qErrnoWarning("%s: GetGdiInterop failed", __FUNCTION__); + return false; + } + } + return true; +} + +#endif // !defined(QT_NO_DIRECTWRITE) + +/*! + \class QWindowsFontDatabase + \brief Font database for Windows + + \note The Qt 4.8 WIndows font database employed a mechanism of + delayed population of the database again passing a font name + to EnumFontFamiliesEx(), working around the fact that + EnumFontFamiliesEx() does not list all fonts by default. + This should be introduced to Lighthouse as well? + + \internal + \ingroup qt-lighthouse-win +*/ + +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug d, const QFontDef &def) +{ + QDebugStateSaver saver(d); + d.nospace(); + d.noquote(); + d << "QFontDef(Family=\"" << def.family << '"'; + if (!def.styleName.isEmpty()) + d << ", stylename=" << def.styleName; + d << ", pointsize=" << def.pointSize << ", pixelsize=" << def.pixelSize + << ", styleHint=" << def.styleHint << ", weight=" << def.weight + << ", stretch=" << def.stretch << ", hintingPreference=" + << def.hintingPreference << ')'; + return d; +} + +QDebug operator<<(QDebug d, const LOGFONT &lf) +{ + QDebugStateSaver saver(d); + d.nospace(); + d.noquote(); + d << "LOGFONT(\"" << QString::fromWCharArray(lf.lfFaceName) + << "\", lfWidth=" << lf.lfWidth << ", lfHeight=" << lf.lfHeight << ')'; + return d; +} +#endif // !QT_NO_DEBUG_STREAM + +static inline QFontDatabase::WritingSystem writingSystemFromCharSet(uchar charSet) +{ + switch (charSet) { + case ANSI_CHARSET: + case EASTEUROPE_CHARSET: + case BALTIC_CHARSET: + case TURKISH_CHARSET: + return QFontDatabase::Latin; + case GREEK_CHARSET: + return QFontDatabase::Greek; + case RUSSIAN_CHARSET: + return QFontDatabase::Cyrillic; + case HEBREW_CHARSET: + return QFontDatabase::Hebrew; + case ARABIC_CHARSET: + return QFontDatabase::Arabic; + case THAI_CHARSET: + return QFontDatabase::Thai; + case GB2312_CHARSET: + return QFontDatabase::SimplifiedChinese; + case CHINESEBIG5_CHARSET: + return QFontDatabase::TraditionalChinese; + case SHIFTJIS_CHARSET: + return QFontDatabase::Japanese; + case HANGUL_CHARSET: + case JOHAB_CHARSET: + return QFontDatabase::Korean; + case VIETNAMESE_CHARSET: + return QFontDatabase::Vietnamese; + case SYMBOL_CHARSET: + return QFontDatabase::Symbol; + default: + break; + } + return QFontDatabase::Any; +} + +#ifdef MAKE_TAG +#undef MAKE_TAG +#endif +// GetFontData expects the tags in little endian ;( +#define MAKE_TAG(ch1, ch2, ch3, ch4) (\ + (((quint32)(ch4)) << 24) | \ + (((quint32)(ch3)) << 16) | \ + (((quint32)(ch2)) << 8) | \ + ((quint32)(ch1)) \ + ) + +bool localizedName(const QString &name) +{ + const QChar *c = name.unicode(); + for (int i = 0; i < name.length(); ++i) { + if (c[i].unicode() >= 0x100) + return true; + } + return false; +} + +static inline quint16 getUShort(const unsigned char *p) +{ + quint16 val; + val = *p++ << 8; + val |= *p; + + return val; +} + +namespace { + +struct FontNames { + QString name; // e.g. "DejaVu Sans Condensed" + QString style; // e.g. "Italic" + QString preferredName; // e.g. "DejaVu Sans" + QString preferredStyle; // e.g. "Condensed Italic" +}; + +static QString readName(bool unicode, const uchar *string, int length) +{ + QString out; + if (unicode) { + // utf16 + + length /= 2; + out.resize(length); + QChar *uc = out.data(); + for (int i = 0; i < length; ++i) + uc[i] = getUShort(string + 2*i); + } else { + // Apple Roman + + out.resize(length); + QChar *uc = out.data(); + for (int i = 0; i < length; ++i) + uc[i] = QLatin1Char(char(string[i])); + } + return out; +} + +enum FieldTypeValue { + FamilyId = 1, + StyleId = 2, + PreferredFamilyId = 16, + PreferredStyleId = 17, +}; + +enum PlatformFieldValue { + PlatformId_Unicode = 0, + PlatformId_Apple = 1, + PlatformId_Microsoft = 3 +}; + +static FontNames getCanonicalFontNames(const uchar *table, quint32 bytes) +{ + FontNames out; + const int NameRecordSize = 12; + const int MS_LangIdEnglish = 0x009; + + // get the name table + quint16 count; + quint16 string_offset; + const unsigned char *names; + + if (bytes < 8) + return out; + + if (getUShort(table) != 0) + return out; + + count = getUShort(table+2); + string_offset = getUShort(table+4); + names = table + 6; + + if (string_offset >= bytes || 6 + count*NameRecordSize > string_offset) + return out; + + enum PlatformIdType { + NotFound = 0, + Unicode = 1, + Apple = 2, + Microsoft = 3 + }; + + PlatformIdType idStatus[4] = { NotFound, NotFound, NotFound, NotFound }; + int ids[4] = { -1, -1, -1, -1 }; + + for (int i = 0; i < count; ++i) { + // search for the correct name entries + + quint16 platform_id = getUShort(names + i*NameRecordSize); + quint16 encoding_id = getUShort(names + 2 + i*NameRecordSize); + quint16 language_id = getUShort(names + 4 + i*NameRecordSize); + quint16 name_id = getUShort(names + 6 + i*NameRecordSize); + + PlatformIdType *idType = nullptr; + int *id = nullptr; + + switch (name_id) { + case FamilyId: + idType = &idStatus[0]; + id = &ids[0]; + break; + case StyleId: + idType = &idStatus[1]; + id = &ids[1]; + break; + case PreferredFamilyId: + idType = &idStatus[2]; + id = &ids[2]; + break; + case PreferredStyleId: + idType = &idStatus[3]; + id = &ids[3]; + break; + default: + continue; + } + + quint16 length = getUShort(names + 8 + i*NameRecordSize); + quint16 offset = getUShort(names + 10 + i*NameRecordSize); + if (DWORD(string_offset + offset + length) > bytes) + continue; + + if ((platform_id == PlatformId_Microsoft + && (encoding_id == 0 || encoding_id == 1)) + && (language_id & 0x3ff) == MS_LangIdEnglish + && *idType < Microsoft) { + *id = i; + *idType = Microsoft; + } + // not sure if encoding id 4 for Unicode is utf16 or ucs4... + else if (platform_id == PlatformId_Unicode && encoding_id < 4 && *idType < Unicode) { + *id = i; + *idType = Unicode; + } + else if (platform_id == PlatformId_Apple && encoding_id == 0 && language_id == 0 && *idType < Apple) { + *id = i; + *idType = Apple; + } + } + + QString strings[4]; + for (int i = 0; i < 4; ++i) { + if (idStatus[i] == NotFound) + continue; + int id = ids[i]; + quint16 length = getUShort(names + 8 + id * NameRecordSize); + quint16 offset = getUShort(names + 10 + id * NameRecordSize); + const unsigned char *string = table + string_offset + offset; + strings[i] = readName(idStatus[i] != Apple, string, length); + } + + out.name = strings[0]; + out.style = strings[1]; + out.preferredName = strings[2]; + out.preferredStyle = strings[3]; + return out; +} + +} // namespace + +QString getEnglishName(const QString &familyName, bool includeStyle = false) +{ + QString i18n_name; + QString faceName = familyName; + faceName.truncate(LF_FACESIZE - 1); + + HDC hdc = GetDC( 0 ); + LOGFONT lf; + memset(&lf, 0, sizeof(LOGFONT)); + faceName.toWCharArray(lf.lfFaceName); + lf.lfFaceName[faceName.size()] = 0; + lf.lfCharSet = DEFAULT_CHARSET; + HFONT hfont = CreateFontIndirect(&lf); + + if (!hfont) { + ReleaseDC(0, hdc); + return QString(); + } + + HGDIOBJ oldobj = SelectObject( hdc, hfont ); + + const DWORD name_tag = MAKE_TAG( 'n', 'a', 'm', 'e' ); + + // get the name table + unsigned char *table = 0; + + DWORD bytes = GetFontData( hdc, name_tag, 0, 0, 0 ); + if ( bytes == GDI_ERROR ) { + // ### Unused variable + // int err = GetLastError(); + goto error; + } + + table = new unsigned char[bytes]; + GetFontData(hdc, name_tag, 0, table, bytes); + if ( bytes == GDI_ERROR ) + goto error; + + { + const FontNames names = getCanonicalFontNames(table, bytes); + i18n_name = names.name; + if (includeStyle) + i18n_name += QLatin1Char(' ') + names.style; + } +error: + delete [] table; + SelectObject( hdc, oldobj ); + DeleteObject( hfont ); + ReleaseDC( 0, hdc ); + + //qDebug("got i18n name of '%s' for font '%s'", i18n_name.latin1(), familyName.toLocal8Bit().data()); + return i18n_name; +} + +static bool addFontToDatabase(const QString &familyName, const QString &styleName, uchar charSet, + const TEXTMETRIC *textmetric, + const FONTSIGNATURE *signature, + int type, + bool registerAlias) +{ + // the "@family" fonts are just the same as "family". Ignore them. + if (familyName.isEmpty() || familyName.at(0) == QLatin1Char('@') || familyName.startsWith(QLatin1String("WST_"))) + return false; + + static const int SMOOTH_SCALABLE = 0xffff; + const QString foundryName; // No such concept. + const bool fixed = !(textmetric->tmPitchAndFamily & TMPF_FIXED_PITCH); + const bool ttf = (textmetric->tmPitchAndFamily & TMPF_TRUETYPE); + const bool scalable = textmetric->tmPitchAndFamily & (TMPF_VECTOR|TMPF_TRUETYPE); + const int size = scalable ? SMOOTH_SCALABLE : textmetric->tmHeight; + const QFont::Style style = textmetric->tmItalic ? QFont::StyleItalic : QFont::StyleNormal; + const bool antialias = false; + const QFont::Weight weight = QPlatformFontDatabase::weightFromInteger(textmetric->tmWeight); + const QFont::Stretch stretch = QFont::Unstretched; + +#ifndef QT_NO_DEBUG_OUTPUT + if (lcQpaFonts().isDebugEnabled()) { + QString message; + QTextStream str(&message); + str << __FUNCTION__ << ' ' << familyName << ' ' << charSet << " TTF=" << ttf; + if (type & DEVICE_FONTTYPE) + str << " DEVICE"; + if (type & RASTER_FONTTYPE) + str << " RASTER"; + if (type & TRUETYPE_FONTTYPE) + str << " TRUETYPE"; + str << " scalable=" << scalable << " Size=" << size + << " Style=" << style << " Weight=" << weight + << " stretch=" << stretch; + qCDebug(lcQpaFonts) << message; + } +#endif + + QString englishName; + if (registerAlias && ttf && localizedName(familyName)) + englishName = getEnglishName(familyName); + + QSupportedWritingSystems writingSystems; + if (type & TRUETYPE_FONTTYPE) { + Q_ASSERT(signature); + quint32 unicodeRange[4] = { + signature->fsUsb[0], signature->fsUsb[1], + signature->fsUsb[2], signature->fsUsb[3] + }; + quint32 codePageRange[2] = { + signature->fsCsb[0], signature->fsCsb[1] + }; + writingSystems = QPlatformFontDatabase::writingSystemsFromTrueTypeBits(unicodeRange, codePageRange); + // ### Hack to work around problem with Thai text on Windows 7. Segoe UI contains + // the symbol for Baht, and Windows thus reports that it supports the Thai script. + // Since it's the default UI font on this platform, most widgets will be unable to + // display Thai text by default. As a temporary work around, we special case Segoe UI + // and remove the Thai script from its list of supported writing systems. + if (writingSystems.supported(QFontDatabase::Thai) && + familyName == QLatin1String("Segoe UI")) + writingSystems.setSupported(QFontDatabase::Thai, false); + } else { + const QFontDatabase::WritingSystem ws = writingSystemFromCharSet(charSet); + if (ws != QFontDatabase::Any) + writingSystems.setSupported(ws); + } + + QPlatformFontDatabase::registerFont(familyName, styleName, foundryName, weight, + style, stretch, antialias, scalable, size, fixed, writingSystems, 0); + // add fonts windows can generate for us: + if (weight <= QFont::DemiBold && styleName.isEmpty()) + QPlatformFontDatabase::registerFont(familyName, QString(), foundryName, QFont::Bold, + style, stretch, antialias, scalable, size, fixed, writingSystems, 0); + if (style != QFont::StyleItalic && styleName.isEmpty()) + QPlatformFontDatabase::registerFont(familyName, QString(), foundryName, weight, + QFont::StyleItalic, stretch, antialias, scalable, size, fixed, writingSystems, 0); + if (weight <= QFont::DemiBold && style != QFont::StyleItalic && styleName.isEmpty()) + QPlatformFontDatabase::registerFont(familyName, QString(), foundryName, QFont::Bold, + QFont::StyleItalic, stretch, antialias, scalable, size, fixed, writingSystems, 0); + + if (!englishName.isEmpty()) + QPlatformFontDatabase::registerAliasToFontFamily(familyName, englishName); + + return true; +} + +static int QT_WIN_CALLBACK storeFont(const LOGFONT *logFont, const TEXTMETRIC *textmetric, + DWORD type, LPARAM lParam) +{ + const ENUMLOGFONTEX *f = reinterpret_cast(logFont); + const QString familyName = QString::fromWCharArray(f->elfLogFont.lfFaceName); + const QString styleName = QString::fromWCharArray(f->elfStyle); + const uchar charSet = f->elfLogFont.lfCharSet; + const bool registerAlias = bool(lParam); + + // NEWTEXTMETRICEX (passed for TT fonts) is a NEWTEXTMETRIC, which according + // to the documentation is identical to a TEXTMETRIC except for the last four + // members, which we don't use anyway + const FONTSIGNATURE *signature = Q_NULLPTR; + if (type & TRUETYPE_FONTTYPE) + signature = &reinterpret_cast(textmetric)->ntmFontSig; + addFontToDatabase(familyName, styleName, charSet, textmetric, signature, type, registerAlias); + + // keep on enumerating + return 1; +} + +void QWindowsFontDatabase::populateFamily(const QString &familyName, bool registerAlias) +{ + qCDebug(lcQpaFonts) << familyName; + if (familyName.size() >= LF_FACESIZE) { + qCWarning(lcQpaFonts) << "Unable to enumerate family '" << familyName << '\''; + return; + } + HDC dummy = GetDC(0); + LOGFONT lf; + lf.lfCharSet = DEFAULT_CHARSET; + familyName.toWCharArray(lf.lfFaceName); + lf.lfFaceName[familyName.size()] = 0; + lf.lfPitchAndFamily = 0; + EnumFontFamiliesEx(dummy, &lf, storeFont, LPARAM(registerAlias), 0); + ReleaseDC(0, dummy); +} + +void QWindowsFontDatabase::populateFamily(const QString &familyName) +{ + populateFamily(familyName, false); +} + +namespace { +// Context for enumerating system fonts, records whether the default font has been encountered, +// which is normally not enumerated by EnumFontFamiliesEx(). +struct PopulateFamiliesContext +{ + PopulateFamiliesContext(const QString &f) : systemDefaultFont(f), seenSystemDefaultFont(false) {} + + QString systemDefaultFont; + bool seenSystemDefaultFont; +}; +} // namespace + +static int QT_WIN_CALLBACK populateFontFamilies(const LOGFONT *logFont, const TEXTMETRIC *textmetric, + DWORD, LPARAM lparam) +{ + // the "@family" fonts are just the same as "family". Ignore them. + const ENUMLOGFONTEX *f = reinterpret_cast(logFont); + const wchar_t *faceNameW = f->elfLogFont.lfFaceName; + if (faceNameW[0] && faceNameW[0] != L'@' && wcsncmp(faceNameW, L"WST_", 4)) { + const QString faceName = QString::fromWCharArray(faceNameW); + QPlatformFontDatabase::registerFontFamily(faceName); + PopulateFamiliesContext *context = reinterpret_cast(lparam); + if (!context->seenSystemDefaultFont && faceName == context->systemDefaultFont) + context->seenSystemDefaultFont = true; + + // Register current font's english name as alias + const bool ttf = textmetric->tmPitchAndFamily & TMPF_TRUETYPE; + if (ttf && localizedName(faceName)) { + const QString englishName = getEnglishName(faceName); + if (!englishName.isEmpty()) { + QPlatformFontDatabase::registerAliasToFontFamily(faceName, englishName); + // Check whether the system default font name is an alias of the current font family name, + // as on Chinese Windows, where the system font "SimSun" is an alias to a font registered under a local name + if (!context->seenSystemDefaultFont && englishName == context->systemDefaultFont) + context->seenSystemDefaultFont = true; + } + } + } + return 1; // continue +} + +void QWindowsFontDatabase::populateFontDatabase() +{ + removeApplicationFonts(); + HDC dummy = GetDC(0); + LOGFONT lf; + lf.lfCharSet = DEFAULT_CHARSET; + lf.lfFaceName[0] = 0; + lf.lfPitchAndFamily = 0; + PopulateFamiliesContext context(QWindowsFontDatabase::systemDefaultFont().family()); + EnumFontFamiliesEx(dummy, &lf, populateFontFamilies, reinterpret_cast(&context), 0); + ReleaseDC(0, dummy); + // Work around EnumFontFamiliesEx() not listing the system font. + if (!context.seenSystemDefaultFont) + QPlatformFontDatabase::registerFontFamily(context.systemDefaultFont); +} + +typedef QSharedPointer QWindowsFontEngineDataPtr; + +#ifndef QT_NO_THREAD +typedef QThreadStorage FontEngineThreadLocalData; + +Q_GLOBAL_STATIC(FontEngineThreadLocalData, fontEngineThreadLocalData) + +QSharedPointer sharedFontData() +{ + FontEngineThreadLocalData *data = fontEngineThreadLocalData(); + if (!data->hasLocalData()) + data->setLocalData(QSharedPointer::create()); + return data->localData(); +} +#else // !QT_NO_THREAD +Q_GLOBAL_STATIC(QWindowsFontEngineDataPtr, fontEngineData) + +QWindowsFontEngineDataPtr sharedFontData() +{ + QWindowsFontEngineDataPtr *data = fontEngineData(); + if (data->isNull()) + *data = QWindowsFontEngineDataPtr::create(); + return *data; +} +#endif // QT_NO_THREAD + +extern Q_GUI_EXPORT bool qt_needs_a8_gamma_correction; + +QWindowsFontDatabase::QWindowsFontDatabase() +{ + // Properties accessed by QWin32PrintEngine (Qt Print Support) + static const int hfontMetaTypeId = qRegisterMetaType(); + static const int logFontMetaTypeId = qRegisterMetaType(); + Q_UNUSED(hfontMetaTypeId) + Q_UNUSED(logFontMetaTypeId) + + if (lcQpaFonts().isDebugEnabled()) { + const QWindowsFontEngineDataPtr data = sharedFontData(); + qCDebug(lcQpaFonts) << __FUNCTION__ << "Clear type: " + << data->clearTypeEnabled << "gamma: " << data->fontSmoothingGamma; + } + qt_needs_a8_gamma_correction = true; +} + +QWindowsFontDatabase::~QWindowsFontDatabase() +{ + removeApplicationFonts(); +} + +QFontEngineMulti *QWindowsFontDatabase::fontEngineMulti(QFontEngine *fontEngine, QChar::Script script) +{ + return new QWindowsMultiFontEngine(fontEngine, script); +} + +QFontEngine * QWindowsFontDatabase::fontEngine(const QFontDef &fontDef, void *handle) +{ + QFontEngine *fe = QWindowsFontDatabase::createEngine(fontDef, + defaultVerticalDPI(), + sharedFontData()); + qCDebug(lcQpaFonts) << __FUNCTION__ << "FONTDEF" << fontDef << fe << handle; + return fe; +} + +QFontEngine *QWindowsFontDatabase::fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference) +{ + EmbeddedFont font(fontData); + QFontEngine *fontEngine = 0; + +#if !defined(QT_NO_DIRECTWRITE) + if (!useDirectWrite(hintingPreference)) +#endif + { + GUID guid; + CoCreateGuid(&guid); + +QT_WARNING_PUSH +QT_WARNING_DISABLE_GCC("-Wstrict-aliasing") + QString uniqueFamilyName = QLatin1Char('f') + + QString::number(guid.Data1, 36) + QLatin1Char('-') + + QString::number(guid.Data2, 36) + QLatin1Char('-') + + QString::number(guid.Data3, 36) + QLatin1Char('-') + + QString::number(*reinterpret_cast(guid.Data4), 36); +QT_WARNING_POP + + QString actualFontName = font.changeFamilyName(uniqueFamilyName); + if (actualFontName.isEmpty()) { + qWarning("%s: Can't change family name of font", __FUNCTION__); + return 0; + } + + DWORD count = 0; + QByteArray newFontData = font.data(); + HANDLE fontHandle = + AddFontMemResourceEx(const_cast(newFontData.constData()), + DWORD(newFontData.size()), 0, &count); + if (count == 0 && fontHandle != 0) { + RemoveFontMemResourceEx(fontHandle); + fontHandle = 0; + } + + if (fontHandle == 0) { + qWarning("%s: AddFontMemResourceEx failed", __FUNCTION__); + } else { + QFontDef request; + request.family = uniqueFamilyName; + request.pixelSize = pixelSize; + request.styleStrategy = QFont::PreferMatch; + request.hintingPreference = hintingPreference; + request.stretch = QFont::Unstretched; + + fontEngine = QWindowsFontDatabase::createEngine(request, + defaultVerticalDPI(), + sharedFontData()); + + if (fontEngine) { + if (request.family != fontEngine->fontDef.family) { + qWarning("%s: Failed to load font. Got fallback instead: %s", + __FUNCTION__, qPrintable(fontEngine->fontDef.family)); + if (fontEngine->ref.load() == 0) + delete fontEngine; + fontEngine = 0; + } else { + Q_ASSERT(fontEngine->ref.load() == 0); + + // Override the generated font name + switch (fontEngine->type()) { + case QFontEngine::Win: + static_cast(fontEngine)->setUniqueFamilyName(uniqueFamilyName); + fontEngine->fontDef.family = actualFontName; + break; + +#if !defined(QT_NO_DIRECTWRITE) + case QFontEngine::DirectWrite: + static_cast(fontEngine)->setUniqueFamilyName(uniqueFamilyName); + fontEngine->fontDef.family = actualFontName; + break; +#endif // !QT_NO_DIRECTWRITE + + default: + Q_ASSERT_X(false, Q_FUNC_INFO, "Unhandled font engine."); + } + + UniqueFontData uniqueData; + uniqueData.handle = fontHandle; + uniqueData.refCount.ref(); + m_uniqueFontData[uniqueFamilyName] = uniqueData; + } + } else { + RemoveFontMemResourceEx(fontHandle); + } + } + } +#if !defined(QT_NO_DIRECTWRITE) + else { + CustomFontFileLoader fontFileLoader; + fontFileLoader.addKey(this, fontData); + + QSharedPointer fontEngineData = sharedFontData(); + if (!initDirectWrite(fontEngineData.data())) + return 0; + + IDWriteFontFile *fontFile = 0; + void *key = this; + + HRESULT hres = fontEngineData->directWriteFactory->CreateCustomFontFileReference(&key, + sizeof(void *), + fontFileLoader.loader(), + &fontFile); + if (FAILED(hres)) { + qErrnoWarning(hres, "%s: CreateCustomFontFileReference failed", __FUNCTION__); + return 0; + } + + BOOL isSupportedFontType; + DWRITE_FONT_FILE_TYPE fontFileType; + DWRITE_FONT_FACE_TYPE fontFaceType; + UINT32 numberOfFaces; + fontFile->Analyze(&isSupportedFontType, &fontFileType, &fontFaceType, &numberOfFaces); + if (!isSupportedFontType) { + fontFile->Release(); + return 0; + } + + IDWriteFontFace *directWriteFontFace = 0; + hres = fontEngineData->directWriteFactory->CreateFontFace(fontFaceType, + 1, + &fontFile, + 0, + DWRITE_FONT_SIMULATIONS_NONE, + &directWriteFontFace); + if (FAILED(hres)) { + qErrnoWarning(hres, "%s: CreateFontFace failed", __FUNCTION__); + fontFile->Release(); + return 0; + } + + fontFile->Release(); + + fontEngine = new QWindowsFontEngineDirectWrite(directWriteFontFace, + pixelSize, + fontEngineData); + + // Get font family from font data + fontEngine->fontDef.family = font.familyName(); + fontEngine->fontDef.hintingPreference = hintingPreference; + + directWriteFontFace->Release(); + } +#endif + + // Get style and weight info + if (fontEngine != 0) { + TableDirectory *os2TableEntry = font.tableDirectoryEntry("OS/2"); + if (os2TableEntry != 0) { + const OS2Table *os2Table = + reinterpret_cast(fontData.constData() + + qFromBigEndian(os2TableEntry->offset)); + + bool italic = qFromBigEndian(os2Table->selection) & 1; + bool oblique = qFromBigEndian(os2Table->selection) & 128; + + if (italic) + fontEngine->fontDef.style = QFont::StyleItalic; + else if (oblique) + fontEngine->fontDef.style = QFont::StyleOblique; + else + fontEngine->fontDef.style = QFont::StyleNormal; + + fontEngine->fontDef.weight = QPlatformFontDatabase::weightFromInteger(qFromBigEndian(os2Table->weightClass)); + } + } + + qCDebug(lcQpaFonts) << __FUNCTION__ << "FONTDATA" << fontData << pixelSize << hintingPreference << fontEngine; + return fontEngine; +} + +static QList getTrueTypeFontOffsets(const uchar *fontData) +{ + QList offsets; + const quint32 headerTag = *reinterpret_cast(fontData); + if (headerTag != MAKE_TAG('t', 't', 'c', 'f')) { + if (headerTag != MAKE_TAG(0, 1, 0, 0) + && headerTag != MAKE_TAG('O', 'T', 'T', 'O') + && headerTag != MAKE_TAG('t', 'r', 'u', 'e') + && headerTag != MAKE_TAG('t', 'y', 'p', '1')) + return offsets; + offsets << 0; + return offsets; + } + const quint32 numFonts = qFromBigEndian(fontData + 8); + for (uint i = 0; i < numFonts; ++i) { + offsets << qFromBigEndian(fontData + 12 + i * 4); + } + return offsets; +} + +static void getFontTable(const uchar *fileBegin, const uchar *data, quint32 tag, const uchar **table, quint32 *length) +{ + const quint16 numTables = qFromBigEndian(data + 4); + for (uint i = 0; i < numTables; ++i) { + const quint32 offset = 12 + 16 * i; + if (*reinterpret_cast(data + offset) == tag) { + *table = fileBegin + qFromBigEndian(data + offset + 8); + *length = qFromBigEndian(data + offset + 12); + return; + } + } + *table = 0; + *length = 0; + return; +} + +static void getFamiliesAndSignatures(const QByteArray &fontData, + QList *families, + QVector *signatures) +{ + const uchar *data = reinterpret_cast(fontData.constData()); + + QList offsets = getTrueTypeFontOffsets(data); + if (offsets.isEmpty()) + return; + + for (int i = 0; i < offsets.count(); ++i) { + const uchar *font = data + offsets.at(i); + const uchar *table; + quint32 length; + getFontTable(data, font, MAKE_TAG('n', 'a', 'm', 'e'), &table, &length); + if (!table) + continue; + FontNames names = getCanonicalFontNames(table, length); + if (names.name.isEmpty()) + continue; + + families->append(qMove(names)); + + if (signatures) { + FONTSIGNATURE signature; + getFontTable(data, font, MAKE_TAG('O', 'S', '/', '2'), &table, &length); + if (table && length >= 86) { + // Offsets taken from OS/2 table in the TrueType spec + signature.fsUsb[0] = qFromBigEndian(table + 42); + signature.fsUsb[1] = qFromBigEndian(table + 46); + signature.fsUsb[2] = qFromBigEndian(table + 50); + signature.fsUsb[3] = qFromBigEndian(table + 54); + + signature.fsCsb[0] = qFromBigEndian(table + 78); + signature.fsCsb[1] = qFromBigEndian(table + 82); + } else { + memset(&signature, 0, sizeof(signature)); + } + signatures->append(signature); + } + } +} + +QStringList QWindowsFontDatabase::addApplicationFont(const QByteArray &fontData, const QString &fileName) +{ + WinApplicationFont font; + font.fileName = fileName; + QVector signatures; + QList families; + QStringList familyNames; + + if (!fontData.isEmpty()) { + getFamiliesAndSignatures(fontData, &families, &signatures); + if (families.isEmpty()) + return familyNames; + + DWORD dummy = 0; + font.handle = + AddFontMemResourceEx(const_cast(fontData.constData()), + DWORD(fontData.size()), 0, &dummy); + if (font.handle == 0) + return QStringList(); + + // Memory fonts won't show up in enumeration, so do add them the hard way. + for (int j = 0; j < families.count(); ++j) { + const QString familyName = families.at(j).name; + const QString styleName = families.at(j).style; + familyNames << familyName; + HDC hdc = GetDC(0); + LOGFONT lf; + memset(&lf, 0, sizeof(LOGFONT)); + memcpy(lf.lfFaceName, familyName.utf16(), sizeof(wchar_t) * qMin(LF_FACESIZE - 1, familyName.size())); + lf.lfCharSet = DEFAULT_CHARSET; + HFONT hfont = CreateFontIndirect(&lf); + HGDIOBJ oldobj = SelectObject(hdc, hfont); + + TEXTMETRIC textMetrics; + GetTextMetrics(hdc, &textMetrics); + + addFontToDatabase(familyName, styleName, lf.lfCharSet, &textMetrics, &signatures.at(j), + TRUETYPE_FONTTYPE, true); + + SelectObject(hdc, oldobj); + DeleteObject(hfont); + ReleaseDC(0, hdc); + } + } else { + QFile f(fileName); + if (!f.open(QIODevice::ReadOnly)) + return QStringList(); + QByteArray data = f.readAll(); + f.close(); + + getFamiliesAndSignatures(data, &families, 0); + if (families.isEmpty()) + return QStringList(); + + if (AddFontResourceExW((wchar_t*)fileName.utf16(), FR_PRIVATE, 0) == 0) + return QStringList(); + + font.handle = 0; + + // Fonts based on files are added via populate, as they will show up in font enumeration. + for (int j = 0; j < families.count(); ++j) { + const QString familyName = families.at(j).name; + familyNames << familyName; + populateFamily(familyName, true); + } + } + + m_applicationFonts << font; + + return familyNames; +} + +void QWindowsFontDatabase::removeApplicationFonts() +{ + foreach (const WinApplicationFont &font, m_applicationFonts) { + if (font.handle) { + RemoveFontMemResourceEx(font.handle); + } else { + RemoveFontResourceExW((LPCWSTR)font.fileName.utf16(), FR_PRIVATE, 0); + } + } + m_applicationFonts.clear(); +} + +void QWindowsFontDatabase::releaseHandle(void * /* handle */) +{ +} + +QString QWindowsFontDatabase::fontDir() const +{ + const QString result = QPlatformFontDatabase::fontDir(); + qCDebug(lcQpaFonts) << __FUNCTION__ << result; + return result; +} + +bool QWindowsFontDatabase::fontsAlwaysScalable() const +{ + return true; +} + +void QWindowsFontDatabase::derefUniqueFont(const QString &uniqueFont) +{ + if (m_uniqueFontData.contains(uniqueFont)) { + if (!m_uniqueFontData[uniqueFont].refCount.deref()) { + RemoveFontMemResourceEx(m_uniqueFontData[uniqueFont].handle); + m_uniqueFontData.remove(uniqueFont); + } + } +} + +void QWindowsFontDatabase::refUniqueFont(const QString &uniqueFont) +{ + if (m_uniqueFontData.contains(uniqueFont)) + m_uniqueFontData[uniqueFont].refCount.ref(); +} + +HFONT QWindowsFontDatabase::systemFont() +{ + static const HFONT stock_sysfont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); + return stock_sysfont; +} + +// Creation functions + +static const char *other_tryFonts[] = { + "Arial", + "MS UI Gothic", + "Gulim", + "SimSun", + "PMingLiU", + "Arial Unicode MS", + 0 +}; + +static const char *jp_tryFonts [] = { + "MS UI Gothic", + "Arial", + "Gulim", + "SimSun", + "PMingLiU", + "Arial Unicode MS", + 0 +}; + +static const char *ch_CN_tryFonts [] = { + "SimSun", + "Arial", + "PMingLiU", + "Gulim", + "MS UI Gothic", + "Arial Unicode MS", + 0 +}; + +static const char *ch_TW_tryFonts [] = { + "PMingLiU", + "Arial", + "SimSun", + "Gulim", + "MS UI Gothic", + "Arial Unicode MS", + 0 +}; + +static const char *kr_tryFonts[] = { + "Gulim", + "Arial", + "PMingLiU", + "SimSun", + "MS UI Gothic", + "Arial Unicode MS", + 0 +}; + +static const char **tryFonts = 0; + +LOGFONT QWindowsFontDatabase::fontDefToLOGFONT(const QFontDef &request) +{ + LOGFONT lf; + memset(&lf, 0, sizeof(LOGFONT)); + + lf.lfHeight = -qRound(request.pixelSize); + lf.lfWidth = 0; + lf.lfEscapement = 0; + lf.lfOrientation = 0; + if (request.weight == 50) + lf.lfWeight = FW_DONTCARE; + else + lf.lfWeight = (request.weight*900)/99; + lf.lfItalic = request.style != QFont::StyleNormal; + lf.lfCharSet = DEFAULT_CHARSET; + + int strat = OUT_DEFAULT_PRECIS; + if (request.styleStrategy & QFont::PreferBitmap) { + strat = OUT_RASTER_PRECIS; + } else if (request.styleStrategy & QFont::PreferDevice) { + strat = OUT_DEVICE_PRECIS; + } else if (request.styleStrategy & QFont::PreferOutline) { + strat = OUT_OUTLINE_PRECIS; + } else if (request.styleStrategy & QFont::ForceOutline) { + strat = OUT_TT_ONLY_PRECIS; + } + + lf.lfOutPrecision = strat; + + int qual = DEFAULT_QUALITY; + + if (request.styleStrategy & QFont::PreferMatch) + qual = DRAFT_QUALITY; + else if (request.styleStrategy & QFont::PreferQuality) + qual = PROOF_QUALITY; + + if (request.styleStrategy & QFont::PreferAntialias) { + if (QSysInfo::WindowsVersion >= QSysInfo::WV_XP && !(request.styleStrategy & QFont::NoSubpixelAntialias)) { + qual = CLEARTYPE_QUALITY; + } else { + qual = ANTIALIASED_QUALITY; + } + } else if (request.styleStrategy & QFont::NoAntialias) { + qual = NONANTIALIASED_QUALITY; + } else if ((request.styleStrategy & QFont::NoSubpixelAntialias) && sharedFontData()->clearTypeEnabled) { + qual = ANTIALIASED_QUALITY; + } + + lf.lfQuality = qual; + + lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; + + int hint = FF_DONTCARE; + switch (request.styleHint) { + case QFont::Helvetica: + hint = FF_SWISS; + break; + case QFont::Times: + hint = FF_ROMAN; + break; + case QFont::Courier: + hint = FF_MODERN; + break; + case QFont::OldEnglish: + hint = FF_DECORATIVE; + break; + case QFont::System: + hint = FF_MODERN; + break; + default: + break; + } + + lf.lfPitchAndFamily = DEFAULT_PITCH | hint; + + QString fam = request.family; + if (Q_UNLIKELY(fam.size() >= LF_FACESIZE)) { + qCritical("%s: Family name '%s' is too long.", __FUNCTION__, qPrintable(fam)); + fam.truncate(LF_FACESIZE - 1); + } + + if (fam.isEmpty()) + fam = QStringLiteral("MS Sans Serif"); + + if (fam == QLatin1String("MS Sans Serif") + && (request.style == QFont::StyleItalic || (-lf.lfHeight > 18 && -lf.lfHeight != 24))) { + fam = QStringLiteral("Arial"); // MS Sans Serif has bearing problems in italic, and does not scale + } + if (fam == QLatin1String("Courier") && !(request.styleStrategy & QFont::PreferBitmap)) + fam = QStringLiteral("Courier New"); + + memcpy(lf.lfFaceName, fam.utf16(), fam.size() * sizeof(wchar_t)); + + return lf; +} + +QStringList QWindowsFontDatabase::extraTryFontsForFamily(const QString &family) +{ + QStringList result; + QFontDatabase db; + if (!db.writingSystems(family).contains(QFontDatabase::Symbol)) { + if (!tryFonts) { + LANGID lid = GetUserDefaultLangID(); + switch (lid&0xff) { + case LANG_CHINESE: // Chinese + if ( lid == 0x0804 || lid == 0x1004) // China mainland and Singapore + tryFonts = ch_CN_tryFonts; + else + tryFonts = ch_TW_tryFonts; // Taiwan, Hong Kong and Macau + break; + case LANG_JAPANESE: + tryFonts = jp_tryFonts; + break; + case LANG_KOREAN: + tryFonts = kr_tryFonts; + break; + default: + tryFonts = other_tryFonts; + break; + } + } + QFontDatabase db; + const QStringList families = db.families(); + const char **tf = tryFonts; + while (tf && *tf) { + // QTBUG-31689, family might be an English alias for a localized font name. + const QString family = QString::fromLatin1(*tf); + if (families.contains(family) || db.hasFamily(family)) + result << family; + ++tf; + } + } + result.append(QStringLiteral("Segoe UI Emoji")); + result.append(QStringLiteral("Segoe UI Symbol")); + return result; +} + +QString QWindowsFontDatabase::familyForStyleHint(QFont::StyleHint styleHint) +{ + switch (styleHint) { + case QFont::Times: + return QStringLiteral("Times New Roman"); + case QFont::Courier: + return QStringLiteral("Courier New"); + case QFont::Monospace: + return QStringLiteral("Courier New"); + case QFont::Cursive: + return QStringLiteral("Comic Sans MS"); + case QFont::Fantasy: + return QStringLiteral("Impact"); + case QFont::Decorative: + return QStringLiteral("Old English"); + case QFont::Helvetica: + return QStringLiteral("Arial"); + case QFont::System: + default: + break; + } + return QStringLiteral("MS Shell Dlg 2"); +} + +QStringList QWindowsFontDatabase::fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const +{ + QStringList result; + result.append(QWindowsFontDatabase::familyForStyleHint(styleHint)); + result.append(QWindowsFontDatabase::extraTryFontsForFamily(family)); + result.append(QPlatformFontDatabase::fallbacksForFamily(family, style, styleHint, script)); + + qCDebug(lcQpaFonts) << __FUNCTION__ << family << style << styleHint + << script << result; + return result; +} + + +QFontEngine *QWindowsFontDatabase::createEngine(const QFontDef &request, + int dpi, + const QSharedPointer &data) +{ + QFontEngine *fe = 0; + + LOGFONT lf = fontDefToLOGFONT(request); + const bool preferClearTypeAA = lf.lfQuality == CLEARTYPE_QUALITY; + + if (request.stretch != 100) { + HFONT hfont = CreateFontIndirect(&lf); + if (!hfont) { + qErrnoWarning("%s: CreateFontIndirect failed", __FUNCTION__); + hfont = QWindowsFontDatabase::systemFont(); + } + + HGDIOBJ oldObj = SelectObject(data->hdc, hfont); + TEXTMETRIC tm; + if (!GetTextMetrics(data->hdc, &tm)) + qErrnoWarning("%s: GetTextMetrics failed", __FUNCTION__); + else + lf.lfWidth = tm.tmAveCharWidth * request.stretch / 100; + SelectObject(data->hdc, oldObj); + + DeleteObject(hfont); + } + +#if !defined(QT_NO_DIRECTWRITE) + if (initDirectWrite(data.data())) { + const QString fam = QString::fromWCharArray(lf.lfFaceName); + const QString nameSubstitute = QWindowsFontEngineDirectWrite::fontNameSubstitute(fam); + if (nameSubstitute != fam) { + const int nameSubstituteLength = qMin(nameSubstitute.length(), LF_FACESIZE - 1); + memcpy(lf.lfFaceName, nameSubstitute.utf16(), nameSubstituteLength * sizeof(wchar_t)); + lf.lfFaceName[nameSubstituteLength] = 0; + } + + HFONT hfont = CreateFontIndirect(&lf); + if (!hfont) { + qErrnoWarning("%s: CreateFontIndirect failed", __FUNCTION__); + } else { + HGDIOBJ oldFont = SelectObject(data->hdc, hfont); + + IDWriteFontFace *directWriteFontFace = NULL; + HRESULT hr = data->directWriteGdiInterop->CreateFontFaceFromHdc(data->hdc, &directWriteFontFace); + if (FAILED(hr)) { + const QString errorString = qt_error_string(int(hr)); + qWarning().noquote().nospace() << "DirectWrite: CreateFontFaceFromHDC() failed (" + << errorString << ") for " << request << ' ' << lf << " dpi=" << dpi; + } else { + bool isColorFont = false; +#if defined(QT_USE_DIRECTWRITE2) + IDWriteFontFace2 *directWriteFontFace2 = Q_NULLPTR; + if (SUCCEEDED(directWriteFontFace->QueryInterface(__uuidof(IDWriteFontFace2), + reinterpret_cast(&directWriteFontFace2)))) { + if (directWriteFontFace2->IsColorFont()) + isColorFont = directWriteFontFace2->GetPaletteEntryCount() > 0; + } +#endif + const QFont::HintingPreference hintingPreference = + static_cast(request.hintingPreference); + const bool useDw = useDirectWrite(hintingPreference, fam, isColorFont); + qCDebug(lcQpaFonts) << __FUNCTION__ << request.family << request.pointSize + << "pt" << "hintingPreference=" << hintingPreference << "color=" << isColorFont + << dpi << "dpi" << "useDirectWrite=" << useDw; + if (useDw) { + QWindowsFontEngineDirectWrite *fedw = new QWindowsFontEngineDirectWrite(directWriteFontFace, + request.pixelSize, + data); + + wchar_t n[64]; + GetTextFace(data->hdc, 64, n); + + QFontDef fontDef = request; + fontDef.family = QString::fromWCharArray(n); + + if (isColorFont) + fedw->glyphFormat = QFontEngine::Format_ARGB; + fedw->initFontInfo(fontDef, dpi); + fe = fedw; + } else { + directWriteFontFace->Release(); + } + } + + SelectObject(data->hdc, oldFont); + DeleteObject(hfont); + } + } +#endif // QT_NO_DIRECTWRITE + + if (!fe) { + QWindowsFontEngine *few = new QWindowsFontEngine(request.family, lf, data); + if (preferClearTypeAA) + few->glyphFormat = QFontEngine::Format_A32; + few->initFontInfo(request, dpi); + fe = few; + } + + return fe; +} + +QFont QWindowsFontDatabase::systemDefaultFont() +{ + LOGFONT lf; + GetObject(QWindowsFontDatabase::systemFont(), sizeof(lf), &lf); + QFont systemFont = QWindowsFontDatabase::LOGFONT_to_QFont(lf); + // "MS Shell Dlg 2" is the correct system font >= Win2k + if (systemFont.family() == QLatin1String("MS Shell Dlg")) + systemFont.setFamily(QStringLiteral("MS Shell Dlg 2")); + qCDebug(lcQpaFonts) << __FUNCTION__ << systemFont; + return systemFont; +} + +QFont QWindowsFontDatabase::LOGFONT_to_QFont(const LOGFONT& logFont, int verticalDPI_In) +{ + if (verticalDPI_In <= 0) + verticalDPI_In = defaultVerticalDPI(); + QFont qFont(QString::fromWCharArray(logFont.lfFaceName)); + qFont.setItalic(logFont.lfItalic); + if (logFont.lfWeight != FW_DONTCARE) + qFont.setWeight(QPlatformFontDatabase::weightFromInteger(logFont.lfWeight)); + const qreal logFontHeight = qAbs(logFont.lfHeight); + qFont.setPointSizeF(logFontHeight * 72.0 / qreal(verticalDPI_In)); + qFont.setUnderline(logFont.lfUnderline); + qFont.setOverline(false); + qFont.setStrikeOut(logFont.lfStrikeOut); + return qFont; +} + +int QWindowsFontDatabase::defaultVerticalDPI() +{ + static int vDPI = -1; + if (vDPI == -1) { + if (HDC defaultDC = GetDC(0)) { + vDPI = GetDeviceCaps(defaultDC, LOGPIXELSY); + ReleaseDC(0, defaultDC); + } else { + // FIXME: Resolve now or return 96 and keep unresolved? + vDPI = 96; + } + } + return vDPI; +} + +QT_END_NAMESPACE diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp new file mode 100644 index 0000000000..4d973bbf17 --- /dev/null +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp @@ -0,0 +1,437 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwindowsfontdatabase_ft_p.h" +#include "qwindowsfontdatabase_p.h" + +#include +#include FT_TRUETYPE_TABLES_H + +#include +#include +#include +#include +#include +#include +#include + +#include + +QT_BEGIN_NAMESPACE + +static inline QFontDatabase::WritingSystem writingSystemFromCharSet(uchar charSet) +{ + switch (charSet) { + case ANSI_CHARSET: + case EASTEUROPE_CHARSET: + case BALTIC_CHARSET: + case TURKISH_CHARSET: + return QFontDatabase::Latin; + case GREEK_CHARSET: + return QFontDatabase::Greek; + case RUSSIAN_CHARSET: + return QFontDatabase::Cyrillic; + case HEBREW_CHARSET: + return QFontDatabase::Hebrew; + case ARABIC_CHARSET: + return QFontDatabase::Arabic; + case THAI_CHARSET: + return QFontDatabase::Thai; + case GB2312_CHARSET: + return QFontDatabase::SimplifiedChinese; + case CHINESEBIG5_CHARSET: + return QFontDatabase::TraditionalChinese; + case SHIFTJIS_CHARSET: + return QFontDatabase::Japanese; + case HANGUL_CHARSET: + case JOHAB_CHARSET: + return QFontDatabase::Korean; + case VIETNAMESE_CHARSET: + return QFontDatabase::Vietnamese; + case SYMBOL_CHARSET: + return QFontDatabase::Symbol; + default: + break; + } + return QFontDatabase::Any; +} + +static FontFile * createFontFile(const QString &fileName, int index) +{ + FontFile *fontFile = new FontFile; + fontFile->fileName = fileName; + fontFile->indexValue = index; + return fontFile; +} + +extern bool localizedName(const QString &name); +extern QString getEnglishName(const QString &familyName, bool includeStyle = false); + +namespace { +struct FontKey +{ + QString fileName; + QStringList fontNames; +}; +} // namespace + +typedef QVector FontKeys; + +static FontKeys &fontKeys() +{ + static FontKeys result; + if (result.isEmpty()) { + const QSettings fontRegistry(QStringLiteral("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"), + QSettings::NativeFormat); + const QStringList allKeys = fontRegistry.allKeys(); + const QString trueType = QStringLiteral("(TrueType)"); +#ifndef QT_NO_REGULAREXPRESSION + const QRegularExpression sizeListMatch(QStringLiteral("\\s(\\d+,)+\\d+")); +#else + const QRegExp sizeListMatch(QLatin1String("\\s(\\d+,)+\\d+")); +#endif + Q_ASSERT(sizeListMatch.isValid()); + const int size = allKeys.size(); + result.reserve(size); + for (int i = 0; i < size; ++i) { + FontKey fontKey; + const QString ®istryFontKey = allKeys.at(i); + fontKey.fileName = fontRegistry.value(registryFontKey).toString(); + QString realKey = registryFontKey; + realKey.remove(trueType); + realKey.remove(sizeListMatch); + const auto fontNames = QStringRef(&realKey).trimmed().split(QLatin1Char('&')); + fontKey.fontNames.reserve(fontNames.size()); + for (const QStringRef &fontName : fontNames) + fontKey.fontNames.append(fontName.trimmed().toString()); + result.append(fontKey); + } + } + return result; +} + +static const FontKey *findFontKey(const QString &name, int *indexIn = Q_NULLPTR) +{ + const FontKeys &keys = fontKeys(); + for (auto it = keys.constBegin(), cend = keys.constEnd(); it != cend; ++it) { + const int index = it->fontNames.indexOf(name); + if (index >= 0) { + if (indexIn) + *indexIn = index; + return &(*it); + } + } + if (indexIn) + *indexIn = -1; + return Q_NULLPTR; +} + +static bool addFontToDatabase(const QString &faceName, + const QString &styleName, + const QString &fullName, + uchar charSet, + const TEXTMETRIC *textmetric, + const FONTSIGNATURE *signature, + int type, + bool registerAlias) +{ + // the "@family" fonts are just the same as "family". Ignore them. + if (faceName.isEmpty() || faceName.at(0) == QLatin1Char('@') || faceName.startsWith(QLatin1String("WST_"))) + return false; + + static const int SMOOTH_SCALABLE = 0xffff; + const QString foundryName; // No such concept. + const bool fixed = !(textmetric->tmPitchAndFamily & TMPF_FIXED_PITCH); + const bool ttf = (textmetric->tmPitchAndFamily & TMPF_TRUETYPE); + const bool scalable = textmetric->tmPitchAndFamily & (TMPF_VECTOR|TMPF_TRUETYPE); + const int size = scalable ? SMOOTH_SCALABLE : textmetric->tmHeight; + const QFont::Style style = textmetric->tmItalic ? QFont::StyleItalic : QFont::StyleNormal; + const bool antialias = false; + const QFont::Weight weight = QPlatformFontDatabase::weightFromInteger(textmetric->tmWeight); + const QFont::Stretch stretch = QFont::Unstretched; + +#ifndef QT_NO_DEBUG_STREAM + if (lcQpaFonts().isDebugEnabled()) { + QString message; + QTextStream str(&message); + str << __FUNCTION__ << ' ' << faceName << "::" << fullName << ' ' << charSet << " TTF=" << ttf; + if (type & DEVICE_FONTTYPE) + str << " DEVICE"; + if (type & RASTER_FONTTYPE) + str << " RASTER"; + if (type & TRUETYPE_FONTTYPE) + str << " TRUETYPE"; + str << " scalable=" << scalable << " Size=" << size + << " Style=" << style << " Weight=" << weight + << " stretch=" << stretch; + qCDebug(lcQpaFonts) << message; + } +#endif + + QString englishName; + if (registerAlias & ttf && localizedName(faceName)) + englishName = getEnglishName(faceName); + + QSupportedWritingSystems writingSystems; + if (type & TRUETYPE_FONTTYPE) { + Q_ASSERT(signature); + quint32 unicodeRange[4] = { + signature->fsUsb[0], signature->fsUsb[1], + signature->fsUsb[2], signature->fsUsb[3] + }; + quint32 codePageRange[2] = { + signature->fsCsb[0], signature->fsCsb[1] + }; + writingSystems = QPlatformFontDatabase::writingSystemsFromTrueTypeBits(unicodeRange, codePageRange); + // ### Hack to work around problem with Thai text on Windows 7. Segoe UI contains + // the symbol for Baht, and Windows thus reports that it supports the Thai script. + // Since it's the default UI font on this platform, most widgets will be unable to + // display Thai text by default. As a temporary work around, we special case Segoe UI + // and remove the Thai script from its list of supported writing systems. + if (writingSystems.supported(QFontDatabase::Thai) && + faceName == QLatin1String("Segoe UI")) + writingSystems.setSupported(QFontDatabase::Thai, false); + } else { + const QFontDatabase::WritingSystem ws = writingSystemFromCharSet(charSet); + if (ws != QFontDatabase::Any) + writingSystems.setSupported(ws); + } + + int index = 0; + const FontKey *key = findFontKey(fullName, &index); + if (!key) { + // On non-English locales, the styles of the font may be localized in enumeration, but + // not in the registry. + QLocale systemLocale = QLocale::system(); + if (systemLocale.language() != QLocale::C + && systemLocale.language() != QLocale::English + && styleName != QLatin1String("Italic") + && styleName != QLatin1String("Bold")) { + key = findFontKey(getEnglishName(fullName, true), &index); + } + if (!key) + key = findFontKey(faceName, &index); + if (!key && !registerAlias && englishName.isEmpty() && localizedName(faceName)) + englishName = getEnglishName(faceName); + if (!key && !englishName.isEmpty()) + key = findFontKey(englishName, &index); + if (!key) + return false; + } + QString value = key->fileName; + if (value.isEmpty()) + return false; + + if (!QDir::isAbsolutePath(value)) + value.prepend(QFile::decodeName(qgetenv("windir") + "\\Fonts\\")); + + QPlatformFontDatabase::registerFont(faceName, styleName, foundryName, weight, style, stretch, + antialias, scalable, size, fixed, writingSystems, createFontFile(value, index)); + + // add fonts windows can generate for us: + if (weight <= QFont::DemiBold && styleName.isEmpty()) + QPlatformFontDatabase::registerFont(faceName, QString(), foundryName, QFont::Bold, style, stretch, + antialias, scalable, size, fixed, writingSystems, createFontFile(value, index)); + + if (style != QFont::StyleItalic && styleName.isEmpty()) + QPlatformFontDatabase::registerFont(faceName, QString(), foundryName, weight, QFont::StyleItalic, stretch, + antialias, scalable, size, fixed, writingSystems, createFontFile(value, index)); + + if (weight <= QFont::DemiBold && style != QFont::StyleItalic && styleName.isEmpty()) + QPlatformFontDatabase::registerFont(faceName, QString(), foundryName, QFont::Bold, QFont::StyleItalic, stretch, + antialias, scalable, size, fixed, writingSystems, createFontFile(value, index)); + + if (!englishName.isEmpty()) + QPlatformFontDatabase::registerAliasToFontFamily(faceName, englishName); + + return true; +} + +static int QT_WIN_CALLBACK storeFont(const LOGFONT *logFont, const TEXTMETRIC *textmetric, + DWORD type, LPARAM) +{ + const ENUMLOGFONTEX *f = reinterpret_cast(logFont); + const QString faceName = QString::fromWCharArray(f->elfLogFont.lfFaceName); + const QString styleName = QString::fromWCharArray(f->elfStyle); + const QString fullName = QString::fromWCharArray(f->elfFullName); + const uchar charSet = f->elfLogFont.lfCharSet; + + // NEWTEXTMETRICEX (passed for TT fonts) is a NEWTEXTMETRIC, which according + // to the documentation is identical to a TEXTMETRIC except for the last four + // members, which we don't use anyway + const FONTSIGNATURE *signature = Q_NULLPTR; + if (type & TRUETYPE_FONTTYPE) + signature = &reinterpret_cast(textmetric)->ntmFontSig; + addFontToDatabase(faceName, styleName, fullName, charSet, textmetric, signature, type, false); + + // keep on enumerating + return 1; +} + +/*! + \brief Populate font database using EnumFontFamiliesEx(). + + Normally, leaving the name empty should enumerate + all fonts, however, system fonts like "MS Shell Dlg 2" + are only found when specifying the name explicitly. +*/ + +void QWindowsFontDatabaseFT::populateFamily(const QString &familyName) +{ + qCDebug(lcQpaFonts) << familyName; + if (familyName.size() >= LF_FACESIZE) { + qCWarning(lcQpaFonts) << "Unable to enumerate family '" << familyName << '\''; + return; + } + HDC dummy = GetDC(0); + LOGFONT lf; + lf.lfCharSet = DEFAULT_CHARSET; + familyName.toWCharArray(lf.lfFaceName); + lf.lfFaceName[familyName.size()] = 0; + lf.lfPitchAndFamily = 0; + EnumFontFamiliesEx(dummy, &lf, storeFont, 0, 0); + ReleaseDC(0, dummy); +} + +namespace { +// Context for enumerating system fonts, records whether the default font has been +// encountered, which is normally not enumerated. +struct PopulateFamiliesContext +{ + PopulateFamiliesContext(const QString &f) : systemDefaultFont(f), seenSystemDefaultFont(false) {} + + QString systemDefaultFont; + bool seenSystemDefaultFont; +}; +} // namespace + +// Delayed population of font families + +static int QT_WIN_CALLBACK populateFontFamilies(const LOGFONT *logFont, const TEXTMETRIC *textmetric, + DWORD, LPARAM lparam) +{ + const ENUMLOGFONTEX *f = reinterpret_cast(logFont); + // the "@family" fonts are just the same as "family". Ignore them. + const wchar_t *faceNameW = f->elfLogFont.lfFaceName; + if (faceNameW[0] && faceNameW[0] != L'@' && wcsncmp(faceNameW, L"WST_", 4)) { + // Register only font families for which a font file exists for delayed population + const bool ttf = textmetric->tmPitchAndFamily & TMPF_TRUETYPE; + const QString faceName = QString::fromWCharArray(faceNameW); + const FontKey *key = findFontKey(faceName); + if (!key) { + key = findFontKey(QString::fromWCharArray(f->elfFullName)); + if (!key && ttf && localizedName(faceName)) + key = findFontKey(getEnglishName(faceName)); + } + if (key) { + QPlatformFontDatabase::registerFontFamily(faceName); + PopulateFamiliesContext *context = reinterpret_cast(lparam); + if (!context->seenSystemDefaultFont && faceName == context->systemDefaultFont) + context->seenSystemDefaultFont = true; + + // Register current font's english name as alias + if (ttf && localizedName(faceName)) { + const QString englishName = getEnglishName(faceName); + if (!englishName.isEmpty()) { + QPlatformFontDatabase::registerAliasToFontFamily(faceName, englishName); + // Check whether the system default font name is an alias of the current font family name, + // as on Chinese Windows, where the system font "SimSun" is an alias to a font registered under a local name + if (!context->seenSystemDefaultFont && englishName == context->systemDefaultFont) + context->seenSystemDefaultFont = true; + } + } + } + } + return 1; // continue +} + +void QWindowsFontDatabaseFT::populateFontDatabase() +{ + HDC dummy = GetDC(0); + LOGFONT lf; + lf.lfCharSet = DEFAULT_CHARSET; + lf.lfFaceName[0] = 0; + lf.lfPitchAndFamily = 0; + PopulateFamiliesContext context(QWindowsFontDatabase::systemDefaultFont().family()); + EnumFontFamiliesEx(dummy, &lf, populateFontFamilies, reinterpret_cast(&context), 0); + ReleaseDC(0, dummy); + // Work around EnumFontFamiliesEx() not listing the system font + if (!context.seenSystemDefaultFont) + QPlatformFontDatabase::registerFontFamily(context.systemDefaultFont); +} + +QFontEngine * QWindowsFontDatabaseFT::fontEngine(const QFontDef &fontDef, void *handle) +{ + QFontEngine *fe = QBasicFontDatabase::fontEngine(fontDef, handle); + qCDebug(lcQpaFonts) << __FUNCTION__ << "FONTDEF" << fontDef.family << fe << handle; + return fe; +} + +QFontEngine *QWindowsFontDatabaseFT::fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference) +{ + QFontEngine *fe = QBasicFontDatabase::fontEngine(fontData, pixelSize, hintingPreference); + qCDebug(lcQpaFonts) << __FUNCTION__ << "FONTDATA" << fontData << pixelSize << hintingPreference << fe; + return fe; +} + +QStringList QWindowsFontDatabaseFT::fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const +{ + QStringList result; + result.append(QWindowsFontDatabase::familyForStyleHint(styleHint)); + result.append(QWindowsFontDatabase::extraTryFontsForFamily(family)); + result.append(QBasicFontDatabase::fallbacksForFamily(family, style, styleHint, script)); + + qCDebug(lcQpaFonts) << __FUNCTION__ << family << style << styleHint + << script << result; + + return result; +} +QString QWindowsFontDatabaseFT::fontDir() const +{ + const QString result = QLatin1String(qgetenv("windir")) + QLatin1String("/Fonts");//QPlatformFontDatabase::fontDir(); + qCDebug(lcQpaFonts) << __FUNCTION__ << result; + return result; +} + +QFont QWindowsFontDatabaseFT::defaultFont() const +{ + return QWindowsFontDatabase::systemDefaultFont(); +} + +QT_END_NAMESPACE diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft_p.h b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft_p.h new file mode 100644 index 0000000000..3a432842e5 --- /dev/null +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft_p.h @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWINDOWSFONTDATABASEFT_H +#define QWINDOWSFONTDATABASEFT_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QWindowsFontDatabaseFT : public QBasicFontDatabase +{ +public: + void populateFontDatabase() Q_DECL_OVERRIDE; + void populateFamily(const QString &familyName) Q_DECL_OVERRIDE; + QFontEngine *fontEngine(const QFontDef &fontDef, void *handle) Q_DECL_OVERRIDE; + QFontEngine *fontEngine(const QByteArray &fontData, qreal pixelSize, + QFont::HintingPreference hintingPreference) Q_DECL_OVERRIDE; + + QStringList fallbacksForFamily(const QString &family, QFont::Style style, + QFont::StyleHint styleHint, + QChar::Script script) const Q_DECL_OVERRIDE; + + QString fontDir() const Q_DECL_OVERRIDE; + QFont defaultFont() const Q_DECL_OVERRIDE; +}; + +QT_END_NAMESPACE + +#endif // QWINDOWSFONTDATABASEFT_H diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h new file mode 100644 index 0000000000..d240f77a66 --- /dev/null +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h @@ -0,0 +1,160 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWINDOWSFONTDATABASE_H +#define QWINDOWSFONTDATABASE_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include +#include + +#if !defined(QT_NO_DIRECTWRITE) + struct IDWriteFactory; + struct IDWriteGdiInterop; +#endif + +QT_BEGIN_NAMESPACE + +Q_DECLARE_LOGGING_CATEGORY(lcQpaFonts) + +class QWindowsFontEngineData +{ + Q_DISABLE_COPY(QWindowsFontEngineData) +public: + QWindowsFontEngineData(); + ~QWindowsFontEngineData(); + + uint pow_gamma[256]; + + bool clearTypeEnabled; + qreal fontSmoothingGamma; + HDC hdc; +#if !defined(QT_NO_DIRECTWRITE) + IDWriteFactory *directWriteFactory; + IDWriteGdiInterop *directWriteGdiInterop; +#endif +}; + +class QWindowsFontDatabase : public QPlatformFontDatabase +{ +public: + enum FontOptions { + // Relevant bits from QWindowsIntegration::Options + DontUseDirectWriteFonts = 0x40, + DontUseColorFonts = 0x80 + }; + + QWindowsFontDatabase(); + ~QWindowsFontDatabase(); + + void populateFontDatabase() Q_DECL_OVERRIDE; + void populateFamily(const QString &familyName) Q_DECL_OVERRIDE; + QFontEngineMulti *fontEngineMulti(QFontEngine *fontEngine, QChar::Script script) Q_DECL_OVERRIDE; + QFontEngine *fontEngine(const QFontDef &fontDef, void *handle) Q_DECL_OVERRIDE; + QFontEngine *fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference) Q_DECL_OVERRIDE; + QStringList fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const Q_DECL_OVERRIDE; + QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName) Q_DECL_OVERRIDE; + void releaseHandle(void *handle) Q_DECL_OVERRIDE; + QString fontDir() const Q_DECL_OVERRIDE; + + QFont defaultFont() const Q_DECL_OVERRIDE { return systemDefaultFont(); } + bool fontsAlwaysScalable() const Q_DECL_OVERRIDE; + void derefUniqueFont(const QString &uniqueFont); + void refUniqueFont(const QString &uniqueFont); + + static QFont systemDefaultFont(); + + static QFontEngine *createEngine(const QFontDef &request, + int dpi, + const QSharedPointer &data); + + static HFONT systemFont(); + static QFont LOGFONT_to_QFont(const LOGFONT& lf, int verticalDPI = 0); + + static qreal fontSmoothingGamma(); + static LOGFONT fontDefToLOGFONT(const QFontDef &fontDef); + + static QStringList extraTryFontsForFamily(const QString &family); + static QString familyForStyleHint(QFont::StyleHint styleHint); + + static int defaultVerticalDPI(); + + static void setFontOptions(unsigned options); + static unsigned fontOptions(); + +private: + void populateFamily(const QString &familyName, bool registerAlias); + void removeApplicationFonts(); + + struct WinApplicationFont { + HANDLE handle; + QString fileName; + }; + + QList m_applicationFonts; + + struct UniqueFontData { + HANDLE handle; + QAtomicInt refCount; + }; + + QMap m_uniqueFontData; + + static unsigned m_fontOptions; +}; + +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug, const QFontDef &def); +#endif + +QT_END_NAMESPACE + +#endif // QWINDOWSFONTDATABASE_H diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontengine.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontengine.cpp new file mode 100644 index 0000000000..9fc6fec915 --- /dev/null +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontengine.cpp @@ -0,0 +1,1330 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwindowsfontengine_p.h" +#include "qwindowsnativeimage_p.h" +#include "qwindowsfontdatabase_p.h" +#include +#include "qwindowsfontenginedirectwrite_p.h" + +#include +#include // glyph_metrics_t +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include + +#if !defined(QT_NO_DIRECTWRITE) +# include +#endif + +QT_BEGIN_NAMESPACE + +//### mingw needed define +#ifndef TT_PRIM_CSPLINE +#define TT_PRIM_CSPLINE 3 +#endif + +// GetFontData expects the tags in little endian ;( +#define MAKE_LITTLE_ENDIAN_TAG(ch1, ch2, ch3, ch4) (\ + (((quint32)(ch4)) << 24) | \ + (((quint32)(ch3)) << 16) | \ + (((quint32)(ch2)) << 8) | \ + ((quint32)(ch1)) \ + ) + +// common DC for all fonts + +typedef BOOL (WINAPI *PtrGetCharWidthI)(HDC, UINT, UINT, LPWORD, LPINT); +static PtrGetCharWidthI ptrGetCharWidthI = 0; +static bool resolvedGetCharWidthI = false; + +static void resolveGetCharWidthI() +{ + if (resolvedGetCharWidthI) + return; + resolvedGetCharWidthI = true; + ptrGetCharWidthI = (PtrGetCharWidthI)QSystemLibrary::resolve(QStringLiteral("gdi32"), "GetCharWidthI"); +} + +static inline quint16 getUShort(unsigned char *p) +{ + quint16 val; + val = *p++ << 8; + val |= *p; + + return val; +} + +// general font engine + +QFixed QWindowsFontEngine::lineThickness() const +{ + if(lineWidth > 0) + return lineWidth; + + return QFontEngine::lineThickness(); +} + +static OUTLINETEXTMETRIC *getOutlineTextMetric(HDC hdc) +{ + int size; + size = GetOutlineTextMetrics(hdc, 0, 0); + OUTLINETEXTMETRIC *otm = (OUTLINETEXTMETRIC *)malloc(size); + GetOutlineTextMetrics(hdc, size, otm); + return otm; +} + +bool QWindowsFontEngine::hasCFFTable() const +{ + HDC hdc = m_fontEngineData->hdc; + SelectObject(hdc, hfont); + return GetFontData(hdc, MAKE_LITTLE_ENDIAN_TAG('C', 'F', 'F', ' '), 0, 0, 0) != GDI_ERROR; +} + +bool QWindowsFontEngine::hasCMapTable() const +{ + HDC hdc = m_fontEngineData->hdc; + SelectObject(hdc, hfont); + return GetFontData(hdc, MAKE_LITTLE_ENDIAN_TAG('c', 'm', 'a', 'p'), 0, 0, 0) != GDI_ERROR; +} + +bool QWindowsFontEngine::hasGlyfTable() const +{ + HDC hdc = m_fontEngineData->hdc; + SelectObject(hdc, hfont); + return GetFontData(hdc, MAKE_LITTLE_ENDIAN_TAG('g', 'l', 'y', 'f'), 0, 0, 0) != GDI_ERROR; +} + +bool QWindowsFontEngine::hasEbdtTable() const +{ + HDC hdc = m_fontEngineData->hdc; + SelectObject(hdc, hfont); + return GetFontData(hdc, MAKE_LITTLE_ENDIAN_TAG('E', 'B', 'D', 'T'), 0, 0, 0) != GDI_ERROR; +} + +static inline QString stringFromOutLineTextMetric(const OUTLINETEXTMETRIC *otm, PSTR offset) +{ + const uchar *p = reinterpret_cast(otm) + quintptr(offset); + return QString::fromWCharArray(reinterpret_cast(p)); +} + +void QWindowsFontEngine::getCMap() +{ + ttf = (bool)(tm.tmPitchAndFamily & TMPF_TRUETYPE) || hasCMapTable(); + + cffTable = hasCFFTable(); + + HDC hdc = m_fontEngineData->hdc; + SelectObject(hdc, hfont); + bool symb = false; + if (ttf) { + cmapTable = getSfntTable(MAKE_TAG('c', 'm', 'a', 'p')); + cmap = QFontEngine::getCMap(reinterpret_cast(cmapTable.constData()), + cmapTable.size(), &symb, &cmapSize); + } + if (!cmap) { + ttf = false; + symb = false; + } + symbol = symb; + designToDevice = 1; + _faceId.index = 0; + if(cmap) { + OUTLINETEXTMETRIC *otm = getOutlineTextMetric(hdc); + unitsPerEm = int(otm->otmEMSquare); + const QFixed unitsPerEmF(unitsPerEm); + designToDevice = unitsPerEmF / QFixed::fromReal(fontDef.pixelSize); + x_height = int(otm->otmsXHeight); + loadKerningPairs(designToDevice); + _faceId.filename = QFile::encodeName(stringFromOutLineTextMetric(otm, otm->otmpFullName)); + lineWidth = otm->otmsUnderscoreSize; + fsType = otm->otmfsType; + free(otm); + + } else { + unitsPerEm = tm.tmHeight; + } +} + +int QWindowsFontEngine::getGlyphIndexes(const QChar *str, int numChars, QGlyphLayout *glyphs) const +{ + int glyph_pos = 0; + { + if (symbol) { + QStringIterator it(str, str + numChars); + while (it.hasNext()) { + const uint uc = it.next(); + glyphs->glyphs[glyph_pos] = getTrueTypeGlyphIndex(cmap, cmapSize, uc); + if(!glyphs->glyphs[glyph_pos] && uc < 0x100) + glyphs->glyphs[glyph_pos] = getTrueTypeGlyphIndex(cmap, cmapSize, uc + 0xf000); + ++glyph_pos; + } + } else if (ttf) { + QStringIterator it(str, str + numChars); + while (it.hasNext()) { + const uint uc = it.next(); + glyphs->glyphs[glyph_pos] = getTrueTypeGlyphIndex(cmap, cmapSize, uc); + ++glyph_pos; + } + } else { + QStringIterator it(str, str + numChars); + while (it.hasNext()) { + const uint uc = it.next(); + if (uc >= tm.tmFirstChar && uc <= tm.tmLastChar) + glyphs->glyphs[glyph_pos] = uc; + else + glyphs->glyphs[glyph_pos] = 0; + ++glyph_pos; + } + } + } + glyphs->numGlyphs = glyph_pos; + return glyph_pos; +} + +/*! + \class QWindowsFontEngine + \brief Standard Windows font engine. + \internal + \ingroup qt-lighthouse-win + + Will probably be superseded by a common Free Type font engine in Qt 5.X. +*/ + +QWindowsFontEngine::QWindowsFontEngine(const QString &name, + LOGFONT lf, + const QSharedPointer &fontEngineData) + : QFontEngine(Win), + m_fontEngineData(fontEngineData), + _name(name), + hfont(0), + m_logfont(lf), + ttf(0), + hasOutline(0), + cmap(0), + cmapSize(0), + lbearing(SHRT_MIN), + rbearing(SHRT_MIN), + x_height(-1), + synthesized_flags(-1), + lineWidth(-1), + widthCache(0), + widthCacheSize(0), + designAdvances(0), + designAdvancesSize(0) +{ + qCDebug(lcQpaFonts) << __FUNCTION__ << name << lf.lfHeight; + hfont = CreateFontIndirect(&m_logfont); + if (!hfont) { + qErrnoWarning("%s: CreateFontIndirect failed for family '%s'", __FUNCTION__, qPrintable(name)); + hfont = QWindowsFontDatabase::systemFont(); + } + + HDC hdc = m_fontEngineData->hdc; + SelectObject(hdc, hfont); + const BOOL res = GetTextMetrics(hdc, &tm); + if (!res) { + qErrnoWarning("%s: GetTextMetrics failed", __FUNCTION__); + ZeroMemory(&tm, sizeof(TEXTMETRIC)); + } + + fontDef.pixelSize = -lf.lfHeight; + fontDef.fixedPitch = !(tm.tmPitchAndFamily & TMPF_FIXED_PITCH); + + cache_cost = tm.tmHeight * tm.tmAveCharWidth * 2000; + getCMap(); + + if (!resolvedGetCharWidthI) + resolveGetCharWidthI(); + + // ### Properties accessed by QWin32PrintEngine (QtPrintSupport) + QVariantMap userData; + userData.insert(QStringLiteral("logFont"), QVariant::fromValue(m_logfont)); + userData.insert(QStringLiteral("hFont"), QVariant::fromValue(hfont)); + userData.insert(QStringLiteral("trueType"), QVariant(bool(ttf))); + setUserData(userData); + + hasUnreliableOutline = hasGlyfTable() && hasEbdtTable(); +} + +QWindowsFontEngine::~QWindowsFontEngine() +{ + if (designAdvances) + free(designAdvances); + + if (widthCache) + free(widthCache); + + // make sure we aren't by accident still selected + SelectObject(m_fontEngineData->hdc, QWindowsFontDatabase::systemFont()); + + if (!DeleteObject(hfont)) + qErrnoWarning("%s: QFontEngineWin: failed to delete font...", __FUNCTION__); + qCDebug(lcQpaFonts) << __FUNCTION__ << _name; + + if (!uniqueFamilyName.isEmpty()) { + if (QPlatformIntegration *pi = QGuiApplicationPrivate::platformIntegration()) { + QPlatformFontDatabase *pfdb = pi->fontDatabase(); + static_cast(pfdb)->derefUniqueFont(uniqueFamilyName); + } + } +} + +glyph_t QWindowsFontEngine::glyphIndex(uint ucs4) const +{ + glyph_t glyph = 0; + + if (symbol) { + glyph = getTrueTypeGlyphIndex(cmap, cmapSize, ucs4); + if (glyph == 0 && ucs4 < 0x100) + glyph = getTrueTypeGlyphIndex(cmap, cmapSize, ucs4 + 0xf000); + } else if (ttf) { + glyph = getTrueTypeGlyphIndex(cmap, cmapSize, ucs4); + } else if (ucs4 >= tm.tmFirstChar && ucs4 <= tm.tmLastChar) { + glyph = ucs4; + } + + return glyph; +} + +HGDIOBJ QWindowsFontEngine::selectDesignFont() const +{ + LOGFONT f = m_logfont; + f.lfHeight = -unitsPerEm; + f.lfWidth = 0; + HFONT designFont = CreateFontIndirect(&f); + return SelectObject(m_fontEngineData->hdc, designFont); +} + +bool QWindowsFontEngine::stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, int *nglyphs, QFontEngine::ShaperFlags flags) const +{ + Q_ASSERT(glyphs->numGlyphs >= *nglyphs); + if (*nglyphs < len) { + *nglyphs = len; + return false; + } + + glyphs->numGlyphs = *nglyphs; + *nglyphs = getGlyphIndexes(str, len, glyphs); + + if (!(flags & GlyphIndicesOnly)) + recalcAdvances(glyphs, flags); + + return true; +} + +inline void calculateTTFGlyphWidth(HDC hdc, UINT glyph, int &width) +{ + if (ptrGetCharWidthI) + ptrGetCharWidthI(hdc, glyph, 1, 0, &width); +} + +void QWindowsFontEngine::recalcAdvances(QGlyphLayout *glyphs, QFontEngine::ShaperFlags flags) const +{ + HGDIOBJ oldFont = 0; + HDC hdc = m_fontEngineData->hdc; + if (ttf && (flags & DesignMetrics)) { + for(int i = 0; i < glyphs->numGlyphs; i++) { + unsigned int glyph = glyphs->glyphs[i]; + if(int(glyph) >= designAdvancesSize) { + const int newSize = int(glyph + 256) >> 8 << 8; + designAdvances = reinterpret_cast(realloc(designAdvances, size_t(newSize) * sizeof(QFixed))); + Q_CHECK_PTR(designAdvances); + for(int i = designAdvancesSize; i < newSize; ++i) + designAdvances[i] = -1000000; + designAdvancesSize = newSize; + } + if (designAdvances[glyph] < -999999) { + if (!oldFont) + oldFont = selectDesignFont(); + + int width = 0; + calculateTTFGlyphWidth(hdc, glyph, width); + designAdvances[glyph] = QFixed(width) / designToDevice; + } + glyphs->advances[i] = designAdvances[glyph]; + } + if(oldFont) + DeleteObject(SelectObject(hdc, oldFont)); + } else { + for(int i = 0; i < glyphs->numGlyphs; i++) { + unsigned int glyph = glyphs->glyphs[i]; + + if (glyph >= widthCacheSize) { + const uint newSize = (glyph + 256) >> 8 << 8; + widthCache = reinterpret_cast(realloc(widthCache, newSize * sizeof(QFixed))); + Q_CHECK_PTR(widthCache); + memset(widthCache + widthCacheSize, 0, newSize - widthCacheSize); + widthCacheSize = newSize; + } + glyphs->advances[i] = widthCache[glyph]; + // font-width cache failed + if (glyphs->advances[i].value() == 0) { + int width = 0; + if (!oldFont) + oldFont = SelectObject(hdc, hfont); + + if (!ttf) { + QChar ch[2] = { ushort(glyph), 0 }; + int chrLen = 1; + if (QChar::requiresSurrogates(glyph)) { + ch[0] = QChar::highSurrogate(glyph); + ch[1] = QChar::lowSurrogate(glyph); + ++chrLen; + } + SIZE size = {0, 0}; + GetTextExtentPoint32(hdc, reinterpret_cast(ch), chrLen, &size); + width = size.cx; + } else { + calculateTTFGlyphWidth(hdc, glyph, width); + } + glyphs->advances[i] = width; + // if glyph's within cache range, store it for later + if (width > 0 && width < 0x100) + widthCache[glyph] = uchar(width); + } + } + + if (oldFont) + SelectObject(hdc, oldFont); + } +} + +glyph_metrics_t QWindowsFontEngine::boundingBox(const QGlyphLayout &glyphs) +{ + if (glyphs.numGlyphs == 0) + return glyph_metrics_t(); + + QFixed w = 0; + for (int i = 0; i < glyphs.numGlyphs; ++i) + w += glyphs.effectiveAdvance(i); + + return glyph_metrics_t(0, -tm.tmAscent, w - lastRightBearing(glyphs), tm.tmHeight, w, 0); +} + +bool QWindowsFontEngine::getOutlineMetrics(glyph_t glyph, const QTransform &t, glyph_metrics_t *metrics) const +{ + Q_ASSERT(metrics != 0); + + HDC hdc = m_fontEngineData->hdc; + + GLYPHMETRICS gm; + DWORD res = 0; + MAT2 mat; + mat.eM11.value = mat.eM22.value = 1; + mat.eM11.fract = mat.eM22.fract = 0; + mat.eM21.value = mat.eM12.value = 0; + mat.eM21.fract = mat.eM12.fract = 0; + + if (t.type() > QTransform::TxTranslate) { + // We need to set the transform using the HDC's world + // matrix rather than using the MAT2 above, because the + // results provided when transforming via MAT2 does not + // match the glyphs that are drawn using a WorldTransform + XFORM xform; + xform.eM11 = FLOAT(t.m11()); + xform.eM12 = FLOAT(t.m12()); + xform.eM21 = FLOAT(t.m21()); + xform.eM22 = FLOAT(t.m22()); + xform.eDx = 0; + xform.eDy = 0; + SetGraphicsMode(hdc, GM_ADVANCED); + SetWorldTransform(hdc, &xform); + } + + uint format = GGO_METRICS; + if (ttf) + format |= GGO_GLYPH_INDEX; + res = GetGlyphOutline(hdc, glyph, format, &gm, 0, 0, &mat); + + if (t.type() > QTransform::TxTranslate) { + XFORM xform; + xform.eM11 = xform.eM22 = 1; + xform.eM12 = xform.eM21 = xform.eDx = xform.eDy = 0; + SetWorldTransform(hdc, &xform); + SetGraphicsMode(hdc, GM_COMPATIBLE); + } + + if (res != GDI_ERROR) { + *metrics = glyph_metrics_t(gm.gmptGlyphOrigin.x, -gm.gmptGlyphOrigin.y, + int(gm.gmBlackBoxX), int(gm.gmBlackBoxY), + gm.gmCellIncX, gm.gmCellIncY); + return true; + } else { + return false; + } +} + +glyph_metrics_t QWindowsFontEngine::boundingBox(glyph_t glyph, const QTransform &t) +{ + HDC hdc = m_fontEngineData->hdc; + SelectObject(hdc, hfont); + + glyph_metrics_t glyphMetrics; + bool success = getOutlineMetrics(glyph, t, &glyphMetrics); + + if (!ttf && !success) { + // Bitmap fonts + wchar_t ch = wchar_t(glyph); + ABCFLOAT abc; + GetCharABCWidthsFloat(hdc, ch, ch, &abc); + int width = qRound(abc.abcfB); + + return glyph_metrics_t(QFixed::fromReal(abc.abcfA), -tm.tmAscent, width, tm.tmHeight, width, 0).transformed(t); + } + + return glyphMetrics; +} + +QFixed QWindowsFontEngine::ascent() const +{ + return tm.tmAscent; +} + +QFixed QWindowsFontEngine::descent() const +{ + return tm.tmDescent; +} + +QFixed QWindowsFontEngine::leading() const +{ + return tm.tmExternalLeading; +} + +namespace { +# pragma pack(1) + + struct OS2Table + { + quint16 version; + qint16 avgCharWidth; + quint16 weightClass; + quint16 widthClass; + quint16 type; + qint16 subscriptXSize; + qint16 subscriptYSize; + qint16 subscriptXOffset; + qint16 subscriptYOffset; + qint16 superscriptXSize; + qint16 superscriptYSize; + qint16 superscriptXOffset; + qint16 superscriptYOffset; + qint16 strikeOutSize; + qint16 strikeOutPosition; + qint16 familyClass; + quint8 panose[10]; + quint32 unicodeRanges[4]; + quint8 vendorID[4]; + quint16 selection; + quint16 firstCharIndex; + quint16 lastCharIndex; + qint16 typoAscender; + qint16 typoDescender; + qint16 typoLineGap; + quint16 winAscent; + quint16 winDescent; + quint32 codepageRanges[2]; + qint16 height; + qint16 capHeight; + quint16 defaultChar; + quint16 breakChar; + quint16 maxContext; + }; + +# pragma pack() +} + +QFixed QWindowsFontEngine::capHeight() const +{ + const QByteArray tableData = getSfntTable(MAKE_TAG('O', 'S', '/', '2')); + if (size_t(tableData.size()) >= sizeof(OS2Table)) { + const OS2Table *table = reinterpret_cast(tableData.constData()); + if (qFromBigEndian(table->version) >= 2) { + qint16 capHeight = qFromBigEndian(table->capHeight); + if (capHeight > 0) + return QFixed(capHeight) / designToDevice; + } + } + return calculatedCapHeight(); +} + +QFixed QWindowsFontEngine::xHeight() const +{ + if(x_height >= 0) + return x_height; + return QFontEngine::xHeight(); +} + +QFixed QWindowsFontEngine::averageCharWidth() const +{ + return tm.tmAveCharWidth; +} + +qreal QWindowsFontEngine::maxCharWidth() const +{ + return tm.tmMaxCharWidth; +} + +enum { max_font_count = 256 }; +static const ushort char_table[] = { + 40, + 67, + 70, + 75, + 86, + 88, + 89, + 91, + 102, + 114, + 124, + 127, + 205, + 645, + 884, + 922, + 1070, + 12386, + 0 +}; + +static const int char_table_entries = sizeof(char_table)/sizeof(ushort); + +#ifndef Q_CC_MINGW +void QWindowsFontEngine::getGlyphBearings(glyph_t glyph, qreal *leftBearing, qreal *rightBearing) +{ + HDC hdc = m_fontEngineData->hdc; + SelectObject(hdc, hfont); + + if (ttf) { + ABC abcWidths; + GetCharABCWidthsI(hdc, glyph, 1, 0, &abcWidths); + if (leftBearing) + *leftBearing = abcWidths.abcA; + if (rightBearing) + *rightBearing = abcWidths.abcC; + } else { + QFontEngine::getGlyphBearings(glyph, leftBearing, rightBearing); + } +} +#endif // Q_CC_MINGW + +bool QWindowsFontEngine::hasUnreliableGlyphOutline() const +{ + return hasUnreliableOutline || QFontEngine::hasUnreliableGlyphOutline(); +} + +qreal QWindowsFontEngine::minLeftBearing() const +{ + if (lbearing == SHRT_MIN) + minRightBearing(); // calculates both + + return lbearing; +} + +qreal QWindowsFontEngine::minRightBearing() const +{ + if (rbearing == SHRT_MIN) { + int ml = 0; + int mr = 0; + HDC hdc = m_fontEngineData->hdc; + SelectObject(hdc, hfont); + if (ttf) { + ABC *abc = 0; + int n = tm.tmLastChar - tm.tmFirstChar; + if (n <= max_font_count) { + abc = new ABC[n+1]; + GetCharABCWidths(hdc, tm.tmFirstChar, tm.tmLastChar, abc); + } else { + abc = new ABC[char_table_entries+1]; + for(int i = 0; i < char_table_entries; i++) + GetCharABCWidths(hdc, char_table[i], char_table[i], abc + i); + n = char_table_entries; + } + ml = abc[0].abcA; + mr = abc[0].abcC; + for (int i = 1; i < n; i++) { + if (abc[i].abcA + abc[i].abcB + abc[i].abcC != 0) { + ml = qMin(ml,abc[i].abcA); + mr = qMin(mr,abc[i].abcC); + } + } + delete [] abc; + } else { + ABCFLOAT *abc = 0; + int n = tm.tmLastChar - tm.tmFirstChar+1; + if (n <= max_font_count) { + abc = new ABCFLOAT[n]; + GetCharABCWidthsFloat(hdc, tm.tmFirstChar, tm.tmLastChar, abc); + } else { + abc = new ABCFLOAT[char_table_entries]; + for(int i = 0; i < char_table_entries; i++) + GetCharABCWidthsFloat(hdc, char_table[i], char_table[i], abc+i); + n = char_table_entries; + } + float fml = abc[0].abcfA; + float fmr = abc[0].abcfC; + for (int i=1; i(dataBuffer + headerOffset); + + QPointF lastPoint(qt_to_qpointf(ttph->pfxStart, scale)); + path->moveTo(lastPoint + oset); + offset += sizeof(TTPOLYGONHEADER); + while (offset < headerOffset + ttph->cb) { + const TTPOLYCURVE *curve = reinterpret_cast(dataBuffer + offset); + switch (curve->wType) { + case TT_PRIM_LINE: { + for (int i=0; icpfx; ++i) { + QPointF p = qt_to_qpointf(curve->apfx[i], scale) + oset; + path->lineTo(p); + } + break; + } + case TT_PRIM_QSPLINE: { + const QPainterPath::Element &elm = path->elementAt(path->elementCount()-1); + QPointF prev(elm.x, elm.y); + QPointF endPoint; + for (int i=0; icpfx - 1; ++i) { + QPointF p1 = qt_to_qpointf(curve->apfx[i], scale) + oset; + QPointF p2 = qt_to_qpointf(curve->apfx[i+1], scale) + oset; + if (i < curve->cpfx - 2) { + endPoint = QPointF((p1.x() + p2.x()) / 2, (p1.y() + p2.y()) / 2); + } else { + endPoint = p2; + } + + path->quadTo(p1, endPoint); + prev = endPoint; + } + + break; + } + case TT_PRIM_CSPLINE: { + for (int i=0; icpfx; ) { + QPointF p2 = qt_to_qpointf(curve->apfx[i++], scale) + oset; + QPointF p3 = qt_to_qpointf(curve->apfx[i++], scale) + oset; + QPointF p4 = qt_to_qpointf(curve->apfx[i++], scale) + oset; + path->cubicTo(p2, p3, p4); + } + break; + } + default: + qWarning("QFontEngineWin::addOutlineToPath, unhandled switch case"); + } + offset += sizeof(TTPOLYCURVE) + (curve->cpfx-1) * sizeof(POINTFX); + } + path->closeSubpath(); + headerOffset += ttph->cb; + } + delete [] dataBuffer; + + return true; +} + +void QWindowsFontEngine::addGlyphsToPath(glyph_t *glyphs, QFixedPoint *positions, int nglyphs, + QPainterPath *path, QTextItem::RenderFlags) +{ + LOGFONT lf = m_logfont; + // The sign must be negative here to make sure we match against character height instead of + // hinted cell height. This ensures that we get linear matching, and we need this for + // paths since we later on apply a scaling transform to the glyph outline to get the + // font at the correct pixel size. + lf.lfHeight = -unitsPerEm; + lf.lfWidth = 0; + HFONT hf = CreateFontIndirect(&lf); + HDC hdc = m_fontEngineData->hdc; + HGDIOBJ oldfont = SelectObject(hdc, hf); + + for(int i = 0; i < nglyphs; ++i) { + if (!addGlyphToPath(glyphs[i], positions[i], hdc, path, ttf, /*metric*/0, + qreal(fontDef.pixelSize) / unitsPerEm)) { + // Some windows fonts, like "Modern", are vector stroke + // fonts, which are reported as TMPF_VECTOR but do not + // support GetGlyphOutline, and thus we set this bit so + // that addOutLineToPath can check it and return safely... + hasOutline = false; + break; + } + } + DeleteObject(SelectObject(hdc, oldfont)); +} + +void QWindowsFontEngine::addOutlineToPath(qreal x, qreal y, const QGlyphLayout &glyphs, + QPainterPath *path, QTextItem::RenderFlags flags) +{ + if(tm.tmPitchAndFamily & (TMPF_TRUETYPE | TMPF_VECTOR)) { + hasOutline = true; + QFontEngine::addOutlineToPath(x, y, glyphs, path, flags); + if (hasOutline) { + // has_outline is set to false if addGlyphToPath gets + // false from GetGlyphOutline, meaning its not an outline + // font. + return; + } + } + QFontEngine::addBitmapFontToPath(x, y, glyphs, path, flags); +} + +QFontEngine::FaceId QWindowsFontEngine::faceId() const +{ + return _faceId; +} + +QT_BEGIN_INCLUDE_NAMESPACE +#include +QT_END_INCLUDE_NAMESPACE + +int QWindowsFontEngine::synthesized() const +{ + if(synthesized_flags == -1) { + synthesized_flags = 0; + if(ttf) { + const DWORD HEAD = MAKE_LITTLE_ENDIAN_TAG('h', 'e', 'a', 'd'); + HDC hdc = m_fontEngineData->hdc; + SelectObject(hdc, hfont); + uchar data[4]; + GetFontData(hdc, HEAD, 44, &data, 4); + USHORT macStyle = getUShort(data); + if (tm.tmItalic && !(macStyle & 2)) + synthesized_flags = SynthesizedItalic; + if (fontDef.stretch != 100 && ttf) + synthesized_flags |= SynthesizedStretch; + if (tm.tmWeight >= 500 && !(macStyle & 1)) + synthesized_flags |= SynthesizedBold; + //qDebug() << "font is" << _name << + // "it=" << (macStyle & 2) << fontDef.style << "flags=" << synthesized_flags; + } + } + return synthesized_flags; +} + +QFixed QWindowsFontEngine::emSquareSize() const +{ + return unitsPerEm; +} + +QFontEngine::Properties QWindowsFontEngine::properties() const +{ + LOGFONT lf = m_logfont; + lf.lfHeight = unitsPerEm; + HFONT hf = CreateFontIndirect(&lf); + HDC hdc = m_fontEngineData->hdc; + HGDIOBJ oldfont = SelectObject(hdc, hf); + OUTLINETEXTMETRIC *otm = getOutlineTextMetric(hdc); + Properties p; + p.emSquare = unitsPerEm; + p.italicAngle = otm->otmItalicAngle; + const QByteArray name = stringFromOutLineTextMetric(otm, otm->otmpFamilyName).toLatin1() + + stringFromOutLineTextMetric(otm, otm->otmpStyleName).toLatin1(); + p.postscriptName = QFontEngine::convertToPostscriptFontFamilyName(name); + p.boundingBox = QRectF(otm->otmrcFontBox.left, -otm->otmrcFontBox.top, + otm->otmrcFontBox.right - otm->otmrcFontBox.left, + otm->otmrcFontBox.top - otm->otmrcFontBox.bottom); + p.ascent = otm->otmAscent; + p.descent = -otm->otmDescent; + p.leading = int(otm->otmLineGap); + p.capHeight = 0; + p.lineWidth = otm->otmsUnderscoreSize; + free(otm); + DeleteObject(SelectObject(hdc, oldfont)); + return p; +} + +void QWindowsFontEngine::getUnscaledGlyph(glyph_t glyph, QPainterPath *path, glyph_metrics_t *metrics) +{ + LOGFONT lf = m_logfont; + lf.lfHeight = -unitsPerEm; + int flags = synthesized(); + if(flags & SynthesizedItalic) + lf.lfItalic = false; + lf.lfWidth = 0; + HFONT hf = CreateFontIndirect(&lf); + HDC hdc = m_fontEngineData->hdc; + HGDIOBJ oldfont = SelectObject(hdc, hf); + QFixedPoint p; + p.x = 0; + p.y = 0; + addGlyphToPath(glyph, p, hdc, path, ttf, metrics); + DeleteObject(SelectObject(hdc, oldfont)); +} + +bool QWindowsFontEngine::getSfntTableData(uint tag, uchar *buffer, uint *length) const +{ + if (!ttf && !cffTable) + return false; + HDC hdc = m_fontEngineData->hdc; + SelectObject(hdc, hfont); + DWORD t = qbswap(tag); + *length = GetFontData(hdc, t, 0, buffer, *length); + Q_ASSERT(*length == GDI_ERROR || int(*length) > 0); + return *length != GDI_ERROR; +} + +#if !defined(CLEARTYPE_QUALITY) +# define CLEARTYPE_QUALITY 5 +#endif + +QWindowsNativeImage *QWindowsFontEngine::drawGDIGlyph(HFONT font, glyph_t glyph, int margin, + const QTransform &t, + QImage::Format mask_format) +{ + Q_UNUSED(mask_format) + glyph_metrics_t gm = boundingBox(glyph); + +// printf(" -> for glyph %4x\n", glyph); + + int gx = gm.x.toInt(); + int gy = gm.y.toInt(); + int iw = gm.width.toInt(); + int ih = gm.height.toInt(); + + if (iw <= 0 || ih <= 0) + return 0; + + bool has_transformation = t.type() > QTransform::TxTranslate; + + unsigned int options = ttf ? ETO_GLYPH_INDEX : 0; + XFORM xform; + + if (has_transformation) { + xform.eM11 = FLOAT(t.m11()); + xform.eM12 = FLOAT(t.m12()); + xform.eM21 = FLOAT(t.m21()); + xform.eM22 = FLOAT(t.m22()); + xform.eDx = margin; + xform.eDy = margin; + + const HDC hdc = m_fontEngineData->hdc; + + SetGraphicsMode(hdc, GM_ADVANCED); + SetWorldTransform(hdc, &xform); + HGDIOBJ old_font = SelectObject(hdc, font); + + const UINT ggo_options = GGO_METRICS | (ttf ? GGO_GLYPH_INDEX : 0); + GLYPHMETRICS tgm; + MAT2 mat; + memset(&mat, 0, sizeof(mat)); + mat.eM11.value = mat.eM22.value = 1; + + const DWORD result = GetGlyphOutline(hdc, glyph, ggo_options, &tgm, 0, 0, &mat); + + XFORM identity = {1, 0, 0, 1, 0, 0}; + SetWorldTransform(hdc, &identity); + SetGraphicsMode(hdc, GM_COMPATIBLE); + SelectObject(hdc, old_font); + + if (result == GDI_ERROR) { + const int errorCode = int(GetLastError()); + qErrnoWarning(errorCode, "QWinFontEngine: unable to query transformed glyph metrics (GetGlyphOutline() failed, error %d)...", errorCode); + return 0; + } + + iw = int(tgm.gmBlackBoxX); + ih = int(tgm.gmBlackBoxY); + + xform.eDx -= tgm.gmptGlyphOrigin.x; + xform.eDy += tgm.gmptGlyphOrigin.y; + } + + // The padding here needs to be kept in sync with the values in alphaMapBoundingBox. + QWindowsNativeImage *ni = new QWindowsNativeImage(iw + 2 * margin, + ih + 2 * margin, + QWindowsNativeImage::systemFormat()); + + /*If cleartype is enabled we use the standard system format even on Windows CE + and not the special textbuffer format we have to use if cleartype is disabled*/ + + ni->image().fill(0xffffffff); + + HDC hdc = ni->hdc(); + + SelectObject(hdc, GetStockObject(NULL_BRUSH)); + SelectObject(hdc, GetStockObject(BLACK_PEN)); + SetTextColor(hdc, RGB(0,0,0)); + SetBkMode(hdc, TRANSPARENT); + SetTextAlign(hdc, TA_BASELINE); + + HGDIOBJ old_font = SelectObject(hdc, font); + + if (has_transformation) { + SetGraphicsMode(hdc, GM_ADVANCED); + SetWorldTransform(hdc, &xform); + ExtTextOut(hdc, 0, 0, options, 0, reinterpret_cast(&glyph), 1, 0); + } else { + ExtTextOut(hdc, -gx + margin, -gy + margin, options, 0, reinterpret_cast(&glyph), 1, 0); + } + + SelectObject(hdc, old_font); + return ni; +} + +glyph_metrics_t QWindowsFontEngine::alphaMapBoundingBox(glyph_t glyph, QFixed, const QTransform &matrix, GlyphFormat format) +{ + int margin = 0; + if (format == QFontEngine::Format_A32 || format == QFontEngine::Format_ARGB) + margin = glyphMargin(QFontEngine::Format_A32); + glyph_metrics_t gm = boundingBox(glyph, matrix); + gm.width += margin * 2; + gm.height += margin * 2; + return gm; +} + +QImage QWindowsFontEngine::alphaMapForGlyph(glyph_t glyph, const QTransform &xform) +{ + HFONT font = hfont; + + bool clearTypeTemporarilyDisabled = (m_fontEngineData->clearTypeEnabled && m_logfont.lfQuality != NONANTIALIASED_QUALITY); + if (clearTypeTemporarilyDisabled) { + LOGFONT lf = m_logfont; + lf.lfQuality = ANTIALIASED_QUALITY; + font = CreateFontIndirect(&lf); + } + QImage::Format mask_format = QWindowsNativeImage::systemFormat(); + mask_format = QImage::Format_RGB32; + + const QWindowsNativeImage *mask = drawGDIGlyph(font, glyph, 0, xform, mask_format); + if (mask == 0) { + if (m_fontEngineData->clearTypeEnabled) + DeleteObject(font); + return QImage(); + } + + QImage alphaMap(mask->width(), mask->height(), QImage::Format_Alpha8); + + + // Copy data... Cannot use QPainter here as GDI has messed up the + // Alpha channel of the ni.image pixels... + for (int y=0; yheight(); ++y) { + uchar *dest = alphaMap.scanLine(y); + if (mask->image().format() == QImage::Format_RGB16) { + const qint16 *src = reinterpret_cast(mask->image().constScanLine(y)); + for (int x=0; xwidth(); ++x) + dest[x] = 255 - qGray(src[x]); + } else { + const uint *src = reinterpret_cast(mask->image().constScanLine(y)); + for (int x=0; xwidth(); ++x) { + if (QWindowsNativeImage::systemFormat() == QImage::Format_RGB16) + dest[x] = 255 - qGray(src[x]); + else + dest[x] = 255 - (m_fontEngineData->pow_gamma[qGray(src[x])] * 255. / 2047.); + } + } + } + + // Cleanup... + delete mask; + if (clearTypeTemporarilyDisabled) { + DeleteObject(font); + } + + return alphaMap; +} + +#define SPI_GETFONTSMOOTHINGCONTRAST 0x200C +#define SPI_SETFONTSMOOTHINGCONTRAST 0x200D + +QImage QWindowsFontEngine::alphaRGBMapForGlyph(glyph_t glyph, QFixed, const QTransform &t) +{ + HFONT font = hfont; + + UINT contrast; + SystemParametersInfo(SPI_GETFONTSMOOTHINGCONTRAST, 0, &contrast, 0); + SystemParametersInfo(SPI_SETFONTSMOOTHINGCONTRAST, 0, reinterpret_cast(quintptr(1000)), 0); + + int margin = glyphMargin(QFontEngine::Format_A32); + QWindowsNativeImage *mask = drawGDIGlyph(font, glyph, margin, t, QImage::Format_RGB32); + SystemParametersInfo(SPI_SETFONTSMOOTHINGCONTRAST, 0, reinterpret_cast(quintptr(contrast)), 0); + + if (mask == 0) + return QImage(); + + // Gracefully handle the odd case when the display is 16-bit + const QImage source = mask->image().depth() == 32 + ? mask->image() + : mask->image().convertToFormat(QImage::Format_RGB32); + + QImage rgbMask(mask->width(), mask->height(), QImage::Format_RGB32); + for (int y=0; yheight(); ++y) { + uint *dest = (uint *) rgbMask.scanLine(y); + const uint *src = reinterpret_cast(source.constScanLine(y)); + for (int x=0; xwidth(); ++x) { + dest[x] = 0xffffffff - (0x00ffffff & src[x]); + } + } + + delete mask; + + return rgbMask; +} + +QFontEngine *QWindowsFontEngine::cloneWithSize(qreal pixelSize) const +{ + QFontDef request = fontDef; + QString actualFontName = request.family; + if (!uniqueFamilyName.isEmpty()) + request.family = uniqueFamilyName; + request.pixelSize = pixelSize; + + QFontEngine *fontEngine = + QWindowsFontDatabase::createEngine(request, + QWindowsFontDatabase::defaultVerticalDPI(), + m_fontEngineData); + if (fontEngine) { + fontEngine->fontDef.family = actualFontName; + if (!uniqueFamilyName.isEmpty()) { + static_cast(fontEngine)->setUniqueFamilyName(uniqueFamilyName); + if (QPlatformIntegration *pi = QGuiApplicationPrivate::platformIntegration()) { + QPlatformFontDatabase *pfdb = pi->fontDatabase(); + static_cast(pfdb)->refUniqueFont(uniqueFamilyName); + } + } + } + return fontEngine; +} + +Qt::HANDLE QWindowsFontEngine::handle() const +{ + return hfont; +} + +void QWindowsFontEngine::initFontInfo(const QFontDef &request, + int dpi) +{ + fontDef = request; // most settings are equal + HDC dc = m_fontEngineData->hdc; + SelectObject(dc, hfont); + wchar_t n[64]; + GetTextFace(dc, 64, n); + fontDef.family = QString::fromWCharArray(n); + fontDef.fixedPitch = !(tm.tmPitchAndFamily & TMPF_FIXED_PITCH); + if (fontDef.pointSize < 0) { + fontDef.pointSize = fontDef.pixelSize * 72. / dpi; + } else if (fontDef.pixelSize == -1) { + fontDef.pixelSize = qRound(fontDef.pointSize * dpi / 72.); + } +} + +/*! + \class QWindowsMultiFontEngine + \brief Standard Windows Multi font engine. + \internal + \ingroup qt-lighthouse-win + + "Merges" several font engines that have gaps in the + supported writing systems. + + Will probably be superseded by a common Free Type font engine in Qt 5.X. +*/ +QWindowsMultiFontEngine::QWindowsMultiFontEngine(QFontEngine *fe, int script) + : QFontEngineMulti(fe, script) +{ +} + +QFontEngine *QWindowsMultiFontEngine::loadEngine(int at) +{ + QFontEngine *fontEngine = engine(0); + QSharedPointer data; + LOGFONT lf; + +#ifndef QT_NO_DIRECTWRITE + if (fontEngine->type() == QFontEngine::DirectWrite) { + QWindowsFontEngineDirectWrite *fe = static_cast(fontEngine); + lf = QWindowsFontDatabase::fontDefToLOGFONT(fe->fontDef); + + data = fe->fontEngineData(); + } else +#endif + { + QWindowsFontEngine *fe = static_cast(fontEngine); + lf = fe->m_logfont; + + data = fe->fontEngineData(); + } + + const QString fam = fallbackFamilyAt(at - 1); + const int faceNameLength = qMin(fam.length(), LF_FACESIZE - 1); + memcpy(lf.lfFaceName, fam.utf16(), faceNameLength * sizeof(wchar_t)); + lf.lfFaceName[faceNameLength] = 0; + +#ifndef QT_NO_DIRECTWRITE + if (fontEngine->type() == QFontEngine::DirectWrite) { + const QString nameSubstitute = QWindowsFontEngineDirectWrite::fontNameSubstitute(fam); + if (nameSubstitute != fam) { + const int nameSubstituteLength = qMin(nameSubstitute.length(), LF_FACESIZE - 1); + memcpy(lf.lfFaceName, nameSubstitute.utf16(), nameSubstituteLength * sizeof(wchar_t)); + lf.lfFaceName[nameSubstituteLength] = 0; + } + + IDWriteFont *directWriteFont = 0; + HRESULT hr = data->directWriteGdiInterop->CreateFontFromLOGFONT(&lf, &directWriteFont); + if (FAILED(hr)) { + qErrnoWarning("%s: CreateFontFromLOGFONT failed", __FUNCTION__); + } else { + Q_ASSERT(directWriteFont); + IDWriteFontFace *directWriteFontFace = NULL; + HRESULT hr = directWriteFont->CreateFontFace(&directWriteFontFace); + if (SUCCEEDED(hr)) { + Q_ASSERT(directWriteFontFace); + QWindowsFontEngineDirectWrite *fedw = new QWindowsFontEngineDirectWrite(directWriteFontFace, + fontEngine->fontDef.pixelSize, + data); + fedw->fontDef.weight = fontEngine->fontDef.weight; + if (fontEngine->fontDef.style > QFont::StyleNormal) + fedw->fontDef.style = fontEngine->fontDef.style; + fedw->fontDef.family = fam; + fedw->fontDef.hintingPreference = fontEngine->fontDef.hintingPreference; + return fedw; + } else { + qErrnoWarning("%s: CreateFontFace failed", __FUNCTION__); + } + } + } +#endif + + // Get here if original font is not DirectWrite or DirectWrite creation failed for some + // reason + + QFontEngine *fe = new QWindowsFontEngine(fam, lf, data); + fe->fontDef.weight = fontEngine->fontDef.weight; + if (fontEngine->fontDef.style > QFont::StyleNormal) + fe->fontDef.style = fontEngine->fontDef.style; + fe->fontDef.family = fam; + fe->fontDef.hintingPreference = fontEngine->fontDef.hintingPreference; + return fe; +} + +bool QWindowsFontEngine::supportsTransformation(const QTransform &transform) const +{ + // Support all transformations for ttf files, and translations for raster fonts + return ttf || transform.type() <= QTransform::TxTranslate; +} + +QT_END_NAMESPACE diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontengine_p.h b/src/platformsupport/fontdatabases/windows/qwindowsfontengine_p.h new file mode 100644 index 0000000000..709de7d11d --- /dev/null +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontengine_p.h @@ -0,0 +1,186 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWINDOWSFONTENGINE_H +#define QWINDOWSFONTENGINE_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include + +#include +#include +#include + +#include + +QT_BEGIN_NAMESPACE + +class QWindowsNativeImage; +class QWindowsFontEngineData; + +class QWindowsFontEngine : public QFontEngine +{ + friend class QWindowsMultiFontEngine; + +public: + QWindowsFontEngine(const QString &name, LOGFONT lf, + const QSharedPointer &fontEngineData); + + ~QWindowsFontEngine(); + void initFontInfo(const QFontDef &request, + int dpi); + + QFixed lineThickness() const Q_DECL_OVERRIDE; + Properties properties() const Q_DECL_OVERRIDE; + void getUnscaledGlyph(glyph_t glyph, QPainterPath *path, glyph_metrics_t *metrics) Q_DECL_OVERRIDE; + FaceId faceId() const Q_DECL_OVERRIDE; + bool getSfntTableData(uint tag, uchar *buffer, uint *length) const Q_DECL_OVERRIDE; + int synthesized() const Q_DECL_OVERRIDE; + QFixed emSquareSize() const Q_DECL_OVERRIDE; + + glyph_t glyphIndex(uint ucs4) const Q_DECL_OVERRIDE; + bool stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, int *nglyphs, ShaperFlags flags) const Q_DECL_OVERRIDE; + void recalcAdvances(QGlyphLayout *glyphs, ShaperFlags) const Q_DECL_OVERRIDE; + + void addOutlineToPath(qreal x, qreal y, const QGlyphLayout &glyphs, QPainterPath *path, QTextItem::RenderFlags flags) Q_DECL_OVERRIDE; + virtual void addGlyphsToPath(glyph_t *glyphs, QFixedPoint *positions, int nglyphs, + QPainterPath *path, QTextItem::RenderFlags flags) Q_DECL_OVERRIDE; + + HGDIOBJ selectDesignFont() const; + + glyph_metrics_t boundingBox(const QGlyphLayout &glyphs) Q_DECL_OVERRIDE; + glyph_metrics_t boundingBox(glyph_t g) Q_DECL_OVERRIDE { return boundingBox(g, QTransform()); } + glyph_metrics_t boundingBox(glyph_t g, const QTransform &t) Q_DECL_OVERRIDE; + + + QFixed ascent() const Q_DECL_OVERRIDE; + QFixed descent() const Q_DECL_OVERRIDE; + QFixed leading() const Q_DECL_OVERRIDE; + QFixed xHeight() const Q_DECL_OVERRIDE; + QFixed capHeight() const Q_DECL_OVERRIDE; + QFixed averageCharWidth() const Q_DECL_OVERRIDE; + qreal maxCharWidth() const Q_DECL_OVERRIDE; + qreal minLeftBearing() const Q_DECL_OVERRIDE; + qreal minRightBearing() const Q_DECL_OVERRIDE; + + QImage alphaMapForGlyph(glyph_t t) Q_DECL_OVERRIDE { return alphaMapForGlyph(t, QTransform()); } + QImage alphaMapForGlyph(glyph_t, const QTransform &xform) Q_DECL_OVERRIDE; + QImage alphaRGBMapForGlyph(glyph_t t, QFixed subPixelPosition, const QTransform &xform) Q_DECL_OVERRIDE; + glyph_metrics_t alphaMapBoundingBox(glyph_t glyph, QFixed, const QTransform &matrix, GlyphFormat) Q_DECL_OVERRIDE; + + QFontEngine *cloneWithSize(qreal pixelSize) const Q_DECL_OVERRIDE; + Qt::HANDLE handle() const Q_DECL_OVERRIDE; + bool supportsTransformation(const QTransform &transform) const Q_DECL_OVERRIDE; + +#ifndef Q_CC_MINGW + void getGlyphBearings(glyph_t glyph, qreal *leftBearing = 0, qreal *rightBearing = 0) Q_DECL_OVERRIDE; +#endif + + bool hasUnreliableGlyphOutline() const Q_DECL_OVERRIDE; + + int getGlyphIndexes(const QChar *ch, int numChars, QGlyphLayout *glyphs) const; + void getCMap(); + + bool getOutlineMetrics(glyph_t glyph, const QTransform &t, glyph_metrics_t *metrics) const; + + const QSharedPointer &fontEngineData() const { return m_fontEngineData; } + + void setUniqueFamilyName(const QString &newName) { uniqueFamilyName = newName; } + +private: + QWindowsNativeImage *drawGDIGlyph(HFONT font, glyph_t, int margin, const QTransform &xform, + QImage::Format mask_format); + bool hasCFFTable() const; + bool hasCMapTable() const; + bool hasGlyfTable() const; + bool hasEbdtTable() const; + + const QSharedPointer m_fontEngineData; + + const QString _name; + QString uniqueFamilyName; + HFONT hfont; + const LOGFONT m_logfont; + uint ttf : 1; + uint hasOutline : 1; + uint hasUnreliableOutline : 1; + uint cffTable : 1; + TEXTMETRIC tm; + const unsigned char *cmap; + int cmapSize; + QByteArray cmapTable; + mutable qreal lbearing; + mutable qreal rbearing; + QFixed designToDevice; + int unitsPerEm; + QFixed x_height; + FaceId _faceId; + + mutable int synthesized_flags; + mutable QFixed lineWidth; + mutable unsigned char *widthCache; + mutable uint widthCacheSize; + mutable QFixed *designAdvances; + mutable int designAdvancesSize; +}; + +class QWindowsMultiFontEngine : public QFontEngineMulti +{ +public: + explicit QWindowsMultiFontEngine(QFontEngine *fe, int script); + + QFontEngine *loadEngine(int at) Q_DECL_OVERRIDE; +}; + +QT_END_NAMESPACE + +Q_DECLARE_METATYPE(HFONT) +Q_DECLARE_METATYPE(LOGFONT) + +#endif // QWINDOWSFONTENGINE_H diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite.cpp new file mode 100644 index 0000000000..a1d8c2b9e8 --- /dev/null +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite.cpp @@ -0,0 +1,999 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QT_NO_DIRECTWRITE + +#include "qwindowsfontenginedirectwrite_p.h" +#include "qwindowsfontdatabase_p.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(QT_USE_DIRECTWRITE2) +# include +#else +# include +#endif + +#include + +QT_BEGIN_NAMESPACE + +// Convert from design units to logical pixels +#define DESIGN_TO_LOGICAL(DESIGN_UNIT_VALUE) \ + QFixed::fromReal((qreal(DESIGN_UNIT_VALUE) / qreal(m_unitsPerEm)) * fontDef.pixelSize) + +namespace { + + class GeometrySink: public IDWriteGeometrySink + { + public: + GeometrySink(QPainterPath *path) + : m_refCount(0), m_path(path) + { + Q_ASSERT(m_path != 0); + } + virtual ~GeometrySink() + { + } + + IFACEMETHOD_(void, AddBeziers)(const D2D1_BEZIER_SEGMENT *beziers, UINT bezierCount); + IFACEMETHOD_(void, AddLines)(const D2D1_POINT_2F *points, UINT pointCount); + IFACEMETHOD_(void, BeginFigure)(D2D1_POINT_2F startPoint, D2D1_FIGURE_BEGIN figureBegin); + IFACEMETHOD(Close)(); + IFACEMETHOD_(void, EndFigure)(D2D1_FIGURE_END figureEnd); + IFACEMETHOD_(void, SetFillMode)(D2D1_FILL_MODE fillMode); + IFACEMETHOD_(void, SetSegmentFlags)(D2D1_PATH_SEGMENT vertexFlags); + + IFACEMETHOD_(unsigned long, AddRef)(); + IFACEMETHOD_(unsigned long, Release)(); + IFACEMETHOD(QueryInterface)(IID const &riid, void **ppvObject); + + private: + inline static QPointF fromD2D1_POINT_2F(const D2D1_POINT_2F &inp) + { + return QPointF(inp.x, inp.y); + } + + unsigned long m_refCount; + QPointF m_startPoint; + QPainterPath *m_path; + }; + + void GeometrySink::AddBeziers(const D2D1_BEZIER_SEGMENT *beziers, + UINT bezierCount) + { + for (uint i=0; icubicTo(c1, c2, p2); + } + } + + void GeometrySink::AddLines(const D2D1_POINT_2F *points, UINT pointsCount) + { + for (uint i=0; ilineTo(fromD2D1_POINT_2F(points[i])); + } + + void GeometrySink::BeginFigure(D2D1_POINT_2F startPoint, + D2D1_FIGURE_BEGIN /*figureBegin*/) + { + m_startPoint = fromD2D1_POINT_2F(startPoint); + m_path->moveTo(m_startPoint); + } + + IFACEMETHODIMP GeometrySink::Close() + { + return E_NOTIMPL; + } + + void GeometrySink::EndFigure(D2D1_FIGURE_END figureEnd) + { + if (figureEnd == D2D1_FIGURE_END_CLOSED) + m_path->closeSubpath(); + } + + void GeometrySink::SetFillMode(D2D1_FILL_MODE fillMode) + { + m_path->setFillRule(fillMode == D2D1_FILL_MODE_ALTERNATE + ? Qt::OddEvenFill + : Qt::WindingFill); + } + + void GeometrySink::SetSegmentFlags(D2D1_PATH_SEGMENT /*vertexFlags*/) + { + /* Not implemented */ + } + + IFACEMETHODIMP_(unsigned long) GeometrySink::AddRef() + { + return InterlockedIncrement(&m_refCount); + } + + IFACEMETHODIMP_(unsigned long) GeometrySink::Release() + { + unsigned long newCount = InterlockedDecrement(&m_refCount); + if (newCount == 0) + { + delete this; + return 0; + } + + return newCount; + } + + IFACEMETHODIMP GeometrySink::QueryInterface(IID const &riid, void **ppvObject) + { + if (__uuidof(IDWriteGeometrySink) == riid) { + *ppvObject = this; + } else if (__uuidof(IUnknown) == riid) { + *ppvObject = this; + } else { + *ppvObject = NULL; + return E_FAIL; + } + + AddRef(); + return S_OK; + } + +} + +static DWRITE_RENDERING_MODE hintingPreferenceToRenderingMode(QFont::HintingPreference hintingPreference) +{ + switch (hintingPreference) { + case QFont::PreferNoHinting: + return DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC; + case QFont::PreferVerticalHinting: + return DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL; + default: + return DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC; + } +} + +/*! + \class QWindowsFontEngineDirectWrite + \brief Windows font engine using Direct Write. + \internal + \ingroup qt-lighthouse-win + + Font engine for subpixel positioned text on Windows Vista + (with platform update) and Windows 7. If selected during + configuration, the engine will be selected only when the hinting + preference of a font is set to None or Vertical hinting. The font + database uses most of the same logic but creates a direct write + font based on the LOGFONT rather than a GDI handle. + + Will probably be superseded by a common Free Type font engine in Qt 5.X. +*/ + +QWindowsFontEngineDirectWrite::QWindowsFontEngineDirectWrite(IDWriteFontFace *directWriteFontFace, + qreal pixelSize, + const QSharedPointer &d) + : QFontEngine(DirectWrite) + , m_fontEngineData(d) + , m_directWriteFontFace(directWriteFontFace) + , m_directWriteBitmapRenderTarget(0) + , m_lineThickness(-1) + , m_unitsPerEm(-1) + , m_ascent(-1) + , m_capHeight(-1) + , m_descent(-1) + , m_xHeight(-1) + , m_lineGap(-1) +{ + qCDebug(lcQpaFonts) << __FUNCTION__ << pixelSize; + + Q_ASSERT(m_directWriteFontFace); + + m_fontEngineData->directWriteFactory->AddRef(); + m_directWriteFontFace->AddRef(); + + fontDef.pixelSize = pixelSize; + collectMetrics(); + cache_cost = (m_ascent.toInt() + m_descent.toInt()) * m_xHeight.toInt() * 2000; +} + +QWindowsFontEngineDirectWrite::~QWindowsFontEngineDirectWrite() +{ + qCDebug(lcQpaFonts) << __FUNCTION__; + + m_fontEngineData->directWriteFactory->Release(); + m_directWriteFontFace->Release(); + + if (m_directWriteBitmapRenderTarget != 0) + m_directWriteBitmapRenderTarget->Release(); + + if (!m_uniqueFamilyName.isEmpty()) { + QPlatformFontDatabase *pfdb = QGuiApplicationPrivate::platformIntegration()->fontDatabase(); + static_cast(pfdb)->derefUniqueFont(m_uniqueFamilyName); + } +} + +#ifndef Q_CC_MINGW +typedef IDWriteLocalFontFileLoader QIdWriteLocalFontFileLoader; + +static UUID uuidIdWriteLocalFontFileLoader() +{ + return __uuidof(IDWriteLocalFontFileLoader); +} +#else // !Q_CC_MINGW +DECLARE_INTERFACE_(QIdWriteLocalFontFileLoader, IDWriteFontFileLoader) +{ + STDMETHOD(GetFilePathLengthFromKey)(THIS_ void const *, UINT32, UINT32*) PURE; + STDMETHOD(GetFilePathFromKey)(THIS_ void const *, UINT32, WCHAR *, UINT32) PURE; + STDMETHOD(GetLastWriteTimeFromKey)(THIS_ void const *, UINT32, FILETIME *) PURE; +}; + +static UUID uuidIdWriteLocalFontFileLoader() +{ + static const UUID result = { 0xb2d9f3ec, 0xc9fe, 0x4a11, {0xa2, 0xec, 0xd8, 0x62, 0x8, 0xf7, 0xc0, 0xa2}}; + return result; +} +#endif // Q_CC_MINGW + +QString QWindowsFontEngineDirectWrite::filenameFromFontFile(IDWriteFontFile *fontFile) +{ + IDWriteFontFileLoader *loader = Q_NULLPTR; + + HRESULT hr = fontFile->GetLoader(&loader); + if (FAILED(hr)) { + qErrnoWarning("%s: GetLoader failed", __FUNCTION__); + return QString(); + } + + QIdWriteLocalFontFileLoader *localLoader = Q_NULLPTR; + hr = loader->QueryInterface(uuidIdWriteLocalFontFileLoader(), + reinterpret_cast(&localLoader)); + + const void *fontFileReferenceKey = Q_NULLPTR; + UINT32 fontFileReferenceKeySize = 0; + if (SUCCEEDED(hr)) { + hr = fontFile->GetReferenceKey(&fontFileReferenceKey, + &fontFileReferenceKeySize); + if (FAILED(hr)) + qErrnoWarning(hr, "%s: GetReferenceKey failed", __FUNCTION__); + } + + UINT32 filePathLength = 0; + if (SUCCEEDED(hr)) { + hr = localLoader->GetFilePathLengthFromKey(fontFileReferenceKey, + fontFileReferenceKeySize, + &filePathLength); + if (FAILED(hr)) + qErrnoWarning(hr, "GetFilePathLength failed", __FUNCTION__); + } + + QString ret; + if (SUCCEEDED(hr) && filePathLength > 0) { + QVarLengthArray filePath(filePathLength + 1); + + hr = localLoader->GetFilePathFromKey(fontFileReferenceKey, + fontFileReferenceKeySize, + filePath.data(), + filePathLength + 1); + if (FAILED(hr)) + qErrnoWarning(hr, "%s: GetFilePathFromKey failed", __FUNCTION__); + else + ret = QString::fromWCharArray(filePath.data()); + } + + if (localLoader != Q_NULLPTR) + localLoader->Release(); + + if (loader != Q_NULLPTR) + loader->Release(); + return ret; +} + +void QWindowsFontEngineDirectWrite::collectMetrics() +{ + DWRITE_FONT_METRICS metrics; + + m_directWriteFontFace->GetMetrics(&metrics); + m_unitsPerEm = metrics.designUnitsPerEm; + + m_lineThickness = DESIGN_TO_LOGICAL(metrics.underlineThickness); + m_ascent = DESIGN_TO_LOGICAL(metrics.ascent); + m_capHeight = DESIGN_TO_LOGICAL(metrics.capHeight); + m_descent = DESIGN_TO_LOGICAL(metrics.descent); + m_xHeight = DESIGN_TO_LOGICAL(metrics.xHeight); + m_lineGap = DESIGN_TO_LOGICAL(metrics.lineGap); + m_underlinePosition = DESIGN_TO_LOGICAL(metrics.underlinePosition); + + IDWriteFontFile *fontFile = Q_NULLPTR; + UINT32 numberOfFiles = 1; + if (SUCCEEDED(m_directWriteFontFace->GetFiles(&numberOfFiles, &fontFile))) { + m_faceId.filename = QFile::encodeName(filenameFromFontFile(fontFile)); + fontFile->Release(); + } +} + +QFixed QWindowsFontEngineDirectWrite::underlinePosition() const +{ + if (m_underlinePosition > 0) + return m_underlinePosition; + else + return QFontEngine::underlinePosition(); +} + +QFixed QWindowsFontEngineDirectWrite::lineThickness() const +{ + if (m_lineThickness > 0) + return m_lineThickness; + else + return QFontEngine::lineThickness(); +} + +bool QWindowsFontEngineDirectWrite::getSfntTableData(uint tag, uchar *buffer, uint *length) const +{ + bool ret = false; + + const void *tableData = 0; + UINT32 tableSize; + void *tableContext = 0; + BOOL exists; + HRESULT hr = m_directWriteFontFace->TryGetFontTable(qbswap(tag), + &tableData, &tableSize, + &tableContext, &exists); + if (SUCCEEDED(hr)) { + if (exists) { + ret = true; + if (buffer && *length >= tableSize) + memcpy(buffer, tableData, tableSize); + *length = tableSize; + Q_ASSERT(int(*length) > 0); + } + m_directWriteFontFace->ReleaseFontTable(tableContext); + } else { + qErrnoWarning("%s: TryGetFontTable failed", __FUNCTION__); + } + + return ret; +} + +QFixed QWindowsFontEngineDirectWrite::emSquareSize() const +{ + if (m_unitsPerEm > 0) + return m_unitsPerEm; + else + return QFontEngine::emSquareSize(); +} + +glyph_t QWindowsFontEngineDirectWrite::glyphIndex(uint ucs4) const +{ + UINT16 glyphIndex; + + HRESULT hr = m_directWriteFontFace->GetGlyphIndicesW(&ucs4, 1, &glyphIndex); + if (FAILED(hr)) { + qErrnoWarning("%s: glyphIndex failed", __FUNCTION__); + glyphIndex = 0; + } + + return glyphIndex; +} + +bool QWindowsFontEngineDirectWrite::stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, + int *nglyphs, QFontEngine::ShaperFlags flags) const +{ + Q_ASSERT(glyphs->numGlyphs >= *nglyphs); + if (*nglyphs < len) { + *nglyphs = len; + return false; + } + + QVarLengthArray codePoints(len); + int actualLength = 0; + QStringIterator it(str, str + len); + while (it.hasNext()) + codePoints[actualLength++] = it.next(); + + QVarLengthArray glyphIndices(actualLength); + HRESULT hr = m_directWriteFontFace->GetGlyphIndicesW(codePoints.data(), actualLength, + glyphIndices.data()); + if (FAILED(hr)) { + qErrnoWarning("%s: GetGlyphIndicesW failed", __FUNCTION__); + return false; + } + + for (int i = 0; i < actualLength; ++i) + glyphs->glyphs[i] = glyphIndices.at(i); + + *nglyphs = actualLength; + glyphs->numGlyphs = actualLength; + + if (!(flags & GlyphIndicesOnly)) + recalcAdvances(glyphs, 0); + + return true; +} + +QFontEngine::FaceId QWindowsFontEngineDirectWrite::faceId() const +{ + return m_faceId; +} + +void QWindowsFontEngineDirectWrite::recalcAdvances(QGlyphLayout *glyphs, QFontEngine::ShaperFlags) const +{ + QVarLengthArray glyphIndices(glyphs->numGlyphs); + + // ### Caching? + for(int i=0; inumGlyphs; i++) + glyphIndices[i] = UINT16(glyphs->glyphs[i]); + + QVarLengthArray glyphMetrics(glyphIndices.size()); + HRESULT hr = m_directWriteFontFace->GetDesignGlyphMetrics(glyphIndices.data(), + glyphIndices.size(), + glyphMetrics.data()); + if (SUCCEEDED(hr)) { + qreal stretch = fontDef.stretch != QFont::AnyStretch ? fontDef.stretch / 100.0 : 1.0; + for (int i = 0; i < glyphs->numGlyphs; ++i) + glyphs->advances[i] = DESIGN_TO_LOGICAL(glyphMetrics[i].advanceWidth * stretch); + if (fontDef.styleStrategy & QFont::ForceIntegerMetrics) { + for (int i = 0; i < glyphs->numGlyphs; ++i) + glyphs->advances[i] = glyphs->advances[i].round(); + } + } else { + qErrnoWarning("%s: GetDesignGlyphMetrics failed", __FUNCTION__); + } +} + +void QWindowsFontEngineDirectWrite::addGlyphsToPath(glyph_t *glyphs, QFixedPoint *positions, int nglyphs, + QPainterPath *path, QTextItem::RenderFlags flags) +{ + QVarLengthArray glyphIndices(nglyphs); + QVarLengthArray glyphOffsets(nglyphs); + QVarLengthArray glyphAdvances(nglyphs); + + for (int i=0; iGetGlyphRunOutline( + fontDef.pixelSize, + glyphIndices.data(), + glyphAdvances.data(), + glyphOffsets.data(), + nglyphs, + false, + flags & QTextItem::RightToLeft, + &geometrySink + ); + + if (FAILED(hr)) + qErrnoWarning("%s: GetGlyphRunOutline failed", __FUNCTION__); +} + +glyph_metrics_t QWindowsFontEngineDirectWrite::boundingBox(const QGlyphLayout &glyphs) +{ + if (glyphs.numGlyphs == 0) + return glyph_metrics_t(); + + bool round = fontDef.styleStrategy & QFont::ForceIntegerMetrics; + + QFixed w = 0; + for (int i = 0; i < glyphs.numGlyphs; ++i) { + w += round ? glyphs.effectiveAdvance(i).round() : glyphs.effectiveAdvance(i); + + } + + return glyph_metrics_t(0, -m_ascent, w - lastRightBearing(glyphs), m_ascent + m_descent, w, 0); +} + +glyph_metrics_t QWindowsFontEngineDirectWrite::boundingBox(glyph_t g) +{ + UINT16 glyphIndex = g; + + DWRITE_GLYPH_METRICS glyphMetrics; + HRESULT hr = m_directWriteFontFace->GetDesignGlyphMetrics(&glyphIndex, 1, &glyphMetrics); + if (SUCCEEDED(hr)) { + QFixed advanceWidth = DESIGN_TO_LOGICAL(glyphMetrics.advanceWidth); + QFixed leftSideBearing = DESIGN_TO_LOGICAL(glyphMetrics.leftSideBearing); + QFixed rightSideBearing = DESIGN_TO_LOGICAL(glyphMetrics.rightSideBearing); + QFixed advanceHeight = DESIGN_TO_LOGICAL(glyphMetrics.advanceHeight); + QFixed verticalOriginY = DESIGN_TO_LOGICAL(glyphMetrics.verticalOriginY); + QFixed topSideBearing = DESIGN_TO_LOGICAL(glyphMetrics.topSideBearing); + QFixed bottomSideBearing = DESIGN_TO_LOGICAL(glyphMetrics.bottomSideBearing); + + if (fontDef.styleStrategy & QFont::ForceIntegerMetrics) { + advanceWidth = advanceWidth.round(); + advanceHeight = advanceHeight.round(); + } + + QFixed width = advanceWidth - leftSideBearing - rightSideBearing; + QFixed height = advanceHeight - topSideBearing - bottomSideBearing; + return glyph_metrics_t(leftSideBearing, + -verticalOriginY + topSideBearing, + width, + height, + advanceWidth, + 0); + } else { + qErrnoWarning("%s: GetDesignGlyphMetrics failed", __FUNCTION__); + } + + return glyph_metrics_t(); +} + +QFixed QWindowsFontEngineDirectWrite::ascent() const +{ + return fontDef.styleStrategy & QFont::ForceIntegerMetrics + ? m_ascent.round() + : m_ascent; +} + +QFixed QWindowsFontEngineDirectWrite::capHeight() const +{ + if (m_capHeight <= 0) + return calculatedCapHeight(); + + return fontDef.styleStrategy & QFont::ForceIntegerMetrics + ? m_capHeight.round() + : m_capHeight; +} + +QFixed QWindowsFontEngineDirectWrite::descent() const +{ + return fontDef.styleStrategy & QFont::ForceIntegerMetrics + ? m_descent.round() + : m_descent; +} + +QFixed QWindowsFontEngineDirectWrite::leading() const +{ + return fontDef.styleStrategy & QFont::ForceIntegerMetrics + ? m_lineGap.round() + : m_lineGap; +} + +QFixed QWindowsFontEngineDirectWrite::xHeight() const +{ + return fontDef.styleStrategy & QFont::ForceIntegerMetrics + ? m_xHeight.round() + : m_xHeight; +} + +qreal QWindowsFontEngineDirectWrite::maxCharWidth() const +{ + // ### + return 0; +} + +QImage QWindowsFontEngineDirectWrite::alphaMapForGlyph(glyph_t glyph, QFixed subPixelPosition, const QTransform &t) +{ + QImage im = alphaRGBMapForGlyph(glyph, subPixelPosition, t); + + QImage alphaMap(im.width(), im.height(), QImage::Format_Alpha8); + + for (int y=0; y(im.constScanLine(y)); + uchar *dst = alphaMap.scanLine(y); + for (int x=0; xpow_gamma[qGray(0xffffffff - *src)] * 255. / 2047.); + ++dst; + ++src; + } + } + + return alphaMap; +} + +QImage QWindowsFontEngineDirectWrite::alphaMapForGlyph(glyph_t glyph, QFixed subPixelPosition) +{ + return alphaMapForGlyph(glyph, subPixelPosition, QTransform()); +} + +bool QWindowsFontEngineDirectWrite::supportsSubPixelPositions() const +{ + return true; +} + +QImage QWindowsFontEngineDirectWrite::imageForGlyph(glyph_t t, + QFixed subPixelPosition, + int margin, + const QTransform &originalTransform) +{ + UINT16 glyphIndex = t; + FLOAT glyphAdvance = 0; + + DWRITE_GLYPH_OFFSET glyphOffset; + glyphOffset.advanceOffset = 0; + glyphOffset.ascenderOffset = 0; + + DWRITE_GLYPH_RUN glyphRun; + glyphRun.fontFace = m_directWriteFontFace; + glyphRun.fontEmSize = fontDef.pixelSize; + glyphRun.glyphCount = 1; + glyphRun.glyphIndices = &glyphIndex; + glyphRun.glyphAdvances = &glyphAdvance; + glyphRun.isSideways = false; + glyphRun.bidiLevel = 0; + glyphRun.glyphOffsets = &glyphOffset; + + QTransform xform = originalTransform; + if (fontDef.stretch != 100) + xform.scale(fontDef.stretch / 100.0, 1.0); + + DWRITE_MATRIX transform; + transform.dx = subPixelPosition.toReal(); + transform.dy = 0; + transform.m11 = xform.m11(); + transform.m12 = xform.m12(); + transform.m21 = xform.m21(); + transform.m22 = xform.m22(); + + DWRITE_RENDERING_MODE renderMode = + hintingPreferenceToRenderingMode(QFont::HintingPreference(fontDef.hintingPreference)); + + IDWriteGlyphRunAnalysis *glyphAnalysis = NULL; + HRESULT hr = m_fontEngineData->directWriteFactory->CreateGlyphRunAnalysis( + &glyphRun, + 1.0f, + &transform, + renderMode, + DWRITE_MEASURING_MODE_NATURAL, + 0.0, 0.0, + &glyphAnalysis + ); + + if (SUCCEEDED(hr)) { + RECT rect; + glyphAnalysis->GetAlphaTextureBounds(DWRITE_TEXTURE_CLEARTYPE_3x1, &rect); + + QRect boundingRect = QRect(QPoint(rect.left - margin, + rect.top - margin), + QPoint(rect.right + margin, + rect.bottom + margin)); + + + const int width = boundingRect.width() - 1; // -1 due to Qt's off-by-one definition of a QRect + const int height = boundingRect.height() - 1; + + QImage image; +#if defined(QT_USE_DIRECTWRITE2) + HRESULT hr = DWRITE_E_NOCOLOR; + IDWriteColorGlyphRunEnumerator *enumerator = 0; + IDWriteFactory2 *factory2 = Q_NULLPTR; + if (glyphFormat == QFontEngine::Format_ARGB + && SUCCEEDED(m_fontEngineData->directWriteFactory->QueryInterface(__uuidof(IDWriteFactory2), + reinterpret_cast(&factory2)))) { + hr = factory2->TranslateColorGlyphRun(0.0f, + 0.0f, + &glyphRun, + NULL, + DWRITE_MEASURING_MODE_NATURAL, + NULL, + 0, + &enumerator); + image = QImage(width, height, QImage::Format_ARGB32_Premultiplied); + image.fill(0); + } else +#endif + { + image = QImage(width, height, QImage::Format_RGB32); + image.fill(0xffffffff); + } + +#if defined(QT_USE_DIRECTWRITE2) + BOOL ok = true; + if (SUCCEEDED(hr)) { + while (SUCCEEDED(hr) && ok) { + const DWRITE_COLOR_GLYPH_RUN *colorGlyphRun = 0; + hr = enumerator->GetCurrentRun(&colorGlyphRun); + if (FAILED(hr)) { // No colored runs, only outline + qErrnoWarning(hr, "%s: IDWriteColorGlyphRunEnumerator::GetCurrentRun failed", __FUNCTION__); + break; + } + + IDWriteGlyphRunAnalysis *colorGlyphsAnalysis = NULL; + hr = m_fontEngineData->directWriteFactory->CreateGlyphRunAnalysis( + &colorGlyphRun->glyphRun, + 1.0f, + &transform, + renderMode, + DWRITE_MEASURING_MODE_NATURAL, + 0.0, 0.0, + &colorGlyphsAnalysis + ); + if (FAILED(hr)) { + qErrnoWarning(hr, "%s: CreateGlyphRunAnalysis failed for color run", __FUNCTION__); + break; + } + + float r = qBound(0.0f, colorGlyphRun->runColor.r, 1.0f); + float g = qBound(0.0f, colorGlyphRun->runColor.g, 1.0f); + float b = qBound(0.0f, colorGlyphRun->runColor.b, 1.0f); + float a = qBound(0.0f, colorGlyphRun->runColor.a, 1.0f); + + if (!qFuzzyIsNull(a)) { + renderGlyphRun(&image, + r, + g, + b, + a, + colorGlyphsAnalysis, + boundingRect); + } + colorGlyphsAnalysis->Release(); + + hr = enumerator->MoveNext(&ok); + if (FAILED(hr)) { + qErrnoWarning(hr, "%s: IDWriteColorGlyphRunEnumerator::MoveNext failed", __FUNCTION__); + break; + } + } + } else +#endif + { + renderGlyphRun(&image, + 0.0, + 0.0, + 0.0, + 1.0, + glyphAnalysis, + boundingRect); + } + + glyphAnalysis->Release(); + return image; + } else { + qErrnoWarning(hr, "%s: CreateGlyphRunAnalysis failed", __FUNCTION__); + return QImage(); + } +} + + +void QWindowsFontEngineDirectWrite::renderGlyphRun(QImage *destination, + float r, + float g, + float b, + float a, + IDWriteGlyphRunAnalysis *glyphAnalysis, + const QRect &boundingRect) +{ + const int width = destination->width(); + const int height = destination->height(); + + r *= 255.0; + g *= 255.0; + b *= 255.0; + + const int size = width * height * 3; + if (size > 0) { + RECT rect; + rect.left = boundingRect.left(); + rect.top = boundingRect.top(); + rect.right = boundingRect.right(); + rect.bottom = boundingRect.bottom(); + + QVarLengthArray alphaValueArray(size); + BYTE *alphaValues = alphaValueArray.data(); + memset(alphaValues, 0, size); + + HRESULT hr = glyphAnalysis->CreateAlphaTexture(DWRITE_TEXTURE_CLEARTYPE_3x1, + &rect, + alphaValues, + size); + if (SUCCEEDED(hr)) { + if (destination->hasAlphaChannel()) { + for (int y = 0; y < height; ++y) { + uint *dest = reinterpret_cast(destination->scanLine(y)); + BYTE *src = alphaValues + width * 3 * y; + + for (int x = 0; x < width; ++x) { + float redAlpha = a * *src++ / 255.0; + float greenAlpha = a * *src++ / 255.0; + float blueAlpha = a * *src++ / 255.0; + float averageAlpha = (redAlpha + greenAlpha + blueAlpha) / 3.0; + + QRgb currentRgb = dest[x]; + dest[x] = qRgba(qRound(qRed(currentRgb) * (1.0 - averageAlpha) + averageAlpha * r), + qRound(qGreen(currentRgb) * (1.0 - averageAlpha) + averageAlpha * g), + qRound(qBlue(currentRgb) * (1.0 - averageAlpha) + averageAlpha * b), + qRound(qAlpha(currentRgb) * (1.0 - averageAlpha) + averageAlpha * 255)); + } + } + + } else { + for (int y = 0; y < height; ++y) { + uint *dest = reinterpret_cast(destination->scanLine(y)); + BYTE *src = alphaValues + width * 3 * y; + + for (int x = 0; x < width; ++x) { + dest[x] = *(src + 0) << 16 + | *(src + 1) << 8 + | *(src + 2); + + src += 3; + } + } + } + } else { + qErrnoWarning("%s: CreateAlphaTexture failed", __FUNCTION__); + } + } else { + glyphAnalysis->Release(); + qWarning("%s: Glyph has no bounds", __FUNCTION__); + } +} + +QImage QWindowsFontEngineDirectWrite::alphaRGBMapForGlyph(glyph_t t, + QFixed subPixelPosition, + const QTransform &xform) +{ + QImage mask = imageForGlyph(t, + subPixelPosition, + glyphMargin(QFontEngine::Format_A32), + xform); + + return mask.depth() == 32 + ? mask + : mask.convertToFormat(QImage::Format_RGB32); +} + +QFontEngine *QWindowsFontEngineDirectWrite::cloneWithSize(qreal pixelSize) const +{ + QWindowsFontEngineDirectWrite *fontEngine = new QWindowsFontEngineDirectWrite(m_directWriteFontFace, + pixelSize, + m_fontEngineData); + + fontEngine->fontDef = fontDef; + fontEngine->fontDef.pixelSize = pixelSize; + if (!m_uniqueFamilyName.isEmpty()) { + fontEngine->setUniqueFamilyName(m_uniqueFamilyName); + QPlatformFontDatabase *pfdb = QGuiApplicationPrivate::platformIntegration()->fontDatabase(); + static_cast(pfdb)->refUniqueFont(m_uniqueFamilyName); + } + + return fontEngine; +} + +Qt::HANDLE QWindowsFontEngineDirectWrite::handle() const +{ + return m_directWriteFontFace; +} + +void QWindowsFontEngineDirectWrite::initFontInfo(const QFontDef &request, + int dpi) +{ + fontDef = request; + + if (fontDef.pointSize < 0) + fontDef.pointSize = fontDef.pixelSize * 72. / dpi; + else if (fontDef.pixelSize == -1) + fontDef.pixelSize = qRound(fontDef.pointSize * dpi / 72.); +} + +QString QWindowsFontEngineDirectWrite::fontNameSubstitute(const QString &familyName) +{ + static const char keyC[] = "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\" + "FontSubstitutes"; + return QSettings(QLatin1String(keyC), QSettings::NativeFormat).value(familyName, familyName).toString(); +} + +glyph_metrics_t QWindowsFontEngineDirectWrite::alphaMapBoundingBox(glyph_t glyph, + QFixed subPixelPosition, + const QTransform &originalTransform, + GlyphFormat format) +{ + Q_UNUSED(format); + + QTransform matrix = originalTransform; + if (fontDef.stretch != 100) + matrix.scale(fontDef.stretch / 100.0, 1.0); + + glyph_metrics_t bbox = QFontEngine::boundingBox(glyph, matrix); // To get transformed advance + + UINT16 glyphIndex = glyph; + FLOAT glyphAdvance = 0; + + DWRITE_GLYPH_OFFSET glyphOffset; + glyphOffset.advanceOffset = 0; + glyphOffset.ascenderOffset = 0; + + DWRITE_GLYPH_RUN glyphRun; + glyphRun.fontFace = m_directWriteFontFace; + glyphRun.fontEmSize = fontDef.pixelSize; + glyphRun.glyphCount = 1; + glyphRun.glyphIndices = &glyphIndex; + glyphRun.glyphAdvances = &glyphAdvance; + glyphRun.isSideways = false; + glyphRun.bidiLevel = 0; + glyphRun.glyphOffsets = &glyphOffset; + + DWRITE_MATRIX transform; + transform.dx = subPixelPosition.toReal(); + transform.dy = 0; + transform.m11 = matrix.m11(); + transform.m12 = matrix.m12(); + transform.m21 = matrix.m21(); + transform.m22 = matrix.m22(); + + DWRITE_RENDERING_MODE renderMode = + hintingPreferenceToRenderingMode(QFont::HintingPreference(fontDef.hintingPreference)); + + IDWriteGlyphRunAnalysis *glyphAnalysis = NULL; + HRESULT hr = m_fontEngineData->directWriteFactory->CreateGlyphRunAnalysis( + &glyphRun, + 1.0f, + &transform, + renderMode, + DWRITE_MEASURING_MODE_NATURAL, + 0.0, 0.0, + &glyphAnalysis + ); + + if (SUCCEEDED(hr)) { + RECT rect; + glyphAnalysis->GetAlphaTextureBounds(DWRITE_TEXTURE_CLEARTYPE_3x1, &rect); + glyphAnalysis->Release(); + + int margin = glyphMargin(QFontEngine::Format_A32); + + return glyph_metrics_t(rect.left, + rect.top, + rect.right - rect.left + margin * 2, + rect.bottom - rect.top + margin * 2, + bbox.xoff, bbox.yoff); + } else { + return glyph_metrics_t(); + } +} + +QImage QWindowsFontEngineDirectWrite::bitmapForGlyph(glyph_t glyph, QFixed subPixelPosition, const QTransform &t) +{ + return imageForGlyph(glyph, subPixelPosition, glyphMargin(QFontEngine::Format_A32), t); +} + +QT_END_NAMESPACE + +#endif // QT_NO_DIRECTWRITE diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite_p.h b/src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite_p.h new file mode 100644 index 0000000000..65b16b9ba7 --- /dev/null +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite_p.h @@ -0,0 +1,154 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWINDOWSFONTENGINEDIRECTWRITE_H +#define QWINDOWSFONTENGINEDIRECTWRITE_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include + +#ifndef QT_NO_DIRECTWRITE + +#include +#include + +struct IDWriteFont; +struct IDWriteFontFace; +struct IDWriteFontFile; +struct IDWriteFactory; +struct IDWriteBitmapRenderTarget; +struct IDWriteGdiInterop; +struct IDWriteGlyphRunAnalysis; + +QT_BEGIN_NAMESPACE + +class QWindowsFontEngineData; + +class QWindowsFontEngineDirectWrite : public QFontEngine +{ +public: + explicit QWindowsFontEngineDirectWrite(IDWriteFontFace *directWriteFontFace, + qreal pixelSize, + const QSharedPointer &d); + ~QWindowsFontEngineDirectWrite(); + + void initFontInfo(const QFontDef &request, int dpi); + + QFixed lineThickness() const Q_DECL_OVERRIDE; + QFixed underlinePosition() const Q_DECL_OVERRIDE; + bool getSfntTableData(uint tag, uchar *buffer, uint *length) const Q_DECL_OVERRIDE; + QFixed emSquareSize() const Q_DECL_OVERRIDE; + + glyph_t glyphIndex(uint ucs4) const Q_DECL_OVERRIDE; + bool stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, int *nglyphs, + ShaperFlags flags) const Q_DECL_OVERRIDE; + void recalcAdvances(QGlyphLayout *glyphs, ShaperFlags) const Q_DECL_OVERRIDE; + + void addGlyphsToPath(glyph_t *glyphs, QFixedPoint *positions, int nglyphs, + QPainterPath *path, QTextItem::RenderFlags flags) Q_DECL_OVERRIDE; + + glyph_metrics_t boundingBox(const QGlyphLayout &glyphs) Q_DECL_OVERRIDE; + glyph_metrics_t boundingBox(glyph_t g) Q_DECL_OVERRIDE; + glyph_metrics_t alphaMapBoundingBox(glyph_t glyph, QFixed, + const QTransform &matrix, GlyphFormat) Q_DECL_OVERRIDE; + + QFixed ascent() const Q_DECL_OVERRIDE; + QFixed capHeight() const Q_DECL_OVERRIDE; + QFixed descent() const Q_DECL_OVERRIDE; + QFixed leading() const Q_DECL_OVERRIDE; + QFixed xHeight() const Q_DECL_OVERRIDE; + qreal maxCharWidth() const Q_DECL_OVERRIDE; + FaceId faceId() const Q_DECL_OVERRIDE; + + bool supportsSubPixelPositions() const Q_DECL_OVERRIDE; + + QImage alphaMapForGlyph(glyph_t glyph, QFixed subPixelPosition) Q_DECL_OVERRIDE; + QImage alphaMapForGlyph(glyph_t glyph, QFixed subPixelPosition, const QTransform &t) Q_DECL_OVERRIDE; + QImage alphaRGBMapForGlyph(glyph_t t, QFixed subPixelPosition, const QTransform &xform) Q_DECL_OVERRIDE; + QImage bitmapForGlyph(glyph_t, QFixed subPixelPosition, const QTransform &t) Q_DECL_OVERRIDE; + + QFontEngine *cloneWithSize(qreal pixelSize) const Q_DECL_OVERRIDE; + Qt::HANDLE handle() const Q_DECL_OVERRIDE; + + const QSharedPointer &fontEngineData() const { return m_fontEngineData; } + + static QString fontNameSubstitute(const QString &familyName); + + IDWriteFontFace *directWriteFontFace() const { return m_directWriteFontFace; } + + void setUniqueFamilyName(const QString &newName) { m_uniqueFamilyName = newName; } + +private: + QImage imageForGlyph(glyph_t t, QFixed subPixelPosition, int margin, const QTransform &xform); + void collectMetrics(); + void renderGlyphRun(QImage *destination, float r, float g, float b, float a, IDWriteGlyphRunAnalysis *glyphAnalysis, const QRect &boundingRect); + static QString filenameFromFontFile(IDWriteFontFile *fontFile); + + const QSharedPointer m_fontEngineData; + + IDWriteFontFace *m_directWriteFontFace; + IDWriteBitmapRenderTarget *m_directWriteBitmapRenderTarget; + + QFixed m_lineThickness; + QFixed m_underlinePosition; + int m_unitsPerEm; + QFixed m_ascent; + QFixed m_capHeight; + QFixed m_descent; + QFixed m_xHeight; + QFixed m_lineGap; + FaceId m_faceId; + QString m_uniqueFamilyName; +}; + +QT_END_NAMESPACE + +#endif // QT_NO_DIRECTWRITE + +#endif // QWINDOWSFONTENGINEDIRECTWRITE_H diff --git a/src/platformsupport/fontdatabases/windows/qwindowsnativeimage.cpp b/src/platformsupport/fontdatabases/windows/qwindowsnativeimage.cpp new file mode 100644 index 0000000000..7022615511 --- /dev/null +++ b/src/platformsupport/fontdatabases/windows/qwindowsnativeimage.cpp @@ -0,0 +1,159 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwindowsnativeimage_p.h" + +#include +#include + +QT_BEGIN_NAMESPACE + +typedef struct { + BITMAPINFOHEADER bmiHeader; + DWORD redMask; + DWORD greenMask; + DWORD blueMask; +} BITMAPINFO_MASK; + +/*! + \class QWindowsNativeImage + \brief Windows Native image + + Note that size can be 0 (widget autotests with zero size), which + causes CreateDIBSection() to fail. + + \sa QWindowsBackingStore + \internal + \ingroup qt-lighthouse-win +*/ + +static inline HDC createDC() +{ + HDC display_dc = GetDC(0); + HDC hdc = CreateCompatibleDC(display_dc); + ReleaseDC(0, display_dc); + Q_ASSERT(hdc); + return hdc; +} + +static inline HBITMAP createDIB(HDC hdc, int width, int height, + QImage::Format format, + uchar **bitsIn) +{ + BITMAPINFO_MASK bmi; + memset(&bmi, 0, sizeof(bmi)); + bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bmi.bmiHeader.biWidth = width; + bmi.bmiHeader.biHeight = -height; // top-down. + bmi.bmiHeader.biPlanes = 1; + bmi.bmiHeader.biSizeImage = 0; + + if (format == QImage::Format_RGB16) { + bmi.bmiHeader.biBitCount = 16; + bmi.bmiHeader.biCompression = BI_BITFIELDS; + bmi.redMask = 0xF800; + bmi.greenMask = 0x07E0; + bmi.blueMask = 0x001F; + } else { + bmi.bmiHeader.biBitCount = 32; + bmi.bmiHeader.biCompression = BI_RGB; + bmi.redMask = 0; + bmi.greenMask = 0; + bmi.blueMask = 0; + } + + uchar *bits = Q_NULLPTR; + HBITMAP bitmap = CreateDIBSection(hdc, reinterpret_cast(&bmi), + DIB_RGB_COLORS, reinterpret_cast(&bits), 0, 0); + if (Q_UNLIKELY(!bitmap || !bits)) + qFatal("%s: CreateDIBSection failed.", __FUNCTION__); + + *bitsIn = bits; + return bitmap; +} + +QWindowsNativeImage::QWindowsNativeImage(int width, int height, + QImage::Format format) : + m_hdc(createDC()), + m_bitmap(0), + m_null_bitmap(0) +{ + if (width != 0 && height != 0) { + uchar *bits; + m_bitmap = createDIB(m_hdc, width, height, format, &bits); + m_null_bitmap = static_cast(SelectObject(m_hdc, m_bitmap)); + m_image = QImage(bits, width, height, format); + Q_ASSERT(m_image.paintEngine()->type() == QPaintEngine::Raster); + static_cast(m_image.paintEngine())->setDC(m_hdc); + } else { + m_image = QImage(width, height, format); + } + + GdiFlush(); +} + +QWindowsNativeImage::~QWindowsNativeImage() +{ + if (m_hdc) { + if (m_bitmap) { + if (m_null_bitmap) + SelectObject(m_hdc, m_null_bitmap); + DeleteObject(m_bitmap); + } + DeleteDC(m_hdc); + } +} + +QImage::Format QWindowsNativeImage::systemFormat() +{ + static int depth = -1; + if (depth == -1) { + if (HDC defaultDC = GetDC(0)) { + depth = GetDeviceCaps(defaultDC, BITSPIXEL); + ReleaseDC(0, defaultDC); + } else { + // FIXME Same remark as in QWindowsFontDatabase::defaultVerticalDPI() + // BONUS FIXME: Is 32 too generous/optimistic? + depth = 32; + } + } + return depth == 16 ? QImage::Format_RGB16 : QImage::Format_RGB32; +} + +QT_END_NAMESPACE diff --git a/src/platformsupport/fontdatabases/windows/qwindowsnativeimage_p.h b/src/platformsupport/fontdatabases/windows/qwindowsnativeimage_p.h new file mode 100644 index 0000000000..c27c0d1e98 --- /dev/null +++ b/src/platformsupport/fontdatabases/windows/qwindowsnativeimage_p.h @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWINDOWSNATIVEIMAGE_H +#define QWINDOWSNATIVEIMAGE_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QWindowsNativeImage +{ + Q_DISABLE_COPY(QWindowsNativeImage) +public: + QWindowsNativeImage(int width, int height, + QImage::Format format); + + ~QWindowsNativeImage(); + + inline int width() const { return m_image.width(); } + inline int height() const { return m_image.height(); } + + QImage &image() { return m_image; } + const QImage &image() const { return m_image; } + + HDC hdc() const { return m_hdc; } + + static QImage::Format systemFormat(); + +private: + const HDC m_hdc; + QImage m_image; + + HBITMAP m_bitmap; + HBITMAP m_null_bitmap; +}; + +QT_END_NAMESPACE + +#endif // QWINDOWSNATIVEIMAGE_H diff --git a/src/platformsupport/fontdatabases/windows/windows.pri b/src/platformsupport/fontdatabases/windows/windows.pri new file mode 100644 index 0000000000..419c4dc6d9 --- /dev/null +++ b/src/platformsupport/fontdatabases/windows/windows.pri @@ -0,0 +1,33 @@ +QT *= gui-private + +SOURCES += \ + $$PWD/qwindowsfontdatabase.cpp \ + $$PWD/qwindowsfontengine.cpp \ + $$PWD/qwindowsnativeimage.cpp + +HEADERS += \ + $$PWD/qwindowsfontdatabase_p.h \ + $$PWD/qwindowsfontengine_p.h \ + $$PWD/qwindowsnativeimage_p.h + +qtConfig(freetype) { + SOURCES += $$PWD/qwindowsfontdatabase_ft.cpp + HEADERS += $$PWD/qwindowsfontdatabase_ft_p.h + qtConfig(system-freetype) { + include($$QT_SOURCE_TREE/src/platformsupport/fontdatabases/basic/basic.pri) + } else { + include($$QT_SOURCE_TREE/src/3rdparty/freetype_dependency.pri) + } +} + +qtConfig(directwrite) { + qtConfig(directwrite2): \ + DEFINES *= QT_USE_DIRECTWRITE2 + + SOURCES += $$PWD/qwindowsfontenginedirectwrite.cpp + HEADERS += $$PWD/qwindowsfontenginedirectwrite_p.h +} else { + DEFINES *= QT_NO_DIRECTWRITE +} + +LIBS += -lole32 -lgdi32 -luser32 diff --git a/src/platformsupport/platformsupport.pro b/src/platformsupport/platformsupport.pro index 5161ce3520..bb0b7b81a3 100644 --- a/src/platformsupport/platformsupport.pro +++ b/src/platformsupport/platformsupport.pro @@ -7,7 +7,7 @@ SUBDIRS = \ fbconvenience \ themes -qtConfig(freetype)|if(darwin:!if(watchos:CONFIG(simulator, simulator|device))): \ +qtConfig(freetype)|if(darwin:!if(watchos:CONFIG(simulator, simulator|device)))|win32: \ SUBDIRS += fontdatabases qtConfig(evdev)|qtConfig(tslib)|qtConfig(libinput) { diff --git a/src/plugins/platforms/direct2d/direct2d.pro b/src/plugins/platforms/direct2d/direct2d.pro index 83c4a730f4..c30703720c 100644 --- a/src/plugins/platforms/direct2d/direct2d.pro +++ b/src/plugins/platforms/direct2d/direct2d.pro @@ -2,7 +2,8 @@ TARGET = qdirect2d QT += \ core-private gui-private \ - eventdispatcher_support-private + eventdispatcher_support-private \ + fontdatabase_support-private theme_support-private LIBS += -ldwmapi -ld2d1 -ld3d11 -ldwrite -lVersion -lgdi32 diff --git a/src/plugins/platforms/direct2d/qwindowsdirect2dpaintengine.cpp b/src/plugins/platforms/direct2d/qwindowsdirect2dpaintengine.cpp index 0ea2fcfa74..69d2e12778 100644 --- a/src/plugins/platforms/direct2d/qwindowsdirect2dpaintengine.cpp +++ b/src/plugins/platforms/direct2d/qwindowsdirect2dpaintengine.cpp @@ -45,8 +45,8 @@ #include "qwindowsdirect2dbitmap.h" #include "qwindowsdirect2ddevicecontext.h" -#include "qwindowsfontengine.h" -#include "qwindowsfontdatabase.h" +#include +#include #include "qwindowsintegration.h" #include diff --git a/src/plugins/platforms/windows/qwindowsbackingstore.cpp b/src/plugins/platforms/windows/qwindowsbackingstore.cpp index 3b7374dc92..49c7144221 100644 --- a/src/plugins/platforms/windows/qwindowsbackingstore.cpp +++ b/src/plugins/platforms/windows/qwindowsbackingstore.cpp @@ -39,11 +39,11 @@ #include "qwindowsbackingstore.h" #include "qwindowswindow.h" -#include "qwindowsnativeimage.h" #include "qwindowscontext.h" #include #include +#include #include #include diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp index bc317c7f5d..1a03df6ac2 100644 --- a/src/plugins/platforms/windows/qwindowscontext.cpp +++ b/src/plugins/platforms/windows/qwindowscontext.cpp @@ -84,7 +84,6 @@ QT_BEGIN_NAMESPACE Q_LOGGING_CATEGORY(lcQpaWindows, "qt.qpa.windows") Q_LOGGING_CATEGORY(lcQpaBackingStore, "qt.qpa.backingstore") Q_LOGGING_CATEGORY(lcQpaEvents, "qt.qpa.events") -Q_LOGGING_CATEGORY(lcQpaFonts, "qt.qpa.fonts") Q_LOGGING_CATEGORY(lcQpaGl, "qt.qpa.gl") Q_LOGGING_CATEGORY(lcQpaMime, "qt.qpa.mime") Q_LOGGING_CATEGORY(lcQpaInputMethods, "qt.qpa.input.methods") diff --git a/src/plugins/platforms/windows/qwindowscontext.h b/src/plugins/platforms/windows/qwindowscontext.h index 843f7e2ad6..9dfde67797 100644 --- a/src/plugins/platforms/windows/qwindowscontext.h +++ b/src/plugins/platforms/windows/qwindowscontext.h @@ -59,7 +59,6 @@ QT_BEGIN_NAMESPACE Q_DECLARE_LOGGING_CATEGORY(lcQpaWindows) Q_DECLARE_LOGGING_CATEGORY(lcQpaBackingStore) Q_DECLARE_LOGGING_CATEGORY(lcQpaEvents) -Q_DECLARE_LOGGING_CATEGORY(lcQpaFonts) Q_DECLARE_LOGGING_CATEGORY(lcQpaGl) Q_DECLARE_LOGGING_CATEGORY(lcQpaMime) Q_DECLARE_LOGGING_CATEGORY(lcQpaInputMethods) diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp deleted file mode 100644 index 1630b80306..0000000000 --- a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp +++ /dev/null @@ -1,1960 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qwindowsfontdatabase.h" -#include "qwindowsfontdatabase_ft.h" // for default font -#include "qwindowscontext.h" -#include "qwindowsintegration.h" -#include "qwindowsfontengine.h" -#include "qwindowsfontenginedirectwrite.h" -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include - -#if !defined(QT_NO_DIRECTWRITE) -# if defined(QT_USE_DIRECTWRITE2) -# include -# else -# include -# endif -# include -#endif - -QT_BEGIN_NAMESPACE - -#ifndef QT_NO_DIRECTWRITE -// ### fixme: Consider direct linking of dwrite.dll once Windows Vista pre SP2 is dropped (QTBUG-49711) - -typedef HRESULT (WINAPI *DWriteCreateFactoryType)(DWRITE_FACTORY_TYPE, const IID &, IUnknown **); - -static inline DWriteCreateFactoryType resolveDWriteCreateFactory() -{ - if (QSysInfo::windowsVersion() < QSysInfo::WV_VISTA) - return Q_NULLPTR; - QSystemLibrary library(QStringLiteral("dwrite")); - QFunctionPointer result = library.resolve("DWriteCreateFactory"); - if (Q_UNLIKELY(!result)) { - qWarning("Unable to load dwrite.dll"); - return Q_NULLPTR; - } - return reinterpret_cast(result); -} - -static void createDirectWriteFactory(IDWriteFactory **factory) -{ - *factory = Q_NULLPTR; - - static const DWriteCreateFactoryType dWriteCreateFactory = resolveDWriteCreateFactory(); - if (!dWriteCreateFactory) - return; - - IUnknown *result = NULL; -#if defined(QT_USE_DIRECTWRITE2) - dWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory2), &result); -#endif - - if (result == NULL) { - if (FAILED(dWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory), &result))) { - qErrnoWarning("DWriteCreateFactory failed"); - return; - } - } - - *factory = static_cast(result); -} - -static inline bool useDirectWrite(QFont::HintingPreference hintingPreference, - const QString &familyName = QString(), - bool isColorFont = false) -{ - const unsigned options = QWindowsIntegration::instance()->options(); - if (Q_UNLIKELY(options & QWindowsIntegration::DontUseDirectWriteFonts)) - return false; - if (isColorFont) - return (options & QWindowsIntegration::DontUseColorFonts) == 0; - - // At some scales, GDI will misrender the MingLiU font, so we force use of - // DirectWrite to work around the issue. - if (Q_UNLIKELY(familyName.startsWith(QLatin1String("MingLiU")))) - return true; - - return hintingPreference == QFont::PreferNoHinting - || hintingPreference == QFont::PreferVerticalHinting - || (QHighDpiScaling::isActive() && hintingPreference == QFont::PreferDefaultHinting); -} -#endif // !QT_NO_DIRECTWRITE - -// Helper classes for creating font engines directly from font data -namespace { - -# pragma pack(1) - - // Common structure for all formats of the "name" table - struct NameTable - { - quint16 format; - quint16 count; - quint16 stringOffset; - }; - - struct NameRecord - { - quint16 platformID; - quint16 encodingID; - quint16 languageID; - quint16 nameID; - quint16 length; - quint16 offset; - }; - - struct OffsetSubTable - { - quint32 scalerType; - quint16 numTables; - quint16 searchRange; - quint16 entrySelector; - quint16 rangeShift; - }; - - struct TableDirectory - { - quint32 identifier; - quint32 checkSum; - quint32 offset; - quint32 length; - }; - - struct OS2Table - { - quint16 version; - qint16 avgCharWidth; - quint16 weightClass; - quint16 widthClass; - quint16 type; - qint16 subscriptXSize; - qint16 subscriptYSize; - qint16 subscriptXOffset; - qint16 subscriptYOffset; - qint16 superscriptXSize; - qint16 superscriptYSize; - qint16 superscriptXOffset; - qint16 superscriptYOffset; - qint16 strikeOutSize; - qint16 strikeOutPosition; - qint16 familyClass; - quint8 panose[10]; - quint32 unicodeRanges[4]; - quint8 vendorID[4]; - quint16 selection; - quint16 firstCharIndex; - quint16 lastCharIndex; - qint16 typoAscender; - qint16 typoDescender; - qint16 typoLineGap; - quint16 winAscent; - quint16 winDescent; - quint32 codepageRanges[2]; - qint16 height; - qint16 capHeight; - quint16 defaultChar; - quint16 breakChar; - quint16 maxContext; - }; - -# pragma pack() - - class EmbeddedFont - { - public: - EmbeddedFont(const QByteArray &fontData) : m_fontData(fontData) {} - - QString changeFamilyName(const QString &newFamilyName); - QByteArray data() const { return m_fontData; } - TableDirectory *tableDirectoryEntry(const QByteArray &tagName); - QString familyName(TableDirectory *nameTableDirectory = 0); - - private: - QByteArray m_fontData; - }; - - TableDirectory *EmbeddedFont::tableDirectoryEntry(const QByteArray &tagName) - { - Q_ASSERT(tagName.size() == 4); - quint32 tagId = *(reinterpret_cast(tagName.constData())); - const size_t fontDataSize = m_fontData.size(); - if (Q_UNLIKELY(fontDataSize < sizeof(OffsetSubTable))) - return 0; - - OffsetSubTable *offsetSubTable = reinterpret_cast(m_fontData.data()); - TableDirectory *tableDirectory = reinterpret_cast(offsetSubTable + 1); - - const size_t tableCount = qFromBigEndian(offsetSubTable->numTables); - if (Q_UNLIKELY(fontDataSize < sizeof(OffsetSubTable) + sizeof(TableDirectory) * tableCount)) - return 0; - - TableDirectory *tableDirectoryEnd = tableDirectory + tableCount; - for (TableDirectory *entry = tableDirectory; entry < tableDirectoryEnd; ++entry) { - if (entry->identifier == tagId) - return entry; - } - - return 0; - } - - QString EmbeddedFont::familyName(TableDirectory *nameTableDirectoryEntry) - { - QString name; - - if (nameTableDirectoryEntry == 0) - nameTableDirectoryEntry = tableDirectoryEntry("name"); - - if (nameTableDirectoryEntry != 0) { - quint32 offset = qFromBigEndian(nameTableDirectoryEntry->offset); - if (Q_UNLIKELY(quint32(m_fontData.size()) < offset + sizeof(NameTable))) - return QString(); - - NameTable *nameTable = reinterpret_cast(m_fontData.data() + offset); - NameRecord *nameRecord = reinterpret_cast(nameTable + 1); - - quint16 nameTableCount = qFromBigEndian(nameTable->count); - if (Q_UNLIKELY(quint32(m_fontData.size()) < offset + sizeof(NameRecord) * nameTableCount)) - return QString(); - - for (int i = 0; i < nameTableCount; ++i, ++nameRecord) { - if (qFromBigEndian(nameRecord->nameID) == 1 - && qFromBigEndian(nameRecord->platformID) == 3 // Windows - && qFromBigEndian(nameRecord->languageID) == 0x0409) { // US English - quint16 stringOffset = qFromBigEndian(nameTable->stringOffset); - quint16 nameOffset = qFromBigEndian(nameRecord->offset); - quint16 nameLength = qFromBigEndian(nameRecord->length); - - if (Q_UNLIKELY(quint32(m_fontData.size()) < offset + stringOffset + nameOffset + nameLength)) - return QString(); - - const void *ptr = reinterpret_cast(nameTable) - + stringOffset - + nameOffset; - - const quint16 *s = reinterpret_cast(ptr); - const quint16 *e = s + nameLength / sizeof(quint16); - while (s != e) - name += QChar( qFromBigEndian(*s++)); - break; - } - } - } - - return name; - } - - QString EmbeddedFont::changeFamilyName(const QString &newFamilyName) - { - TableDirectory *nameTableDirectoryEntry = tableDirectoryEntry("name"); - if (nameTableDirectoryEntry == 0) - return QString(); - - QString oldFamilyName = familyName(nameTableDirectoryEntry); - - // Reserve size for name table header, five required name records and string - const int requiredRecordCount = 5; - quint16 nameIds[requiredRecordCount] = { 1, 2, 3, 4, 6 }; - - int sizeOfHeader = sizeof(NameTable) + sizeof(NameRecord) * requiredRecordCount; - int newFamilyNameSize = newFamilyName.size() * int(sizeof(quint16)); - - const QString regularString = QString::fromLatin1("Regular"); - int regularStringSize = regularString.size() * int(sizeof(quint16)); - - // Align table size of table to 32 bits (pad with 0) - int fullSize = ((sizeOfHeader + newFamilyNameSize + regularStringSize) & ~3) + 4; - - QByteArray newNameTable(fullSize, char(0)); - - { - NameTable *nameTable = reinterpret_cast(newNameTable.data()); - nameTable->count = qbswap(requiredRecordCount); - nameTable->stringOffset = qbswap(sizeOfHeader); - - NameRecord *nameRecord = reinterpret_cast(nameTable + 1); - for (int i = 0; i < requiredRecordCount; ++i, nameRecord++) { - nameRecord->nameID = qbswap(nameIds[i]); - nameRecord->encodingID = qbswap(1); - nameRecord->languageID = qbswap(0x0409); - nameRecord->platformID = qbswap(3); - nameRecord->length = qbswap(newFamilyNameSize); - - // Special case for sub-family - if (nameIds[i] == 4) { - nameRecord->offset = qbswap(newFamilyNameSize); - nameRecord->length = qbswap(regularStringSize); - } - } - - // nameRecord now points to string data - quint16 *stringStorage = reinterpret_cast(nameRecord); - const quint16 *sourceString = newFamilyName.utf16(); - for (int i = 0; i < newFamilyName.size(); ++i) - stringStorage[i] = qbswap(sourceString[i]); - stringStorage += newFamilyName.size(); - - sourceString = regularString.utf16(); - for (int i = 0; i < regularString.size(); ++i) - stringStorage[i] = qbswap(sourceString[i]); - } - - quint32 *p = reinterpret_cast(newNameTable.data()); - quint32 *tableEnd = reinterpret_cast(newNameTable.data() + fullSize); - - quint32 checkSum = 0; - while (p < tableEnd) - checkSum += qFromBigEndian(*(p++)); - - nameTableDirectoryEntry->checkSum = qbswap(checkSum); - nameTableDirectoryEntry->offset = qbswap(m_fontData.size()); - nameTableDirectoryEntry->length = qbswap(fullSize); - - m_fontData.append(newNameTable); - - return oldFamilyName; - } - -#if !defined(QT_NO_DIRECTWRITE) - - class DirectWriteFontFileStream: public IDWriteFontFileStream - { - public: - DirectWriteFontFileStream(const QByteArray &fontData) - : m_fontData(fontData) - , m_referenceCount(0) - { - } - virtual ~DirectWriteFontFileStream() - { - } - - HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **object); - ULONG STDMETHODCALLTYPE AddRef(); - ULONG STDMETHODCALLTYPE Release(); - - HRESULT STDMETHODCALLTYPE ReadFileFragment(const void **fragmentStart, UINT64 fileOffset, - UINT64 fragmentSize, OUT void **fragmentContext); - void STDMETHODCALLTYPE ReleaseFileFragment(void *fragmentContext); - HRESULT STDMETHODCALLTYPE GetFileSize(OUT UINT64 *fileSize); - HRESULT STDMETHODCALLTYPE GetLastWriteTime(OUT UINT64 *lastWriteTime); - - private: - QByteArray m_fontData; - ULONG m_referenceCount; - }; - - HRESULT STDMETHODCALLTYPE DirectWriteFontFileStream::QueryInterface(REFIID iid, void **object) - { - if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileStream)) { - *object = this; - AddRef(); - return S_OK; - } else { - *object = NULL; - return E_NOINTERFACE; - } - } - - ULONG STDMETHODCALLTYPE DirectWriteFontFileStream::AddRef() - { - return InterlockedIncrement(&m_referenceCount); - } - - ULONG STDMETHODCALLTYPE DirectWriteFontFileStream::Release() - { - ULONG newCount = InterlockedDecrement(&m_referenceCount); - if (newCount == 0) - delete this; - return newCount; - } - - HRESULT STDMETHODCALLTYPE DirectWriteFontFileStream::ReadFileFragment( - const void **fragmentStart, - UINT64 fileOffset, - UINT64 fragmentSize, - OUT void **fragmentContext) - { - *fragmentContext = NULL; - if (fileOffset + fragmentSize <= quint64(m_fontData.size())) { - *fragmentStart = m_fontData.data() + fileOffset; - return S_OK; - } else { - *fragmentStart = NULL; - return E_FAIL; - } - } - - void STDMETHODCALLTYPE DirectWriteFontFileStream::ReleaseFileFragment(void *) - { - } - - HRESULT STDMETHODCALLTYPE DirectWriteFontFileStream::GetFileSize(UINT64 *fileSize) - { - *fileSize = m_fontData.size(); - return S_OK; - } - - HRESULT STDMETHODCALLTYPE DirectWriteFontFileStream::GetLastWriteTime(UINT64 *lastWriteTime) - { - *lastWriteTime = 0; - return E_NOTIMPL; - } - - class DirectWriteFontFileLoader: public IDWriteFontFileLoader - { - public: - DirectWriteFontFileLoader() : m_referenceCount(0) {} - virtual ~DirectWriteFontFileLoader() - { - } - - inline void addKey(const void *key, const QByteArray &fontData) - { - Q_ASSERT(!m_fontDatas.contains(key)); - m_fontDatas.insert(key, fontData); - } - - inline void removeKey(const void *key) - { - m_fontDatas.remove(key); - } - - HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **object); - ULONG STDMETHODCALLTYPE AddRef(); - ULONG STDMETHODCALLTYPE Release(); - - HRESULT STDMETHODCALLTYPE CreateStreamFromKey(void const *fontFileReferenceKey, - UINT32 fontFileReferenceKeySize, - OUT IDWriteFontFileStream **fontFileStream); - - private: - ULONG m_referenceCount; - QHash m_fontDatas; - }; - - HRESULT STDMETHODCALLTYPE DirectWriteFontFileLoader::QueryInterface(const IID &iid, - void **object) - { - if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileLoader)) { - *object = this; - AddRef(); - return S_OK; - } else { - *object = NULL; - return E_NOINTERFACE; - } - } - - ULONG STDMETHODCALLTYPE DirectWriteFontFileLoader::AddRef() - { - return InterlockedIncrement(&m_referenceCount); - } - - ULONG STDMETHODCALLTYPE DirectWriteFontFileLoader::Release() - { - ULONG newCount = InterlockedDecrement(&m_referenceCount); - if (newCount == 0) - delete this; - return newCount; - } - - HRESULT STDMETHODCALLTYPE DirectWriteFontFileLoader::CreateStreamFromKey( - void const *fontFileReferenceKey, - UINT32 fontFileReferenceKeySize, - IDWriteFontFileStream **fontFileStream) - { - Q_UNUSED(fontFileReferenceKeySize); - - if (fontFileReferenceKeySize != sizeof(const void *)) { - qWarning("%s: Wrong key size", __FUNCTION__); - return E_FAIL; - } - - const void *key = *reinterpret_cast(fontFileReferenceKey); - *fontFileStream = NULL; - if (!m_fontDatas.contains(key)) - return E_FAIL; - - QByteArray fontData = m_fontDatas.value(key); - DirectWriteFontFileStream *stream = new DirectWriteFontFileStream(fontData); - stream->AddRef(); - *fontFileStream = stream; - - return S_OK; - } - - class CustomFontFileLoader - { - public: - CustomFontFileLoader() : m_directWriteFontFileLoader(Q_NULLPTR) - { - createDirectWriteFactory(&m_directWriteFactory); - - if (m_directWriteFactory) { - m_directWriteFontFileLoader = new DirectWriteFontFileLoader(); - m_directWriteFactory->RegisterFontFileLoader(m_directWriteFontFileLoader); - } - } - - ~CustomFontFileLoader() - { - if (m_directWriteFactory != 0 && m_directWriteFontFileLoader != 0) - m_directWriteFactory->UnregisterFontFileLoader(m_directWriteFontFileLoader); - - if (m_directWriteFactory != 0) - m_directWriteFactory->Release(); - } - - void addKey(const void *key, const QByteArray &fontData) - { - if (m_directWriteFontFileLoader != 0) - m_directWriteFontFileLoader->addKey(key, fontData); - } - - void removeKey(const void *key) - { - if (m_directWriteFontFileLoader != 0) - m_directWriteFontFileLoader->removeKey(key); - } - - IDWriteFontFileLoader *loader() const - { - return m_directWriteFontFileLoader; - } - - private: - IDWriteFactory *m_directWriteFactory; - DirectWriteFontFileLoader *m_directWriteFontFileLoader; - }; - -#endif - -} // Anonymous namespace - -/*! - \struct QWindowsFontEngineData - \brief Static constant data shared by the font engines. - \ingroup qt-lighthouse-win -*/ - -QWindowsFontEngineData::QWindowsFontEngineData() - : clearTypeEnabled(false) - , fontSmoothingGamma(QWindowsFontDatabase::fontSmoothingGamma()) -#if !defined(QT_NO_DIRECTWRITE) - , directWriteFactory(0) - , directWriteGdiInterop(0) -#endif -{ - // from qapplication_win.cpp - UINT result = 0; - if (SystemParametersInfo(SPI_GETFONTSMOOTHINGTYPE, 0, &result, 0)) - clearTypeEnabled = (result == FE_FONTSMOOTHINGCLEARTYPE); - - const qreal gray_gamma = 2.31; - for (int i=0; i<256; ++i) - pow_gamma[i] = uint(qRound(qPow(i / qreal(255.), gray_gamma) * 2047)); - - HDC displayDC = GetDC(0); - hdc = CreateCompatibleDC(displayDC); - ReleaseDC(0, displayDC); -} - -QWindowsFontEngineData::~QWindowsFontEngineData() -{ - if (hdc) - DeleteDC(hdc); -#if !defined(QT_NO_DIRECTWRITE) - if (directWriteGdiInterop) - directWriteGdiInterop->Release(); - if (directWriteFactory) - directWriteFactory->Release(); -#endif -} - -qreal QWindowsFontDatabase::fontSmoothingGamma() -{ - int winSmooth; - qreal result = 1; - if (SystemParametersInfo(0x200C /* SPI_GETFONTSMOOTHINGCONTRAST */, 0, &winSmooth, 0)) - result = qreal(winSmooth) / qreal(1000.0); - - // Safeguard ourselves against corrupt registry values... - if (result > 5 || result < 1) - result = qreal(1.4); - return result; -} - -#if !defined(QT_NO_DIRECTWRITE) -static inline bool initDirectWrite(QWindowsFontEngineData *d) -{ - if (!d->directWriteFactory) { - createDirectWriteFactory(&d->directWriteFactory); - if (!d->directWriteFactory) - return false; - } - if (!d->directWriteGdiInterop) { - const HRESULT hr = d->directWriteFactory->GetGdiInterop(&d->directWriteGdiInterop); - if (FAILED(hr)) { - qErrnoWarning("%s: GetGdiInterop failed", __FUNCTION__); - return false; - } - } - return true; -} - -#endif // !defined(QT_NO_DIRECTWRITE) - -/*! - \class QWindowsFontDatabase - \brief Font database for Windows - - \note The Qt 4.8 WIndows font database employed a mechanism of - delayed population of the database again passing a font name - to EnumFontFamiliesEx(), working around the fact that - EnumFontFamiliesEx() does not list all fonts by default. - This should be introduced to Lighthouse as well? - - \internal - \ingroup qt-lighthouse-win -*/ - -#ifndef QT_NO_DEBUG_STREAM -QDebug operator<<(QDebug d, const QFontDef &def) -{ - QDebugStateSaver saver(d); - d.nospace(); - d.noquote(); - d << "QFontDef(Family=\"" << def.family << '"'; - if (!def.styleName.isEmpty()) - d << ", stylename=" << def.styleName; - d << ", pointsize=" << def.pointSize << ", pixelsize=" << def.pixelSize - << ", styleHint=" << def.styleHint << ", weight=" << def.weight - << ", stretch=" << def.stretch << ", hintingPreference=" - << def.hintingPreference << ')'; - return d; -} - -QDebug operator<<(QDebug d, const LOGFONT &lf) -{ - QDebugStateSaver saver(d); - d.nospace(); - d.noquote(); - d << "LOGFONT(\"" << QString::fromWCharArray(lf.lfFaceName) - << "\", lfWidth=" << lf.lfWidth << ", lfHeight=" << lf.lfHeight << ')'; - return d; -} -#endif // !QT_NO_DEBUG_STREAM - -static inline QFontDatabase::WritingSystem writingSystemFromCharSet(uchar charSet) -{ - switch (charSet) { - case ANSI_CHARSET: - case EASTEUROPE_CHARSET: - case BALTIC_CHARSET: - case TURKISH_CHARSET: - return QFontDatabase::Latin; - case GREEK_CHARSET: - return QFontDatabase::Greek; - case RUSSIAN_CHARSET: - return QFontDatabase::Cyrillic; - case HEBREW_CHARSET: - return QFontDatabase::Hebrew; - case ARABIC_CHARSET: - return QFontDatabase::Arabic; - case THAI_CHARSET: - return QFontDatabase::Thai; - case GB2312_CHARSET: - return QFontDatabase::SimplifiedChinese; - case CHINESEBIG5_CHARSET: - return QFontDatabase::TraditionalChinese; - case SHIFTJIS_CHARSET: - return QFontDatabase::Japanese; - case HANGUL_CHARSET: - case JOHAB_CHARSET: - return QFontDatabase::Korean; - case VIETNAMESE_CHARSET: - return QFontDatabase::Vietnamese; - case SYMBOL_CHARSET: - return QFontDatabase::Symbol; - default: - break; - } - return QFontDatabase::Any; -} - -#ifdef MAKE_TAG -#undef MAKE_TAG -#endif -// GetFontData expects the tags in little endian ;( -#define MAKE_TAG(ch1, ch2, ch3, ch4) (\ - (((quint32)(ch4)) << 24) | \ - (((quint32)(ch3)) << 16) | \ - (((quint32)(ch2)) << 8) | \ - ((quint32)(ch1)) \ - ) - -bool localizedName(const QString &name) -{ - const QChar *c = name.unicode(); - for (int i = 0; i < name.length(); ++i) { - if (c[i].unicode() >= 0x100) - return true; - } - return false; -} - -static inline quint16 getUShort(const unsigned char *p) -{ - quint16 val; - val = *p++ << 8; - val |= *p; - - return val; -} - -namespace { - -struct FontNames { - QString name; // e.g. "DejaVu Sans Condensed" - QString style; // e.g. "Italic" - QString preferredName; // e.g. "DejaVu Sans" - QString preferredStyle; // e.g. "Condensed Italic" -}; - -static QString readName(bool unicode, const uchar *string, int length) -{ - QString out; - if (unicode) { - // utf16 - - length /= 2; - out.resize(length); - QChar *uc = out.data(); - for (int i = 0; i < length; ++i) - uc[i] = getUShort(string + 2*i); - } else { - // Apple Roman - - out.resize(length); - QChar *uc = out.data(); - for (int i = 0; i < length; ++i) - uc[i] = QLatin1Char(char(string[i])); - } - return out; -} - -enum FieldTypeValue { - FamilyId = 1, - StyleId = 2, - PreferredFamilyId = 16, - PreferredStyleId = 17, -}; - -enum PlatformFieldValue { - PlatformId_Unicode = 0, - PlatformId_Apple = 1, - PlatformId_Microsoft = 3 -}; - -static FontNames getCanonicalFontNames(const uchar *table, quint32 bytes) -{ - FontNames out; - const int NameRecordSize = 12; - const int MS_LangIdEnglish = 0x009; - - // get the name table - quint16 count; - quint16 string_offset; - const unsigned char *names; - - if (bytes < 8) - return out; - - if (getUShort(table) != 0) - return out; - - count = getUShort(table+2); - string_offset = getUShort(table+4); - names = table + 6; - - if (string_offset >= bytes || 6 + count*NameRecordSize > string_offset) - return out; - - enum PlatformIdType { - NotFound = 0, - Unicode = 1, - Apple = 2, - Microsoft = 3 - }; - - PlatformIdType idStatus[4] = { NotFound, NotFound, NotFound, NotFound }; - int ids[4] = { -1, -1, -1, -1 }; - - for (int i = 0; i < count; ++i) { - // search for the correct name entries - - quint16 platform_id = getUShort(names + i*NameRecordSize); - quint16 encoding_id = getUShort(names + 2 + i*NameRecordSize); - quint16 language_id = getUShort(names + 4 + i*NameRecordSize); - quint16 name_id = getUShort(names + 6 + i*NameRecordSize); - - PlatformIdType *idType = nullptr; - int *id = nullptr; - - switch (name_id) { - case FamilyId: - idType = &idStatus[0]; - id = &ids[0]; - break; - case StyleId: - idType = &idStatus[1]; - id = &ids[1]; - break; - case PreferredFamilyId: - idType = &idStatus[2]; - id = &ids[2]; - break; - case PreferredStyleId: - idType = &idStatus[3]; - id = &ids[3]; - break; - default: - continue; - } - - quint16 length = getUShort(names + 8 + i*NameRecordSize); - quint16 offset = getUShort(names + 10 + i*NameRecordSize); - if (DWORD(string_offset + offset + length) > bytes) - continue; - - if ((platform_id == PlatformId_Microsoft - && (encoding_id == 0 || encoding_id == 1)) - && (language_id & 0x3ff) == MS_LangIdEnglish - && *idType < Microsoft) { - *id = i; - *idType = Microsoft; - } - // not sure if encoding id 4 for Unicode is utf16 or ucs4... - else if (platform_id == PlatformId_Unicode && encoding_id < 4 && *idType < Unicode) { - *id = i; - *idType = Unicode; - } - else if (platform_id == PlatformId_Apple && encoding_id == 0 && language_id == 0 && *idType < Apple) { - *id = i; - *idType = Apple; - } - } - - QString strings[4]; - for (int i = 0; i < 4; ++i) { - if (idStatus[i] == NotFound) - continue; - int id = ids[i]; - quint16 length = getUShort(names + 8 + id * NameRecordSize); - quint16 offset = getUShort(names + 10 + id * NameRecordSize); - const unsigned char *string = table + string_offset + offset; - strings[i] = readName(idStatus[i] != Apple, string, length); - } - - out.name = strings[0]; - out.style = strings[1]; - out.preferredName = strings[2]; - out.preferredStyle = strings[3]; - return out; -} - -} // namespace - -QString getEnglishName(const QString &familyName, bool includeStyle = false) -{ - QString i18n_name; - QString faceName = familyName; - faceName.truncate(LF_FACESIZE - 1); - - HDC hdc = GetDC( 0 ); - LOGFONT lf; - memset(&lf, 0, sizeof(LOGFONT)); - faceName.toWCharArray(lf.lfFaceName); - lf.lfFaceName[faceName.size()] = 0; - lf.lfCharSet = DEFAULT_CHARSET; - HFONT hfont = CreateFontIndirect(&lf); - - if (!hfont) { - ReleaseDC(0, hdc); - return QString(); - } - - HGDIOBJ oldobj = SelectObject( hdc, hfont ); - - const DWORD name_tag = MAKE_TAG( 'n', 'a', 'm', 'e' ); - - // get the name table - unsigned char *table = 0; - - DWORD bytes = GetFontData( hdc, name_tag, 0, 0, 0 ); - if ( bytes == GDI_ERROR ) { - // ### Unused variable - // int err = GetLastError(); - goto error; - } - - table = new unsigned char[bytes]; - GetFontData(hdc, name_tag, 0, table, bytes); - if ( bytes == GDI_ERROR ) - goto error; - - { - const FontNames names = getCanonicalFontNames(table, bytes); - i18n_name = names.name; - if (includeStyle) - i18n_name += QLatin1Char(' ') + names.style; - } -error: - delete [] table; - SelectObject( hdc, oldobj ); - DeleteObject( hfont ); - ReleaseDC( 0, hdc ); - - //qDebug("got i18n name of '%s' for font '%s'", i18n_name.latin1(), familyName.toLocal8Bit().data()); - return i18n_name; -} - -static bool addFontToDatabase(const QString &familyName, const QString &styleName, uchar charSet, - const TEXTMETRIC *textmetric, - const FONTSIGNATURE *signature, - int type, - bool registerAlias) -{ - // the "@family" fonts are just the same as "family". Ignore them. - if (familyName.isEmpty() || familyName.at(0) == QLatin1Char('@') || familyName.startsWith(QLatin1String("WST_"))) - return false; - - static const int SMOOTH_SCALABLE = 0xffff; - const QString foundryName; // No such concept. - const bool fixed = !(textmetric->tmPitchAndFamily & TMPF_FIXED_PITCH); - const bool ttf = (textmetric->tmPitchAndFamily & TMPF_TRUETYPE); - const bool scalable = textmetric->tmPitchAndFamily & (TMPF_VECTOR|TMPF_TRUETYPE); - const int size = scalable ? SMOOTH_SCALABLE : textmetric->tmHeight; - const QFont::Style style = textmetric->tmItalic ? QFont::StyleItalic : QFont::StyleNormal; - const bool antialias = false; - const QFont::Weight weight = QPlatformFontDatabase::weightFromInteger(textmetric->tmWeight); - const QFont::Stretch stretch = QFont::Unstretched; - -#ifndef QT_NO_DEBUG_OUTPUT - if (QWindowsContext::verbose > 2) { - QString message; - QTextStream str(&message); - str << __FUNCTION__ << ' ' << familyName << ' ' << charSet << " TTF=" << ttf; - if (type & DEVICE_FONTTYPE) - str << " DEVICE"; - if (type & RASTER_FONTTYPE) - str << " RASTER"; - if (type & TRUETYPE_FONTTYPE) - str << " TRUETYPE"; - str << " scalable=" << scalable << " Size=" << size - << " Style=" << style << " Weight=" << weight - << " stretch=" << stretch; - qCDebug(lcQpaFonts) << message; - } -#endif - - QString englishName; - if (registerAlias && ttf && localizedName(familyName)) - englishName = getEnglishName(familyName); - - QSupportedWritingSystems writingSystems; - if (type & TRUETYPE_FONTTYPE) { - Q_ASSERT(signature); - quint32 unicodeRange[4] = { - signature->fsUsb[0], signature->fsUsb[1], - signature->fsUsb[2], signature->fsUsb[3] - }; - quint32 codePageRange[2] = { - signature->fsCsb[0], signature->fsCsb[1] - }; - writingSystems = QPlatformFontDatabase::writingSystemsFromTrueTypeBits(unicodeRange, codePageRange); - // ### Hack to work around problem with Thai text on Windows 7. Segoe UI contains - // the symbol for Baht, and Windows thus reports that it supports the Thai script. - // Since it's the default UI font on this platform, most widgets will be unable to - // display Thai text by default. As a temporary work around, we special case Segoe UI - // and remove the Thai script from its list of supported writing systems. - if (writingSystems.supported(QFontDatabase::Thai) && - familyName == QLatin1String("Segoe UI")) - writingSystems.setSupported(QFontDatabase::Thai, false); - } else { - const QFontDatabase::WritingSystem ws = writingSystemFromCharSet(charSet); - if (ws != QFontDatabase::Any) - writingSystems.setSupported(ws); - } - - QPlatformFontDatabase::registerFont(familyName, styleName, foundryName, weight, - style, stretch, antialias, scalable, size, fixed, writingSystems, 0); - // add fonts windows can generate for us: - if (weight <= QFont::DemiBold && styleName.isEmpty()) - QPlatformFontDatabase::registerFont(familyName, QString(), foundryName, QFont::Bold, - style, stretch, antialias, scalable, size, fixed, writingSystems, 0); - if (style != QFont::StyleItalic && styleName.isEmpty()) - QPlatformFontDatabase::registerFont(familyName, QString(), foundryName, weight, - QFont::StyleItalic, stretch, antialias, scalable, size, fixed, writingSystems, 0); - if (weight <= QFont::DemiBold && style != QFont::StyleItalic && styleName.isEmpty()) - QPlatformFontDatabase::registerFont(familyName, QString(), foundryName, QFont::Bold, - QFont::StyleItalic, stretch, antialias, scalable, size, fixed, writingSystems, 0); - - if (!englishName.isEmpty()) - QPlatformFontDatabase::registerAliasToFontFamily(familyName, englishName); - - return true; -} - -static int QT_WIN_CALLBACK storeFont(const LOGFONT *logFont, const TEXTMETRIC *textmetric, - DWORD type, LPARAM lParam) -{ - const ENUMLOGFONTEX *f = reinterpret_cast(logFont); - const QString familyName = QString::fromWCharArray(f->elfLogFont.lfFaceName); - const QString styleName = QString::fromWCharArray(f->elfStyle); - const uchar charSet = f->elfLogFont.lfCharSet; - const bool registerAlias = bool(lParam); - - // NEWTEXTMETRICEX (passed for TT fonts) is a NEWTEXTMETRIC, which according - // to the documentation is identical to a TEXTMETRIC except for the last four - // members, which we don't use anyway - const FONTSIGNATURE *signature = Q_NULLPTR; - if (type & TRUETYPE_FONTTYPE) - signature = &reinterpret_cast(textmetric)->ntmFontSig; - addFontToDatabase(familyName, styleName, charSet, textmetric, signature, type, registerAlias); - - // keep on enumerating - return 1; -} - -void QWindowsFontDatabase::populateFamily(const QString &familyName, bool registerAlias) -{ - qCDebug(lcQpaFonts) << familyName; - if (familyName.size() >= LF_FACESIZE) { - qCWarning(lcQpaFonts) << "Unable to enumerate family '" << familyName << '\''; - return; - } - HDC dummy = GetDC(0); - LOGFONT lf; - lf.lfCharSet = DEFAULT_CHARSET; - familyName.toWCharArray(lf.lfFaceName); - lf.lfFaceName[familyName.size()] = 0; - lf.lfPitchAndFamily = 0; - EnumFontFamiliesEx(dummy, &lf, storeFont, LPARAM(registerAlias), 0); - ReleaseDC(0, dummy); -} - -void QWindowsFontDatabase::populateFamily(const QString &familyName) -{ - populateFamily(familyName, false); -} - -namespace { -// Context for enumerating system fonts, records whether the default font has been encountered, -// which is normally not enumerated by EnumFontFamiliesEx(). -struct PopulateFamiliesContext -{ - PopulateFamiliesContext(const QString &f) : systemDefaultFont(f), seenSystemDefaultFont(false) {} - - QString systemDefaultFont; - bool seenSystemDefaultFont; -}; -} // namespace - -static int QT_WIN_CALLBACK populateFontFamilies(const LOGFONT *logFont, const TEXTMETRIC *textmetric, - DWORD, LPARAM lparam) -{ - // the "@family" fonts are just the same as "family". Ignore them. - const ENUMLOGFONTEX *f = reinterpret_cast(logFont); - const wchar_t *faceNameW = f->elfLogFont.lfFaceName; - if (faceNameW[0] && faceNameW[0] != L'@' && wcsncmp(faceNameW, L"WST_", 4)) { - const QString faceName = QString::fromWCharArray(faceNameW); - QPlatformFontDatabase::registerFontFamily(faceName); - PopulateFamiliesContext *context = reinterpret_cast(lparam); - if (!context->seenSystemDefaultFont && faceName == context->systemDefaultFont) - context->seenSystemDefaultFont = true; - - // Register current font's english name as alias - const bool ttf = textmetric->tmPitchAndFamily & TMPF_TRUETYPE; - if (ttf && localizedName(faceName)) { - const QString englishName = getEnglishName(faceName); - if (!englishName.isEmpty()) { - QPlatformFontDatabase::registerAliasToFontFamily(faceName, englishName); - // Check whether the system default font name is an alias of the current font family name, - // as on Chinese Windows, where the system font "SimSun" is an alias to a font registered under a local name - if (!context->seenSystemDefaultFont && englishName == context->systemDefaultFont) - context->seenSystemDefaultFont = true; - } - } - } - return 1; // continue -} - -void QWindowsFontDatabase::populateFontDatabase() -{ - removeApplicationFonts(); - HDC dummy = GetDC(0); - LOGFONT lf; - lf.lfCharSet = DEFAULT_CHARSET; - lf.lfFaceName[0] = 0; - lf.lfPitchAndFamily = 0; - PopulateFamiliesContext context(QWindowsFontDatabase::systemDefaultFont().family()); - EnumFontFamiliesEx(dummy, &lf, populateFontFamilies, reinterpret_cast(&context), 0); - ReleaseDC(0, dummy); - // Work around EnumFontFamiliesEx() not listing the system font. - if (!context.seenSystemDefaultFont) - QPlatformFontDatabase::registerFontFamily(context.systemDefaultFont); -} - -typedef QSharedPointer QWindowsFontEngineDataPtr; - -#ifndef QT_NO_THREAD -typedef QThreadStorage FontEngineThreadLocalData; - -Q_GLOBAL_STATIC(FontEngineThreadLocalData, fontEngineThreadLocalData) - -QSharedPointer sharedFontData() -{ - FontEngineThreadLocalData *data = fontEngineThreadLocalData(); - if (!data->hasLocalData()) - data->setLocalData(QSharedPointer::create()); - return data->localData(); -} -#else // !QT_NO_THREAD -Q_GLOBAL_STATIC(QWindowsFontEngineDataPtr, fontEngineData) - -QWindowsFontEngineDataPtr sharedFontData() -{ - QWindowsFontEngineDataPtr *data = fontEngineData(); - if (data->isNull()) - *data = QWindowsFontEngineDataPtr::create(); - return *data; -} -#endif // QT_NO_THREAD - -extern Q_GUI_EXPORT bool qt_needs_a8_gamma_correction; - -QWindowsFontDatabase::QWindowsFontDatabase() -{ - // Properties accessed by QWin32PrintEngine (Qt Print Support) - static const int hfontMetaTypeId = qRegisterMetaType(); - static const int logFontMetaTypeId = qRegisterMetaType(); - Q_UNUSED(hfontMetaTypeId) - Q_UNUSED(logFontMetaTypeId) - - if (lcQpaFonts().isDebugEnabled()) { - const QWindowsFontEngineDataPtr data = sharedFontData(); - qCDebug(lcQpaFonts) << __FUNCTION__ << "Clear type: " - << data->clearTypeEnabled << "gamma: " << data->fontSmoothingGamma; - } - qt_needs_a8_gamma_correction = true; -} - -QWindowsFontDatabase::~QWindowsFontDatabase() -{ - removeApplicationFonts(); -} - -QFontEngineMulti *QWindowsFontDatabase::fontEngineMulti(QFontEngine *fontEngine, QChar::Script script) -{ - return new QWindowsMultiFontEngine(fontEngine, script); -} - -QFontEngine * QWindowsFontDatabase::fontEngine(const QFontDef &fontDef, void *handle) -{ - QFontEngine *fe = QWindowsFontDatabase::createEngine(fontDef, - QWindowsContext::instance()->defaultDPI(), - sharedFontData()); - qCDebug(lcQpaFonts) << __FUNCTION__ << "FONTDEF" << fontDef << fe << handle; - return fe; -} - -QFontEngine *QWindowsFontDatabase::fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference) -{ - EmbeddedFont font(fontData); - QFontEngine *fontEngine = 0; - -#if !defined(QT_NO_DIRECTWRITE) - if (!useDirectWrite(hintingPreference)) -#endif - { - GUID guid; - CoCreateGuid(&guid); - -QT_WARNING_PUSH -QT_WARNING_DISABLE_GCC("-Wstrict-aliasing") - QString uniqueFamilyName = QLatin1Char('f') - + QString::number(guid.Data1, 36) + QLatin1Char('-') - + QString::number(guid.Data2, 36) + QLatin1Char('-') - + QString::number(guid.Data3, 36) + QLatin1Char('-') - + QString::number(*reinterpret_cast(guid.Data4), 36); -QT_WARNING_POP - - QString actualFontName = font.changeFamilyName(uniqueFamilyName); - if (actualFontName.isEmpty()) { - qWarning("%s: Can't change family name of font", __FUNCTION__); - return 0; - } - - DWORD count = 0; - QByteArray newFontData = font.data(); - HANDLE fontHandle = - AddFontMemResourceEx(const_cast(newFontData.constData()), - DWORD(newFontData.size()), 0, &count); - if (count == 0 && fontHandle != 0) { - RemoveFontMemResourceEx(fontHandle); - fontHandle = 0; - } - - if (fontHandle == 0) { - qWarning("%s: AddFontMemResourceEx failed", __FUNCTION__); - } else { - QFontDef request; - request.family = uniqueFamilyName; - request.pixelSize = pixelSize; - request.styleStrategy = QFont::PreferMatch; - request.hintingPreference = hintingPreference; - request.stretch = QFont::Unstretched; - - fontEngine = QWindowsFontDatabase::createEngine(request, - QWindowsContext::instance()->defaultDPI(), - sharedFontData()); - - if (fontEngine) { - if (request.family != fontEngine->fontDef.family) { - qWarning("%s: Failed to load font. Got fallback instead: %s", - __FUNCTION__, qPrintable(fontEngine->fontDef.family)); - if (fontEngine->ref.load() == 0) - delete fontEngine; - fontEngine = 0; - } else { - Q_ASSERT(fontEngine->ref.load() == 0); - - // Override the generated font name - switch (fontEngine->type()) { - case QFontEngine::Win: - static_cast(fontEngine)->setUniqueFamilyName(uniqueFamilyName); - fontEngine->fontDef.family = actualFontName; - break; - -#if !defined(QT_NO_DIRECTWRITE) - case QFontEngine::DirectWrite: - static_cast(fontEngine)->setUniqueFamilyName(uniqueFamilyName); - fontEngine->fontDef.family = actualFontName; - break; -#endif // !QT_NO_DIRECTWRITE - - default: - Q_ASSERT_X(false, Q_FUNC_INFO, "Unhandled font engine."); - } - - UniqueFontData uniqueData; - uniqueData.handle = fontHandle; - uniqueData.refCount.ref(); - m_uniqueFontData[uniqueFamilyName] = uniqueData; - } - } else { - RemoveFontMemResourceEx(fontHandle); - } - } - } -#if !defined(QT_NO_DIRECTWRITE) - else { - CustomFontFileLoader fontFileLoader; - fontFileLoader.addKey(this, fontData); - - QSharedPointer fontEngineData = sharedFontData(); - if (!initDirectWrite(fontEngineData.data())) - return 0; - - IDWriteFontFile *fontFile = 0; - void *key = this; - - HRESULT hres = fontEngineData->directWriteFactory->CreateCustomFontFileReference(&key, - sizeof(void *), - fontFileLoader.loader(), - &fontFile); - if (FAILED(hres)) { - qErrnoWarning(hres, "%s: CreateCustomFontFileReference failed", __FUNCTION__); - return 0; - } - - BOOL isSupportedFontType; - DWRITE_FONT_FILE_TYPE fontFileType; - DWRITE_FONT_FACE_TYPE fontFaceType; - UINT32 numberOfFaces; - fontFile->Analyze(&isSupportedFontType, &fontFileType, &fontFaceType, &numberOfFaces); - if (!isSupportedFontType) { - fontFile->Release(); - return 0; - } - - IDWriteFontFace *directWriteFontFace = 0; - hres = fontEngineData->directWriteFactory->CreateFontFace(fontFaceType, - 1, - &fontFile, - 0, - DWRITE_FONT_SIMULATIONS_NONE, - &directWriteFontFace); - if (FAILED(hres)) { - qErrnoWarning(hres, "%s: CreateFontFace failed", __FUNCTION__); - fontFile->Release(); - return 0; - } - - fontFile->Release(); - - fontEngine = new QWindowsFontEngineDirectWrite(directWriteFontFace, - pixelSize, - fontEngineData); - - // Get font family from font data - fontEngine->fontDef.family = font.familyName(); - fontEngine->fontDef.hintingPreference = hintingPreference; - - directWriteFontFace->Release(); - } -#endif - - // Get style and weight info - if (fontEngine != 0) { - TableDirectory *os2TableEntry = font.tableDirectoryEntry("OS/2"); - if (os2TableEntry != 0) { - const OS2Table *os2Table = - reinterpret_cast(fontData.constData() - + qFromBigEndian(os2TableEntry->offset)); - - bool italic = qFromBigEndian(os2Table->selection) & 1; - bool oblique = qFromBigEndian(os2Table->selection) & 128; - - if (italic) - fontEngine->fontDef.style = QFont::StyleItalic; - else if (oblique) - fontEngine->fontDef.style = QFont::StyleOblique; - else - fontEngine->fontDef.style = QFont::StyleNormal; - - fontEngine->fontDef.weight = QPlatformFontDatabase::weightFromInteger(qFromBigEndian(os2Table->weightClass)); - } - } - - qCDebug(lcQpaFonts) << __FUNCTION__ << "FONTDATA" << fontData << pixelSize << hintingPreference << fontEngine; - return fontEngine; -} - -static QList getTrueTypeFontOffsets(const uchar *fontData) -{ - QList offsets; - const quint32 headerTag = *reinterpret_cast(fontData); - if (headerTag != MAKE_TAG('t', 't', 'c', 'f')) { - if (headerTag != MAKE_TAG(0, 1, 0, 0) - && headerTag != MAKE_TAG('O', 'T', 'T', 'O') - && headerTag != MAKE_TAG('t', 'r', 'u', 'e') - && headerTag != MAKE_TAG('t', 'y', 'p', '1')) - return offsets; - offsets << 0; - return offsets; - } - const quint32 numFonts = qFromBigEndian(fontData + 8); - for (uint i = 0; i < numFonts; ++i) { - offsets << qFromBigEndian(fontData + 12 + i * 4); - } - return offsets; -} - -static void getFontTable(const uchar *fileBegin, const uchar *data, quint32 tag, const uchar **table, quint32 *length) -{ - const quint16 numTables = qFromBigEndian(data + 4); - for (uint i = 0; i < numTables; ++i) { - const quint32 offset = 12 + 16 * i; - if (*reinterpret_cast(data + offset) == tag) { - *table = fileBegin + qFromBigEndian(data + offset + 8); - *length = qFromBigEndian(data + offset + 12); - return; - } - } - *table = 0; - *length = 0; - return; -} - -static void getFamiliesAndSignatures(const QByteArray &fontData, - QList *families, - QVector *signatures) -{ - const uchar *data = reinterpret_cast(fontData.constData()); - - QList offsets = getTrueTypeFontOffsets(data); - if (offsets.isEmpty()) - return; - - for (int i = 0; i < offsets.count(); ++i) { - const uchar *font = data + offsets.at(i); - const uchar *table; - quint32 length; - getFontTable(data, font, MAKE_TAG('n', 'a', 'm', 'e'), &table, &length); - if (!table) - continue; - FontNames names = getCanonicalFontNames(table, length); - if (names.name.isEmpty()) - continue; - - families->append(qMove(names)); - - if (signatures) { - FONTSIGNATURE signature; - getFontTable(data, font, MAKE_TAG('O', 'S', '/', '2'), &table, &length); - if (table && length >= 86) { - // Offsets taken from OS/2 table in the TrueType spec - signature.fsUsb[0] = qFromBigEndian(table + 42); - signature.fsUsb[1] = qFromBigEndian(table + 46); - signature.fsUsb[2] = qFromBigEndian(table + 50); - signature.fsUsb[3] = qFromBigEndian(table + 54); - - signature.fsCsb[0] = qFromBigEndian(table + 78); - signature.fsCsb[1] = qFromBigEndian(table + 82); - } else { - memset(&signature, 0, sizeof(signature)); - } - signatures->append(signature); - } - } -} - -QStringList QWindowsFontDatabase::addApplicationFont(const QByteArray &fontData, const QString &fileName) -{ - WinApplicationFont font; - font.fileName = fileName; - QVector signatures; - QList families; - QStringList familyNames; - - if (!fontData.isEmpty()) { - getFamiliesAndSignatures(fontData, &families, &signatures); - if (families.isEmpty()) - return familyNames; - - DWORD dummy = 0; - font.handle = - AddFontMemResourceEx(const_cast(fontData.constData()), - DWORD(fontData.size()), 0, &dummy); - if (font.handle == 0) - return QStringList(); - - // Memory fonts won't show up in enumeration, so do add them the hard way. - for (int j = 0; j < families.count(); ++j) { - const QString familyName = families.at(j).name; - const QString styleName = families.at(j).style; - familyNames << familyName; - HDC hdc = GetDC(0); - LOGFONT lf; - memset(&lf, 0, sizeof(LOGFONT)); - memcpy(lf.lfFaceName, familyName.utf16(), sizeof(wchar_t) * qMin(LF_FACESIZE - 1, familyName.size())); - lf.lfCharSet = DEFAULT_CHARSET; - HFONT hfont = CreateFontIndirect(&lf); - HGDIOBJ oldobj = SelectObject(hdc, hfont); - - TEXTMETRIC textMetrics; - GetTextMetrics(hdc, &textMetrics); - - addFontToDatabase(familyName, styleName, lf.lfCharSet, &textMetrics, &signatures.at(j), - TRUETYPE_FONTTYPE, true); - - SelectObject(hdc, oldobj); - DeleteObject(hfont); - ReleaseDC(0, hdc); - } - } else { - QFile f(fileName); - if (!f.open(QIODevice::ReadOnly)) - return QStringList(); - QByteArray data = f.readAll(); - f.close(); - - getFamiliesAndSignatures(data, &families, 0); - if (families.isEmpty()) - return QStringList(); - - if (AddFontResourceExW((wchar_t*)fileName.utf16(), FR_PRIVATE, 0) == 0) - return QStringList(); - - font.handle = 0; - - // Fonts based on files are added via populate, as they will show up in font enumeration. - for (int j = 0; j < families.count(); ++j) { - const QString familyName = families.at(j).name; - familyNames << familyName; - populateFamily(familyName, true); - } - } - - m_applicationFonts << font; - - return familyNames; -} - -void QWindowsFontDatabase::removeApplicationFonts() -{ - foreach (const WinApplicationFont &font, m_applicationFonts) { - if (font.handle) { - RemoveFontMemResourceEx(font.handle); - } else { - RemoveFontResourceExW((LPCWSTR)font.fileName.utf16(), FR_PRIVATE, 0); - } - } - m_applicationFonts.clear(); -} - -void QWindowsFontDatabase::releaseHandle(void * /* handle */) -{ -} - -QString QWindowsFontDatabase::fontDir() const -{ - const QString result = QPlatformFontDatabase::fontDir(); - qCDebug(lcQpaFonts) << __FUNCTION__ << result; - return result; -} - -bool QWindowsFontDatabase::fontsAlwaysScalable() const -{ - return true; -} - -void QWindowsFontDatabase::derefUniqueFont(const QString &uniqueFont) -{ - if (m_uniqueFontData.contains(uniqueFont)) { - if (!m_uniqueFontData[uniqueFont].refCount.deref()) { - RemoveFontMemResourceEx(m_uniqueFontData[uniqueFont].handle); - m_uniqueFontData.remove(uniqueFont); - } - } -} - -void QWindowsFontDatabase::refUniqueFont(const QString &uniqueFont) -{ - if (m_uniqueFontData.contains(uniqueFont)) - m_uniqueFontData[uniqueFont].refCount.ref(); -} - -HFONT QWindowsFontDatabase::systemFont() -{ - static const HFONT stock_sysfont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); - return stock_sysfont; -} - -// Creation functions - -static const char *other_tryFonts[] = { - "Arial", - "MS UI Gothic", - "Gulim", - "SimSun", - "PMingLiU", - "Arial Unicode MS", - 0 -}; - -static const char *jp_tryFonts [] = { - "MS UI Gothic", - "Arial", - "Gulim", - "SimSun", - "PMingLiU", - "Arial Unicode MS", - 0 -}; - -static const char *ch_CN_tryFonts [] = { - "SimSun", - "Arial", - "PMingLiU", - "Gulim", - "MS UI Gothic", - "Arial Unicode MS", - 0 -}; - -static const char *ch_TW_tryFonts [] = { - "PMingLiU", - "Arial", - "SimSun", - "Gulim", - "MS UI Gothic", - "Arial Unicode MS", - 0 -}; - -static const char *kr_tryFonts[] = { - "Gulim", - "Arial", - "PMingLiU", - "SimSun", - "MS UI Gothic", - "Arial Unicode MS", - 0 -}; - -static const char **tryFonts = 0; - -LOGFONT QWindowsFontDatabase::fontDefToLOGFONT(const QFontDef &request) -{ - LOGFONT lf; - memset(&lf, 0, sizeof(LOGFONT)); - - lf.lfHeight = -qRound(request.pixelSize); - lf.lfWidth = 0; - lf.lfEscapement = 0; - lf.lfOrientation = 0; - if (request.weight == 50) - lf.lfWeight = FW_DONTCARE; - else - lf.lfWeight = (request.weight*900)/99; - lf.lfItalic = request.style != QFont::StyleNormal; - lf.lfCharSet = DEFAULT_CHARSET; - - int strat = OUT_DEFAULT_PRECIS; - if (request.styleStrategy & QFont::PreferBitmap) { - strat = OUT_RASTER_PRECIS; - } else if (request.styleStrategy & QFont::PreferDevice) { - strat = OUT_DEVICE_PRECIS; - } else if (request.styleStrategy & QFont::PreferOutline) { - strat = OUT_OUTLINE_PRECIS; - } else if (request.styleStrategy & QFont::ForceOutline) { - strat = OUT_TT_ONLY_PRECIS; - } - - lf.lfOutPrecision = strat; - - int qual = DEFAULT_QUALITY; - - if (request.styleStrategy & QFont::PreferMatch) - qual = DRAFT_QUALITY; - else if (request.styleStrategy & QFont::PreferQuality) - qual = PROOF_QUALITY; - - if (request.styleStrategy & QFont::PreferAntialias) { - if (QSysInfo::WindowsVersion >= QSysInfo::WV_XP && !(request.styleStrategy & QFont::NoSubpixelAntialias)) { - qual = CLEARTYPE_QUALITY; - } else { - qual = ANTIALIASED_QUALITY; - } - } else if (request.styleStrategy & QFont::NoAntialias) { - qual = NONANTIALIASED_QUALITY; - } else if ((request.styleStrategy & QFont::NoSubpixelAntialias) && sharedFontData()->clearTypeEnabled) { - qual = ANTIALIASED_QUALITY; - } - - lf.lfQuality = qual; - - lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; - - int hint = FF_DONTCARE; - switch (request.styleHint) { - case QFont::Helvetica: - hint = FF_SWISS; - break; - case QFont::Times: - hint = FF_ROMAN; - break; - case QFont::Courier: - hint = FF_MODERN; - break; - case QFont::OldEnglish: - hint = FF_DECORATIVE; - break; - case QFont::System: - hint = FF_MODERN; - break; - default: - break; - } - - lf.lfPitchAndFamily = DEFAULT_PITCH | hint; - - QString fam = request.family; - if (Q_UNLIKELY(fam.size() >= LF_FACESIZE)) { - qCritical("%s: Family name '%s' is too long.", __FUNCTION__, qPrintable(fam)); - fam.truncate(LF_FACESIZE - 1); - } - - if (fam.isEmpty()) - fam = QStringLiteral("MS Sans Serif"); - - if (fam == QLatin1String("MS Sans Serif") - && (request.style == QFont::StyleItalic || (-lf.lfHeight > 18 && -lf.lfHeight != 24))) { - fam = QStringLiteral("Arial"); // MS Sans Serif has bearing problems in italic, and does not scale - } - if (fam == QLatin1String("Courier") && !(request.styleStrategy & QFont::PreferBitmap)) - fam = QStringLiteral("Courier New"); - - memcpy(lf.lfFaceName, fam.utf16(), fam.size() * sizeof(wchar_t)); - - return lf; -} - -QStringList QWindowsFontDatabase::extraTryFontsForFamily(const QString &family) -{ - QStringList result; - QFontDatabase db; - if (!db.writingSystems(family).contains(QFontDatabase::Symbol)) { - if (!tryFonts) { - LANGID lid = GetUserDefaultLangID(); - switch (lid&0xff) { - case LANG_CHINESE: // Chinese - if ( lid == 0x0804 || lid == 0x1004) // China mainland and Singapore - tryFonts = ch_CN_tryFonts; - else - tryFonts = ch_TW_tryFonts; // Taiwan, Hong Kong and Macau - break; - case LANG_JAPANESE: - tryFonts = jp_tryFonts; - break; - case LANG_KOREAN: - tryFonts = kr_tryFonts; - break; - default: - tryFonts = other_tryFonts; - break; - } - } - QFontDatabase db; - const QStringList families = db.families(); - const char **tf = tryFonts; - while (tf && *tf) { - // QTBUG-31689, family might be an English alias for a localized font name. - const QString family = QString::fromLatin1(*tf); - if (families.contains(family) || db.hasFamily(family)) - result << family; - ++tf; - } - } - result.append(QStringLiteral("Segoe UI Emoji")); - result.append(QStringLiteral("Segoe UI Symbol")); - return result; -} - -QString QWindowsFontDatabase::familyForStyleHint(QFont::StyleHint styleHint) -{ - switch (styleHint) { - case QFont::Times: - return QStringLiteral("Times New Roman"); - case QFont::Courier: - return QStringLiteral("Courier New"); - case QFont::Monospace: - return QStringLiteral("Courier New"); - case QFont::Cursive: - return QStringLiteral("Comic Sans MS"); - case QFont::Fantasy: - return QStringLiteral("Impact"); - case QFont::Decorative: - return QStringLiteral("Old English"); - case QFont::Helvetica: - return QStringLiteral("Arial"); - case QFont::System: - default: - break; - } - return QStringLiteral("MS Shell Dlg 2"); -} - -QStringList QWindowsFontDatabase::fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const -{ - QStringList result; - result.append(QWindowsFontDatabase::familyForStyleHint(styleHint)); - result.append(QWindowsFontDatabase::extraTryFontsForFamily(family)); - result.append(QPlatformFontDatabase::fallbacksForFamily(family, style, styleHint, script)); - - qCDebug(lcQpaFonts) << __FUNCTION__ << family << style << styleHint - << script << result; - return result; -} - - -QFontEngine *QWindowsFontDatabase::createEngine(const QFontDef &request, - int dpi, - const QSharedPointer &data) -{ - QFontEngine *fe = 0; - - LOGFONT lf = fontDefToLOGFONT(request); - const bool preferClearTypeAA = lf.lfQuality == CLEARTYPE_QUALITY; - - if (request.stretch != 100) { - HFONT hfont = CreateFontIndirect(&lf); - if (!hfont) { - qErrnoWarning("%s: CreateFontIndirect failed", __FUNCTION__); - hfont = QWindowsFontDatabase::systemFont(); - } - - HGDIOBJ oldObj = SelectObject(data->hdc, hfont); - TEXTMETRIC tm; - if (!GetTextMetrics(data->hdc, &tm)) - qErrnoWarning("%s: GetTextMetrics failed", __FUNCTION__); - else - lf.lfWidth = tm.tmAveCharWidth * request.stretch / 100; - SelectObject(data->hdc, oldObj); - - DeleteObject(hfont); - } - -#if !defined(QT_NO_DIRECTWRITE) - if (initDirectWrite(data.data())) { - const QString fam = QString::fromWCharArray(lf.lfFaceName); - const QString nameSubstitute = QWindowsFontEngineDirectWrite::fontNameSubstitute(fam); - if (nameSubstitute != fam) { - const int nameSubstituteLength = qMin(nameSubstitute.length(), LF_FACESIZE - 1); - memcpy(lf.lfFaceName, nameSubstitute.utf16(), nameSubstituteLength * sizeof(wchar_t)); - lf.lfFaceName[nameSubstituteLength] = 0; - } - - HFONT hfont = CreateFontIndirect(&lf); - if (!hfont) { - qErrnoWarning("%s: CreateFontIndirect failed", __FUNCTION__); - } else { - HGDIOBJ oldFont = SelectObject(data->hdc, hfont); - - IDWriteFontFace *directWriteFontFace = NULL; - HRESULT hr = data->directWriteGdiInterop->CreateFontFaceFromHdc(data->hdc, &directWriteFontFace); - if (FAILED(hr)) { - const QString errorString = qt_error_string(int(hr)); - qWarning().noquote().nospace() << "DirectWrite: CreateFontFaceFromHDC() failed (" - << errorString << ") for " << request << ' ' << lf << " dpi=" << dpi; - } else { - bool isColorFont = false; -#if defined(QT_USE_DIRECTWRITE2) - IDWriteFontFace2 *directWriteFontFace2 = Q_NULLPTR; - if (SUCCEEDED(directWriteFontFace->QueryInterface(__uuidof(IDWriteFontFace2), - reinterpret_cast(&directWriteFontFace2)))) { - if (directWriteFontFace2->IsColorFont()) - isColorFont = directWriteFontFace2->GetPaletteEntryCount() > 0; - } -#endif - const QFont::HintingPreference hintingPreference = - static_cast(request.hintingPreference); - const bool useDw = useDirectWrite(hintingPreference, fam, isColorFont); - qCDebug(lcQpaFonts) << __FUNCTION__ << request.family << request.pointSize - << "pt" << "hintingPreference=" << hintingPreference << "color=" << isColorFont - << dpi << "dpi" << "useDirectWrite=" << useDw; - if (useDw) { - QWindowsFontEngineDirectWrite *fedw = new QWindowsFontEngineDirectWrite(directWriteFontFace, - request.pixelSize, - data); - - wchar_t n[64]; - GetTextFace(data->hdc, 64, n); - - QFontDef fontDef = request; - fontDef.family = QString::fromWCharArray(n); - - if (isColorFont) - fedw->glyphFormat = QFontEngine::Format_ARGB; - fedw->initFontInfo(fontDef, dpi); - fe = fedw; - } else { - directWriteFontFace->Release(); - } - } - - SelectObject(data->hdc, oldFont); - DeleteObject(hfont); - } - } -#endif // QT_NO_DIRECTWRITE - - if (!fe) { - QWindowsFontEngine *few = new QWindowsFontEngine(request.family, lf, data); - if (preferClearTypeAA) - few->glyphFormat = QFontEngine::Format_A32; - few->initFontInfo(request, dpi); - fe = few; - } - - return fe; -} - -static inline int verticalDPI() -{ - return GetDeviceCaps(QWindowsContext::instance()->displayContext(), LOGPIXELSY); -} - -QFont QWindowsFontDatabase::systemDefaultFont() -{ - LOGFONT lf; - GetObject(QWindowsFontDatabase::systemFont(), sizeof(lf), &lf); - QFont systemFont = QWindowsFontDatabase::LOGFONT_to_QFont(lf); - // "MS Shell Dlg 2" is the correct system font >= Win2k - if (systemFont.family() == QLatin1String("MS Shell Dlg")) - systemFont.setFamily(QStringLiteral("MS Shell Dlg 2")); - qCDebug(lcQpaFonts) << __FUNCTION__ << systemFont; - return systemFont; -} - -QFont QWindowsFontDatabase::LOGFONT_to_QFont(const LOGFONT& logFont, int verticalDPI_In) -{ - if (verticalDPI_In <= 0) - verticalDPI_In = verticalDPI(); - QFont qFont(QString::fromWCharArray(logFont.lfFaceName)); - qFont.setItalic(logFont.lfItalic); - if (logFont.lfWeight != FW_DONTCARE) - qFont.setWeight(QPlatformFontDatabase::weightFromInteger(logFont.lfWeight)); - const qreal logFontHeight = qAbs(logFont.lfHeight); - qFont.setPointSizeF(logFontHeight * 72.0 / qreal(verticalDPI_In)); - qFont.setUnderline(logFont.lfUnderline); - qFont.setOverline(false); - qFont.setStrikeOut(logFont.lfStrikeOut); - return qFont; -} - -QT_END_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase.h b/src/plugins/platforms/windows/qwindowsfontdatabase.h deleted file mode 100644 index 8b8c9c15f4..0000000000 --- a/src/plugins/platforms/windows/qwindowsfontdatabase.h +++ /dev/null @@ -1,133 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QWINDOWSFONTDATABASE_H -#define QWINDOWSFONTDATABASE_H - -#include -#include -#include - -#if !defined(QT_NO_DIRECTWRITE) - struct IDWriteFactory; - struct IDWriteGdiInterop; -#endif - -QT_BEGIN_NAMESPACE - -class QWindowsFontEngineData -{ - Q_DISABLE_COPY(QWindowsFontEngineData) -public: - QWindowsFontEngineData(); - ~QWindowsFontEngineData(); - - uint pow_gamma[256]; - - bool clearTypeEnabled; - qreal fontSmoothingGamma; - HDC hdc; -#if !defined(QT_NO_DIRECTWRITE) - IDWriteFactory *directWriteFactory; - IDWriteGdiInterop *directWriteGdiInterop; -#endif -}; - -class QWindowsFontDatabase : public QPlatformFontDatabase -{ -public: - QWindowsFontDatabase(); - ~QWindowsFontDatabase(); - - void populateFontDatabase() Q_DECL_OVERRIDE; - void populateFamily(const QString &familyName) Q_DECL_OVERRIDE; - QFontEngineMulti *fontEngineMulti(QFontEngine *fontEngine, QChar::Script script) Q_DECL_OVERRIDE; - QFontEngine *fontEngine(const QFontDef &fontDef, void *handle) Q_DECL_OVERRIDE; - QFontEngine *fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference) Q_DECL_OVERRIDE; - QStringList fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const Q_DECL_OVERRIDE; - QStringList addApplicationFont(const QByteArray &fontData, const QString &fileName) Q_DECL_OVERRIDE; - void releaseHandle(void *handle) Q_DECL_OVERRIDE; - QString fontDir() const Q_DECL_OVERRIDE; - - QFont defaultFont() const Q_DECL_OVERRIDE { return systemDefaultFont(); } - bool fontsAlwaysScalable() const Q_DECL_OVERRIDE; - void derefUniqueFont(const QString &uniqueFont); - void refUniqueFont(const QString &uniqueFont); - - static QFont systemDefaultFont(); - - static QFontEngine *createEngine(const QFontDef &request, - int dpi, - const QSharedPointer &data); - - static HFONT systemFont(); - static QFont LOGFONT_to_QFont(const LOGFONT& lf, int verticalDPI = 0); - - static qreal fontSmoothingGamma(); - static LOGFONT fontDefToLOGFONT(const QFontDef &fontDef); - - static QStringList extraTryFontsForFamily(const QString &family); - static QString familyForStyleHint(QFont::StyleHint styleHint); - -private: - void populateFamily(const QString &familyName, bool registerAlias); - void removeApplicationFonts(); - - struct WinApplicationFont { - HANDLE handle; - QString fileName; - }; - - QList m_applicationFonts; - - struct UniqueFontData { - HANDLE handle; - QAtomicInt refCount; - }; - - QMap m_uniqueFontData; -}; - -#ifndef QT_NO_DEBUG_STREAM -QDebug operator<<(QDebug, const QFontDef &def); -#endif - -QT_END_NAMESPACE - -#endif // QWINDOWSFONTDATABASE_H diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp deleted file mode 100644 index bc0e5cc523..0000000000 --- a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp +++ /dev/null @@ -1,438 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qwindowsfontdatabase_ft.h" -#include "qwindowsfontdatabase.h" -#include "qwindowscontext.h" - -#include -#include FT_TRUETYPE_TABLES_H - -#include -#include -#include -#include -#include -#include -#include - -#include - -QT_BEGIN_NAMESPACE - -static inline QFontDatabase::WritingSystem writingSystemFromCharSet(uchar charSet) -{ - switch (charSet) { - case ANSI_CHARSET: - case EASTEUROPE_CHARSET: - case BALTIC_CHARSET: - case TURKISH_CHARSET: - return QFontDatabase::Latin; - case GREEK_CHARSET: - return QFontDatabase::Greek; - case RUSSIAN_CHARSET: - return QFontDatabase::Cyrillic; - case HEBREW_CHARSET: - return QFontDatabase::Hebrew; - case ARABIC_CHARSET: - return QFontDatabase::Arabic; - case THAI_CHARSET: - return QFontDatabase::Thai; - case GB2312_CHARSET: - return QFontDatabase::SimplifiedChinese; - case CHINESEBIG5_CHARSET: - return QFontDatabase::TraditionalChinese; - case SHIFTJIS_CHARSET: - return QFontDatabase::Japanese; - case HANGUL_CHARSET: - case JOHAB_CHARSET: - return QFontDatabase::Korean; - case VIETNAMESE_CHARSET: - return QFontDatabase::Vietnamese; - case SYMBOL_CHARSET: - return QFontDatabase::Symbol; - default: - break; - } - return QFontDatabase::Any; -} - -static FontFile * createFontFile(const QString &fileName, int index) -{ - FontFile *fontFile = new FontFile; - fontFile->fileName = fileName; - fontFile->indexValue = index; - return fontFile; -} - -extern bool localizedName(const QString &name); -extern QString getEnglishName(const QString &familyName, bool includeStyle = false); - -namespace { -struct FontKey -{ - QString fileName; - QStringList fontNames; -}; -} // namespace - -typedef QVector FontKeys; - -static FontKeys &fontKeys() -{ - static FontKeys result; - if (result.isEmpty()) { - const QSettings fontRegistry(QStringLiteral("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"), - QSettings::NativeFormat); - const QStringList allKeys = fontRegistry.allKeys(); - const QString trueType = QStringLiteral("(TrueType)"); -#ifndef QT_NO_REGULAREXPRESSION - const QRegularExpression sizeListMatch(QStringLiteral("\\s(\\d+,)+\\d+")); -#else - const QRegExp sizeListMatch(QLatin1String("\\s(\\d+,)+\\d+")); -#endif - Q_ASSERT(sizeListMatch.isValid()); - const int size = allKeys.size(); - result.reserve(size); - for (int i = 0; i < size; ++i) { - FontKey fontKey; - const QString ®istryFontKey = allKeys.at(i); - fontKey.fileName = fontRegistry.value(registryFontKey).toString(); - QString realKey = registryFontKey; - realKey.remove(trueType); - realKey.remove(sizeListMatch); - const auto fontNames = QStringRef(&realKey).trimmed().split(QLatin1Char('&')); - fontKey.fontNames.reserve(fontNames.size()); - for (const QStringRef &fontName : fontNames) - fontKey.fontNames.append(fontName.trimmed().toString()); - result.append(fontKey); - } - } - return result; -} - -static const FontKey *findFontKey(const QString &name, int *indexIn = Q_NULLPTR) -{ - const FontKeys &keys = fontKeys(); - for (auto it = keys.constBegin(), cend = keys.constEnd(); it != cend; ++it) { - const int index = it->fontNames.indexOf(name); - if (index >= 0) { - if (indexIn) - *indexIn = index; - return &(*it); - } - } - if (indexIn) - *indexIn = -1; - return Q_NULLPTR; -} - -static bool addFontToDatabase(const QString &faceName, - const QString &styleName, - const QString &fullName, - uchar charSet, - const TEXTMETRIC *textmetric, - const FONTSIGNATURE *signature, - int type, - bool registerAlias) -{ - // the "@family" fonts are just the same as "family". Ignore them. - if (faceName.isEmpty() || faceName.at(0) == QLatin1Char('@') || faceName.startsWith(QLatin1String("WST_"))) - return false; - - static const int SMOOTH_SCALABLE = 0xffff; - const QString foundryName; // No such concept. - const bool fixed = !(textmetric->tmPitchAndFamily & TMPF_FIXED_PITCH); - const bool ttf = (textmetric->tmPitchAndFamily & TMPF_TRUETYPE); - const bool scalable = textmetric->tmPitchAndFamily & (TMPF_VECTOR|TMPF_TRUETYPE); - const int size = scalable ? SMOOTH_SCALABLE : textmetric->tmHeight; - const QFont::Style style = textmetric->tmItalic ? QFont::StyleItalic : QFont::StyleNormal; - const bool antialias = false; - const QFont::Weight weight = QPlatformFontDatabase::weightFromInteger(textmetric->tmWeight); - const QFont::Stretch stretch = QFont::Unstretched; - -#ifndef QT_NO_DEBUG_STREAM - if (QWindowsContext::verbose > 2) { - QString message; - QTextStream str(&message); - str << __FUNCTION__ << ' ' << faceName << "::" << fullName << ' ' << charSet << " TTF=" << ttf; - if (type & DEVICE_FONTTYPE) - str << " DEVICE"; - if (type & RASTER_FONTTYPE) - str << " RASTER"; - if (type & TRUETYPE_FONTTYPE) - str << " TRUETYPE"; - str << " scalable=" << scalable << " Size=" << size - << " Style=" << style << " Weight=" << weight - << " stretch=" << stretch; - qCDebug(lcQpaFonts) << message; - } -#endif - - QString englishName; - if (registerAlias & ttf && localizedName(faceName)) - englishName = getEnglishName(faceName); - - QSupportedWritingSystems writingSystems; - if (type & TRUETYPE_FONTTYPE) { - Q_ASSERT(signature); - quint32 unicodeRange[4] = { - signature->fsUsb[0], signature->fsUsb[1], - signature->fsUsb[2], signature->fsUsb[3] - }; - quint32 codePageRange[2] = { - signature->fsCsb[0], signature->fsCsb[1] - }; - writingSystems = QPlatformFontDatabase::writingSystemsFromTrueTypeBits(unicodeRange, codePageRange); - // ### Hack to work around problem with Thai text on Windows 7. Segoe UI contains - // the symbol for Baht, and Windows thus reports that it supports the Thai script. - // Since it's the default UI font on this platform, most widgets will be unable to - // display Thai text by default. As a temporary work around, we special case Segoe UI - // and remove the Thai script from its list of supported writing systems. - if (writingSystems.supported(QFontDatabase::Thai) && - faceName == QLatin1String("Segoe UI")) - writingSystems.setSupported(QFontDatabase::Thai, false); - } else { - const QFontDatabase::WritingSystem ws = writingSystemFromCharSet(charSet); - if (ws != QFontDatabase::Any) - writingSystems.setSupported(ws); - } - - int index = 0; - const FontKey *key = findFontKey(fullName, &index); - if (!key) { - // On non-English locales, the styles of the font may be localized in enumeration, but - // not in the registry. - QLocale systemLocale = QLocale::system(); - if (systemLocale.language() != QLocale::C - && systemLocale.language() != QLocale::English - && styleName != QLatin1String("Italic") - && styleName != QLatin1String("Bold")) { - key = findFontKey(getEnglishName(fullName, true), &index); - } - if (!key) - key = findFontKey(faceName, &index); - if (!key && !registerAlias && englishName.isEmpty() && localizedName(faceName)) - englishName = getEnglishName(faceName); - if (!key && !englishName.isEmpty()) - key = findFontKey(englishName, &index); - if (!key) - return false; - } - QString value = key->fileName; - if (value.isEmpty()) - return false; - - if (!QDir::isAbsolutePath(value)) - value.prepend(QFile::decodeName(qgetenv("windir") + "\\Fonts\\")); - - QPlatformFontDatabase::registerFont(faceName, styleName, foundryName, weight, style, stretch, - antialias, scalable, size, fixed, writingSystems, createFontFile(value, index)); - - // add fonts windows can generate for us: - if (weight <= QFont::DemiBold && styleName.isEmpty()) - QPlatformFontDatabase::registerFont(faceName, QString(), foundryName, QFont::Bold, style, stretch, - antialias, scalable, size, fixed, writingSystems, createFontFile(value, index)); - - if (style != QFont::StyleItalic && styleName.isEmpty()) - QPlatformFontDatabase::registerFont(faceName, QString(), foundryName, weight, QFont::StyleItalic, stretch, - antialias, scalable, size, fixed, writingSystems, createFontFile(value, index)); - - if (weight <= QFont::DemiBold && style != QFont::StyleItalic && styleName.isEmpty()) - QPlatformFontDatabase::registerFont(faceName, QString(), foundryName, QFont::Bold, QFont::StyleItalic, stretch, - antialias, scalable, size, fixed, writingSystems, createFontFile(value, index)); - - if (!englishName.isEmpty()) - QPlatformFontDatabase::registerAliasToFontFamily(faceName, englishName); - - return true; -} - -static int QT_WIN_CALLBACK storeFont(const LOGFONT *logFont, const TEXTMETRIC *textmetric, - DWORD type, LPARAM) -{ - const ENUMLOGFONTEX *f = reinterpret_cast(logFont); - const QString faceName = QString::fromWCharArray(f->elfLogFont.lfFaceName); - const QString styleName = QString::fromWCharArray(f->elfStyle); - const QString fullName = QString::fromWCharArray(f->elfFullName); - const uchar charSet = f->elfLogFont.lfCharSet; - - // NEWTEXTMETRICEX (passed for TT fonts) is a NEWTEXTMETRIC, which according - // to the documentation is identical to a TEXTMETRIC except for the last four - // members, which we don't use anyway - const FONTSIGNATURE *signature = Q_NULLPTR; - if (type & TRUETYPE_FONTTYPE) - signature = &reinterpret_cast(textmetric)->ntmFontSig; - addFontToDatabase(faceName, styleName, fullName, charSet, textmetric, signature, type, false); - - // keep on enumerating - return 1; -} - -/*! - \brief Populate font database using EnumFontFamiliesEx(). - - Normally, leaving the name empty should enumerate - all fonts, however, system fonts like "MS Shell Dlg 2" - are only found when specifying the name explicitly. -*/ - -void QWindowsFontDatabaseFT::populateFamily(const QString &familyName) -{ - qCDebug(lcQpaFonts) << familyName; - if (familyName.size() >= LF_FACESIZE) { - qCWarning(lcQpaFonts) << "Unable to enumerate family '" << familyName << '\''; - return; - } - HDC dummy = GetDC(0); - LOGFONT lf; - lf.lfCharSet = DEFAULT_CHARSET; - familyName.toWCharArray(lf.lfFaceName); - lf.lfFaceName[familyName.size()] = 0; - lf.lfPitchAndFamily = 0; - EnumFontFamiliesEx(dummy, &lf, storeFont, 0, 0); - ReleaseDC(0, dummy); -} - -namespace { -// Context for enumerating system fonts, records whether the default font has been -// encountered, which is normally not enumerated. -struct PopulateFamiliesContext -{ - PopulateFamiliesContext(const QString &f) : systemDefaultFont(f), seenSystemDefaultFont(false) {} - - QString systemDefaultFont; - bool seenSystemDefaultFont; -}; -} // namespace - -// Delayed population of font families - -static int QT_WIN_CALLBACK populateFontFamilies(const LOGFONT *logFont, const TEXTMETRIC *textmetric, - DWORD, LPARAM lparam) -{ - const ENUMLOGFONTEX *f = reinterpret_cast(logFont); - // the "@family" fonts are just the same as "family". Ignore them. - const wchar_t *faceNameW = f->elfLogFont.lfFaceName; - if (faceNameW[0] && faceNameW[0] != L'@' && wcsncmp(faceNameW, L"WST_", 4)) { - // Register only font families for which a font file exists for delayed population - const bool ttf = textmetric->tmPitchAndFamily & TMPF_TRUETYPE; - const QString faceName = QString::fromWCharArray(faceNameW); - const FontKey *key = findFontKey(faceName); - if (!key) { - key = findFontKey(QString::fromWCharArray(f->elfFullName)); - if (!key && ttf && localizedName(faceName)) - key = findFontKey(getEnglishName(faceName)); - } - if (key) { - QPlatformFontDatabase::registerFontFamily(faceName); - PopulateFamiliesContext *context = reinterpret_cast(lparam); - if (!context->seenSystemDefaultFont && faceName == context->systemDefaultFont) - context->seenSystemDefaultFont = true; - - // Register current font's english name as alias - if (ttf && localizedName(faceName)) { - const QString englishName = getEnglishName(faceName); - if (!englishName.isEmpty()) { - QPlatformFontDatabase::registerAliasToFontFamily(faceName, englishName); - // Check whether the system default font name is an alias of the current font family name, - // as on Chinese Windows, where the system font "SimSun" is an alias to a font registered under a local name - if (!context->seenSystemDefaultFont && englishName == context->systemDefaultFont) - context->seenSystemDefaultFont = true; - } - } - } - } - return 1; // continue -} - -void QWindowsFontDatabaseFT::populateFontDatabase() -{ - HDC dummy = GetDC(0); - LOGFONT lf; - lf.lfCharSet = DEFAULT_CHARSET; - lf.lfFaceName[0] = 0; - lf.lfPitchAndFamily = 0; - PopulateFamiliesContext context(QWindowsFontDatabase::systemDefaultFont().family()); - EnumFontFamiliesEx(dummy, &lf, populateFontFamilies, reinterpret_cast(&context), 0); - ReleaseDC(0, dummy); - // Work around EnumFontFamiliesEx() not listing the system font - if (!context.seenSystemDefaultFont) - QPlatformFontDatabase::registerFontFamily(context.systemDefaultFont); -} - -QFontEngine * QWindowsFontDatabaseFT::fontEngine(const QFontDef &fontDef, void *handle) -{ - QFontEngine *fe = QBasicFontDatabase::fontEngine(fontDef, handle); - qCDebug(lcQpaFonts) << __FUNCTION__ << "FONTDEF" << fontDef.family << fe << handle; - return fe; -} - -QFontEngine *QWindowsFontDatabaseFT::fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference) -{ - QFontEngine *fe = QBasicFontDatabase::fontEngine(fontData, pixelSize, hintingPreference); - qCDebug(lcQpaFonts) << __FUNCTION__ << "FONTDATA" << fontData << pixelSize << hintingPreference << fe; - return fe; -} - -QStringList QWindowsFontDatabaseFT::fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const -{ - QStringList result; - result.append(QWindowsFontDatabase::familyForStyleHint(styleHint)); - result.append(QWindowsFontDatabase::extraTryFontsForFamily(family)); - result.append(QBasicFontDatabase::fallbacksForFamily(family, style, styleHint, script)); - - qCDebug(lcQpaFonts) << __FUNCTION__ << family << style << styleHint - << script << result; - - return result; -} -QString QWindowsFontDatabaseFT::fontDir() const -{ - const QString result = QLatin1String(qgetenv("windir")) + QLatin1String("/Fonts");//QPlatformFontDatabase::fontDir(); - qCDebug(lcQpaFonts) << __FUNCTION__ << result; - return result; -} - -QFont QWindowsFontDatabaseFT::defaultFont() const -{ - return QWindowsFontDatabase::systemDefaultFont(); -} - -QT_END_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.h b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.h deleted file mode 100644 index 90008e20a4..0000000000 --- a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.h +++ /dev/null @@ -1,68 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QWINDOWSFONTDATABASEFT_H -#define QWINDOWSFONTDATABASEFT_H - -#include -#include -#include - -QT_BEGIN_NAMESPACE - -class QWindowsFontDatabaseFT : public QBasicFontDatabase -{ -public: - void populateFontDatabase() Q_DECL_OVERRIDE; - void populateFamily(const QString &familyName) Q_DECL_OVERRIDE; - QFontEngine *fontEngine(const QFontDef &fontDef, void *handle) Q_DECL_OVERRIDE; - QFontEngine *fontEngine(const QByteArray &fontData, qreal pixelSize, - QFont::HintingPreference hintingPreference) Q_DECL_OVERRIDE; - - QStringList fallbacksForFamily(const QString &family, QFont::Style style, - QFont::StyleHint styleHint, - QChar::Script script) const Q_DECL_OVERRIDE; - - QString fontDir() const Q_DECL_OVERRIDE; - QFont defaultFont() const Q_DECL_OVERRIDE; -}; - -QT_END_NAMESPACE - -#endif // QWINDOWSFONTDATABASEFT_H diff --git a/src/plugins/platforms/windows/qwindowsfontengine.cpp b/src/plugins/platforms/windows/qwindowsfontengine.cpp deleted file mode 100644 index f5d1ed9fad..0000000000 --- a/src/plugins/platforms/windows/qwindowsfontengine.cpp +++ /dev/null @@ -1,1328 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qwindowsintegration.h" -#include "qwindowsfontengine.h" -#include "qwindowsnativeimage.h" -#include "qwindowscontext.h" -#include "qwindowsfontdatabase.h" -#include -#include "qwindowsfontenginedirectwrite.h" - -#include // glyph_metrics_t -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include - -#include - -#if !defined(QT_NO_DIRECTWRITE) -# include -#endif - -QT_BEGIN_NAMESPACE - -//### mingw needed define -#ifndef TT_PRIM_CSPLINE -#define TT_PRIM_CSPLINE 3 -#endif - -// GetFontData expects the tags in little endian ;( -#define MAKE_LITTLE_ENDIAN_TAG(ch1, ch2, ch3, ch4) (\ - (((quint32)(ch4)) << 24) | \ - (((quint32)(ch3)) << 16) | \ - (((quint32)(ch2)) << 8) | \ - ((quint32)(ch1)) \ - ) - -// common DC for all fonts - -typedef BOOL (WINAPI *PtrGetCharWidthI)(HDC, UINT, UINT, LPWORD, LPINT); -static PtrGetCharWidthI ptrGetCharWidthI = 0; -static bool resolvedGetCharWidthI = false; - -static void resolveGetCharWidthI() -{ - if (resolvedGetCharWidthI) - return; - resolvedGetCharWidthI = true; - ptrGetCharWidthI = (PtrGetCharWidthI)QSystemLibrary::resolve(QStringLiteral("gdi32"), "GetCharWidthI"); -} - -static inline quint16 getUShort(unsigned char *p) -{ - quint16 val; - val = *p++ << 8; - val |= *p; - - return val; -} - -// general font engine - -QFixed QWindowsFontEngine::lineThickness() const -{ - if(lineWidth > 0) - return lineWidth; - - return QFontEngine::lineThickness(); -} - -static OUTLINETEXTMETRIC *getOutlineTextMetric(HDC hdc) -{ - int size; - size = GetOutlineTextMetrics(hdc, 0, 0); - OUTLINETEXTMETRIC *otm = (OUTLINETEXTMETRIC *)malloc(size); - GetOutlineTextMetrics(hdc, size, otm); - return otm; -} - -bool QWindowsFontEngine::hasCFFTable() const -{ - HDC hdc = m_fontEngineData->hdc; - SelectObject(hdc, hfont); - return GetFontData(hdc, MAKE_LITTLE_ENDIAN_TAG('C', 'F', 'F', ' '), 0, 0, 0) != GDI_ERROR; -} - -bool QWindowsFontEngine::hasCMapTable() const -{ - HDC hdc = m_fontEngineData->hdc; - SelectObject(hdc, hfont); - return GetFontData(hdc, MAKE_LITTLE_ENDIAN_TAG('c', 'm', 'a', 'p'), 0, 0, 0) != GDI_ERROR; -} - -bool QWindowsFontEngine::hasGlyfTable() const -{ - HDC hdc = m_fontEngineData->hdc; - SelectObject(hdc, hfont); - return GetFontData(hdc, MAKE_LITTLE_ENDIAN_TAG('g', 'l', 'y', 'f'), 0, 0, 0) != GDI_ERROR; -} - -bool QWindowsFontEngine::hasEbdtTable() const -{ - HDC hdc = m_fontEngineData->hdc; - SelectObject(hdc, hfont); - return GetFontData(hdc, MAKE_LITTLE_ENDIAN_TAG('E', 'B', 'D', 'T'), 0, 0, 0) != GDI_ERROR; -} - -static inline QString stringFromOutLineTextMetric(const OUTLINETEXTMETRIC *otm, PSTR offset) -{ - const uchar *p = reinterpret_cast(otm) + quintptr(offset); - return QString::fromWCharArray(reinterpret_cast(p)); -} - -void QWindowsFontEngine::getCMap() -{ - ttf = (bool)(tm.tmPitchAndFamily & TMPF_TRUETYPE) || hasCMapTable(); - - cffTable = hasCFFTable(); - - HDC hdc = m_fontEngineData->hdc; - SelectObject(hdc, hfont); - bool symb = false; - if (ttf) { - cmapTable = getSfntTable(MAKE_TAG('c', 'm', 'a', 'p')); - cmap = QFontEngine::getCMap(reinterpret_cast(cmapTable.constData()), - cmapTable.size(), &symb, &cmapSize); - } - if (!cmap) { - ttf = false; - symb = false; - } - symbol = symb; - designToDevice = 1; - _faceId.index = 0; - if(cmap) { - OUTLINETEXTMETRIC *otm = getOutlineTextMetric(hdc); - unitsPerEm = int(otm->otmEMSquare); - const QFixed unitsPerEmF(unitsPerEm); - designToDevice = unitsPerEmF / QFixed::fromReal(fontDef.pixelSize); - x_height = int(otm->otmsXHeight); - loadKerningPairs(designToDevice); - _faceId.filename = QFile::encodeName(stringFromOutLineTextMetric(otm, otm->otmpFullName)); - lineWidth = otm->otmsUnderscoreSize; - fsType = otm->otmfsType; - free(otm); - - } else { - unitsPerEm = tm.tmHeight; - } -} - -int QWindowsFontEngine::getGlyphIndexes(const QChar *str, int numChars, QGlyphLayout *glyphs) const -{ - int glyph_pos = 0; - { - if (symbol) { - QStringIterator it(str, str + numChars); - while (it.hasNext()) { - const uint uc = it.next(); - glyphs->glyphs[glyph_pos] = getTrueTypeGlyphIndex(cmap, cmapSize, uc); - if(!glyphs->glyphs[glyph_pos] && uc < 0x100) - glyphs->glyphs[glyph_pos] = getTrueTypeGlyphIndex(cmap, cmapSize, uc + 0xf000); - ++glyph_pos; - } - } else if (ttf) { - QStringIterator it(str, str + numChars); - while (it.hasNext()) { - const uint uc = it.next(); - glyphs->glyphs[glyph_pos] = getTrueTypeGlyphIndex(cmap, cmapSize, uc); - ++glyph_pos; - } - } else { - QStringIterator it(str, str + numChars); - while (it.hasNext()) { - const uint uc = it.next(); - if (uc >= tm.tmFirstChar && uc <= tm.tmLastChar) - glyphs->glyphs[glyph_pos] = uc; - else - glyphs->glyphs[glyph_pos] = 0; - ++glyph_pos; - } - } - } - glyphs->numGlyphs = glyph_pos; - return glyph_pos; -} - -/*! - \class QWindowsFontEngine - \brief Standard Windows font engine. - \internal - \ingroup qt-lighthouse-win - - Will probably be superseded by a common Free Type font engine in Qt 5.X. -*/ - -QWindowsFontEngine::QWindowsFontEngine(const QString &name, - LOGFONT lf, - const QSharedPointer &fontEngineData) - : QFontEngine(Win), - m_fontEngineData(fontEngineData), - _name(name), - hfont(0), - m_logfont(lf), - ttf(0), - hasOutline(0), - cmap(0), - cmapSize(0), - lbearing(SHRT_MIN), - rbearing(SHRT_MIN), - x_height(-1), - synthesized_flags(-1), - lineWidth(-1), - widthCache(0), - widthCacheSize(0), - designAdvances(0), - designAdvancesSize(0) -{ - qCDebug(lcQpaFonts) << __FUNCTION__ << name << lf.lfHeight; - hfont = CreateFontIndirect(&m_logfont); - if (!hfont) { - qErrnoWarning("%s: CreateFontIndirect failed for family '%s'", __FUNCTION__, qPrintable(name)); - hfont = QWindowsFontDatabase::systemFont(); - } - - HDC hdc = m_fontEngineData->hdc; - SelectObject(hdc, hfont); - const BOOL res = GetTextMetrics(hdc, &tm); - if (!res) { - qErrnoWarning("%s: GetTextMetrics failed", __FUNCTION__); - ZeroMemory(&tm, sizeof(TEXTMETRIC)); - } - - fontDef.pixelSize = -lf.lfHeight; - fontDef.fixedPitch = !(tm.tmPitchAndFamily & TMPF_FIXED_PITCH); - - cache_cost = tm.tmHeight * tm.tmAveCharWidth * 2000; - getCMap(); - - if (!resolvedGetCharWidthI) - resolveGetCharWidthI(); - - // ### Properties accessed by QWin32PrintEngine (QtPrintSupport) - QVariantMap userData; - userData.insert(QStringLiteral("logFont"), QVariant::fromValue(m_logfont)); - userData.insert(QStringLiteral("hFont"), QVariant::fromValue(hfont)); - userData.insert(QStringLiteral("trueType"), QVariant(bool(ttf))); - setUserData(userData); - - hasUnreliableOutline = hasGlyfTable() && hasEbdtTable(); -} - -QWindowsFontEngine::~QWindowsFontEngine() -{ - if (designAdvances) - free(designAdvances); - - if (widthCache) - free(widthCache); - - // make sure we aren't by accident still selected - SelectObject(m_fontEngineData->hdc, QWindowsFontDatabase::systemFont()); - - if (!DeleteObject(hfont)) - qErrnoWarning("%s: QFontEngineWin: failed to delete font...", __FUNCTION__); - qCDebug(lcQpaFonts) << __FUNCTION__ << _name; - - if (!uniqueFamilyName.isEmpty()) { - QPlatformFontDatabase *pfdb = QWindowsIntegration::instance()->fontDatabase(); - static_cast(pfdb)->derefUniqueFont(uniqueFamilyName); - } -} - -glyph_t QWindowsFontEngine::glyphIndex(uint ucs4) const -{ - glyph_t glyph = 0; - - if (symbol) { - glyph = getTrueTypeGlyphIndex(cmap, cmapSize, ucs4); - if (glyph == 0 && ucs4 < 0x100) - glyph = getTrueTypeGlyphIndex(cmap, cmapSize, ucs4 + 0xf000); - } else if (ttf) { - glyph = getTrueTypeGlyphIndex(cmap, cmapSize, ucs4); - } else if (ucs4 >= tm.tmFirstChar && ucs4 <= tm.tmLastChar) { - glyph = ucs4; - } - - return glyph; -} - -HGDIOBJ QWindowsFontEngine::selectDesignFont() const -{ - LOGFONT f = m_logfont; - f.lfHeight = -unitsPerEm; - f.lfWidth = 0; - HFONT designFont = CreateFontIndirect(&f); - return SelectObject(m_fontEngineData->hdc, designFont); -} - -bool QWindowsFontEngine::stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, int *nglyphs, QFontEngine::ShaperFlags flags) const -{ - Q_ASSERT(glyphs->numGlyphs >= *nglyphs); - if (*nglyphs < len) { - *nglyphs = len; - return false; - } - - glyphs->numGlyphs = *nglyphs; - *nglyphs = getGlyphIndexes(str, len, glyphs); - - if (!(flags & GlyphIndicesOnly)) - recalcAdvances(glyphs, flags); - - return true; -} - -inline void calculateTTFGlyphWidth(HDC hdc, UINT glyph, int &width) -{ - if (ptrGetCharWidthI) - ptrGetCharWidthI(hdc, glyph, 1, 0, &width); -} - -void QWindowsFontEngine::recalcAdvances(QGlyphLayout *glyphs, QFontEngine::ShaperFlags flags) const -{ - HGDIOBJ oldFont = 0; - HDC hdc = m_fontEngineData->hdc; - if (ttf && (flags & DesignMetrics)) { - for(int i = 0; i < glyphs->numGlyphs; i++) { - unsigned int glyph = glyphs->glyphs[i]; - if(int(glyph) >= designAdvancesSize) { - const int newSize = int(glyph + 256) >> 8 << 8; - designAdvances = reinterpret_cast(realloc(designAdvances, size_t(newSize) * sizeof(QFixed))); - Q_CHECK_PTR(designAdvances); - for(int i = designAdvancesSize; i < newSize; ++i) - designAdvances[i] = -1000000; - designAdvancesSize = newSize; - } - if (designAdvances[glyph] < -999999) { - if (!oldFont) - oldFont = selectDesignFont(); - - int width = 0; - calculateTTFGlyphWidth(hdc, glyph, width); - designAdvances[glyph] = QFixed(width) / designToDevice; - } - glyphs->advances[i] = designAdvances[glyph]; - } - if(oldFont) - DeleteObject(SelectObject(hdc, oldFont)); - } else { - for(int i = 0; i < glyphs->numGlyphs; i++) { - unsigned int glyph = glyphs->glyphs[i]; - - if (glyph >= widthCacheSize) { - const uint newSize = (glyph + 256) >> 8 << 8; - widthCache = reinterpret_cast(realloc(widthCache, newSize * sizeof(QFixed))); - Q_CHECK_PTR(widthCache); - memset(widthCache + widthCacheSize, 0, newSize - widthCacheSize); - widthCacheSize = newSize; - } - glyphs->advances[i] = widthCache[glyph]; - // font-width cache failed - if (glyphs->advances[i].value() == 0) { - int width = 0; - if (!oldFont) - oldFont = SelectObject(hdc, hfont); - - if (!ttf) { - QChar ch[2] = { ushort(glyph), 0 }; - int chrLen = 1; - if (QChar::requiresSurrogates(glyph)) { - ch[0] = QChar::highSurrogate(glyph); - ch[1] = QChar::lowSurrogate(glyph); - ++chrLen; - } - SIZE size = {0, 0}; - GetTextExtentPoint32(hdc, reinterpret_cast(ch), chrLen, &size); - width = size.cx; - } else { - calculateTTFGlyphWidth(hdc, glyph, width); - } - glyphs->advances[i] = width; - // if glyph's within cache range, store it for later - if (width > 0 && width < 0x100) - widthCache[glyph] = uchar(width); - } - } - - if (oldFont) - SelectObject(hdc, oldFont); - } -} - -glyph_metrics_t QWindowsFontEngine::boundingBox(const QGlyphLayout &glyphs) -{ - if (glyphs.numGlyphs == 0) - return glyph_metrics_t(); - - QFixed w = 0; - for (int i = 0; i < glyphs.numGlyphs; ++i) - w += glyphs.effectiveAdvance(i); - - return glyph_metrics_t(0, -tm.tmAscent, w - lastRightBearing(glyphs), tm.tmHeight, w, 0); -} - -bool QWindowsFontEngine::getOutlineMetrics(glyph_t glyph, const QTransform &t, glyph_metrics_t *metrics) const -{ - Q_ASSERT(metrics != 0); - - HDC hdc = m_fontEngineData->hdc; - - GLYPHMETRICS gm; - DWORD res = 0; - MAT2 mat; - mat.eM11.value = mat.eM22.value = 1; - mat.eM11.fract = mat.eM22.fract = 0; - mat.eM21.value = mat.eM12.value = 0; - mat.eM21.fract = mat.eM12.fract = 0; - - if (t.type() > QTransform::TxTranslate) { - // We need to set the transform using the HDC's world - // matrix rather than using the MAT2 above, because the - // results provided when transforming via MAT2 does not - // match the glyphs that are drawn using a WorldTransform - XFORM xform; - xform.eM11 = FLOAT(t.m11()); - xform.eM12 = FLOAT(t.m12()); - xform.eM21 = FLOAT(t.m21()); - xform.eM22 = FLOAT(t.m22()); - xform.eDx = 0; - xform.eDy = 0; - SetGraphicsMode(hdc, GM_ADVANCED); - SetWorldTransform(hdc, &xform); - } - - uint format = GGO_METRICS; - if (ttf) - format |= GGO_GLYPH_INDEX; - res = GetGlyphOutline(hdc, glyph, format, &gm, 0, 0, &mat); - - if (t.type() > QTransform::TxTranslate) { - XFORM xform; - xform.eM11 = xform.eM22 = 1; - xform.eM12 = xform.eM21 = xform.eDx = xform.eDy = 0; - SetWorldTransform(hdc, &xform); - SetGraphicsMode(hdc, GM_COMPATIBLE); - } - - if (res != GDI_ERROR) { - *metrics = glyph_metrics_t(gm.gmptGlyphOrigin.x, -gm.gmptGlyphOrigin.y, - int(gm.gmBlackBoxX), int(gm.gmBlackBoxY), - gm.gmCellIncX, gm.gmCellIncY); - return true; - } else { - return false; - } -} - -glyph_metrics_t QWindowsFontEngine::boundingBox(glyph_t glyph, const QTransform &t) -{ - HDC hdc = m_fontEngineData->hdc; - SelectObject(hdc, hfont); - - glyph_metrics_t glyphMetrics; - bool success = getOutlineMetrics(glyph, t, &glyphMetrics); - - if (!ttf && !success) { - // Bitmap fonts - wchar_t ch = wchar_t(glyph); - ABCFLOAT abc; - GetCharABCWidthsFloat(hdc, ch, ch, &abc); - int width = qRound(abc.abcfB); - - return glyph_metrics_t(QFixed::fromReal(abc.abcfA), -tm.tmAscent, width, tm.tmHeight, width, 0).transformed(t); - } - - return glyphMetrics; -} - -QFixed QWindowsFontEngine::ascent() const -{ - return tm.tmAscent; -} - -QFixed QWindowsFontEngine::descent() const -{ - return tm.tmDescent; -} - -QFixed QWindowsFontEngine::leading() const -{ - return tm.tmExternalLeading; -} - -namespace { -# pragma pack(1) - - struct OS2Table - { - quint16 version; - qint16 avgCharWidth; - quint16 weightClass; - quint16 widthClass; - quint16 type; - qint16 subscriptXSize; - qint16 subscriptYSize; - qint16 subscriptXOffset; - qint16 subscriptYOffset; - qint16 superscriptXSize; - qint16 superscriptYSize; - qint16 superscriptXOffset; - qint16 superscriptYOffset; - qint16 strikeOutSize; - qint16 strikeOutPosition; - qint16 familyClass; - quint8 panose[10]; - quint32 unicodeRanges[4]; - quint8 vendorID[4]; - quint16 selection; - quint16 firstCharIndex; - quint16 lastCharIndex; - qint16 typoAscender; - qint16 typoDescender; - qint16 typoLineGap; - quint16 winAscent; - quint16 winDescent; - quint32 codepageRanges[2]; - qint16 height; - qint16 capHeight; - quint16 defaultChar; - quint16 breakChar; - quint16 maxContext; - }; - -# pragma pack() -} - -QFixed QWindowsFontEngine::capHeight() const -{ - const QByteArray tableData = getSfntTable(MAKE_TAG('O', 'S', '/', '2')); - if (size_t(tableData.size()) >= sizeof(OS2Table)) { - const OS2Table *table = reinterpret_cast(tableData.constData()); - if (qFromBigEndian(table->version) >= 2) { - qint16 capHeight = qFromBigEndian(table->capHeight); - if (capHeight > 0) - return QFixed(capHeight) / designToDevice; - } - } - return calculatedCapHeight(); -} - -QFixed QWindowsFontEngine::xHeight() const -{ - if(x_height >= 0) - return x_height; - return QFontEngine::xHeight(); -} - -QFixed QWindowsFontEngine::averageCharWidth() const -{ - return tm.tmAveCharWidth; -} - -qreal QWindowsFontEngine::maxCharWidth() const -{ - return tm.tmMaxCharWidth; -} - -enum { max_font_count = 256 }; -static const ushort char_table[] = { - 40, - 67, - 70, - 75, - 86, - 88, - 89, - 91, - 102, - 114, - 124, - 127, - 205, - 645, - 884, - 922, - 1070, - 12386, - 0 -}; - -static const int char_table_entries = sizeof(char_table)/sizeof(ushort); - -#ifndef Q_CC_MINGW -void QWindowsFontEngine::getGlyphBearings(glyph_t glyph, qreal *leftBearing, qreal *rightBearing) -{ - HDC hdc = m_fontEngineData->hdc; - SelectObject(hdc, hfont); - - if (ttf) { - ABC abcWidths; - GetCharABCWidthsI(hdc, glyph, 1, 0, &abcWidths); - if (leftBearing) - *leftBearing = abcWidths.abcA; - if (rightBearing) - *rightBearing = abcWidths.abcC; - } else { - QFontEngine::getGlyphBearings(glyph, leftBearing, rightBearing); - } -} -#endif // Q_CC_MINGW - -bool QWindowsFontEngine::hasUnreliableGlyphOutline() const -{ - return hasUnreliableOutline || QFontEngine::hasUnreliableGlyphOutline(); -} - -qreal QWindowsFontEngine::minLeftBearing() const -{ - if (lbearing == SHRT_MIN) - minRightBearing(); // calculates both - - return lbearing; -} - -qreal QWindowsFontEngine::minRightBearing() const -{ - if (rbearing == SHRT_MIN) { - int ml = 0; - int mr = 0; - HDC hdc = m_fontEngineData->hdc; - SelectObject(hdc, hfont); - if (ttf) { - ABC *abc = 0; - int n = tm.tmLastChar - tm.tmFirstChar; - if (n <= max_font_count) { - abc = new ABC[n+1]; - GetCharABCWidths(hdc, tm.tmFirstChar, tm.tmLastChar, abc); - } else { - abc = new ABC[char_table_entries+1]; - for(int i = 0; i < char_table_entries; i++) - GetCharABCWidths(hdc, char_table[i], char_table[i], abc + i); - n = char_table_entries; - } - ml = abc[0].abcA; - mr = abc[0].abcC; - for (int i = 1; i < n; i++) { - if (abc[i].abcA + abc[i].abcB + abc[i].abcC != 0) { - ml = qMin(ml,abc[i].abcA); - mr = qMin(mr,abc[i].abcC); - } - } - delete [] abc; - } else { - ABCFLOAT *abc = 0; - int n = tm.tmLastChar - tm.tmFirstChar+1; - if (n <= max_font_count) { - abc = new ABCFLOAT[n]; - GetCharABCWidthsFloat(hdc, tm.tmFirstChar, tm.tmLastChar, abc); - } else { - abc = new ABCFLOAT[char_table_entries]; - for(int i = 0; i < char_table_entries; i++) - GetCharABCWidthsFloat(hdc, char_table[i], char_table[i], abc+i); - n = char_table_entries; - } - float fml = abc[0].abcfA; - float fmr = abc[0].abcfC; - for (int i=1; i(dataBuffer + headerOffset); - - QPointF lastPoint(qt_to_qpointf(ttph->pfxStart, scale)); - path->moveTo(lastPoint + oset); - offset += sizeof(TTPOLYGONHEADER); - while (offset < headerOffset + ttph->cb) { - const TTPOLYCURVE *curve = reinterpret_cast(dataBuffer + offset); - switch (curve->wType) { - case TT_PRIM_LINE: { - for (int i=0; icpfx; ++i) { - QPointF p = qt_to_qpointf(curve->apfx[i], scale) + oset; - path->lineTo(p); - } - break; - } - case TT_PRIM_QSPLINE: { - const QPainterPath::Element &elm = path->elementAt(path->elementCount()-1); - QPointF prev(elm.x, elm.y); - QPointF endPoint; - for (int i=0; icpfx - 1; ++i) { - QPointF p1 = qt_to_qpointf(curve->apfx[i], scale) + oset; - QPointF p2 = qt_to_qpointf(curve->apfx[i+1], scale) + oset; - if (i < curve->cpfx - 2) { - endPoint = QPointF((p1.x() + p2.x()) / 2, (p1.y() + p2.y()) / 2); - } else { - endPoint = p2; - } - - path->quadTo(p1, endPoint); - prev = endPoint; - } - - break; - } - case TT_PRIM_CSPLINE: { - for (int i=0; icpfx; ) { - QPointF p2 = qt_to_qpointf(curve->apfx[i++], scale) + oset; - QPointF p3 = qt_to_qpointf(curve->apfx[i++], scale) + oset; - QPointF p4 = qt_to_qpointf(curve->apfx[i++], scale) + oset; - path->cubicTo(p2, p3, p4); - } - break; - } - default: - qWarning("QFontEngineWin::addOutlineToPath, unhandled switch case"); - } - offset += sizeof(TTPOLYCURVE) + (curve->cpfx-1) * sizeof(POINTFX); - } - path->closeSubpath(); - headerOffset += ttph->cb; - } - delete [] dataBuffer; - - return true; -} - -void QWindowsFontEngine::addGlyphsToPath(glyph_t *glyphs, QFixedPoint *positions, int nglyphs, - QPainterPath *path, QTextItem::RenderFlags) -{ - LOGFONT lf = m_logfont; - // The sign must be negative here to make sure we match against character height instead of - // hinted cell height. This ensures that we get linear matching, and we need this for - // paths since we later on apply a scaling transform to the glyph outline to get the - // font at the correct pixel size. - lf.lfHeight = -unitsPerEm; - lf.lfWidth = 0; - HFONT hf = CreateFontIndirect(&lf); - HDC hdc = m_fontEngineData->hdc; - HGDIOBJ oldfont = SelectObject(hdc, hf); - - for(int i = 0; i < nglyphs; ++i) { - if (!addGlyphToPath(glyphs[i], positions[i], hdc, path, ttf, /*metric*/0, - qreal(fontDef.pixelSize) / unitsPerEm)) { - // Some windows fonts, like "Modern", are vector stroke - // fonts, which are reported as TMPF_VECTOR but do not - // support GetGlyphOutline, and thus we set this bit so - // that addOutLineToPath can check it and return safely... - hasOutline = false; - break; - } - } - DeleteObject(SelectObject(hdc, oldfont)); -} - -void QWindowsFontEngine::addOutlineToPath(qreal x, qreal y, const QGlyphLayout &glyphs, - QPainterPath *path, QTextItem::RenderFlags flags) -{ - if(tm.tmPitchAndFamily & (TMPF_TRUETYPE | TMPF_VECTOR)) { - hasOutline = true; - QFontEngine::addOutlineToPath(x, y, glyphs, path, flags); - if (hasOutline) { - // has_outline is set to false if addGlyphToPath gets - // false from GetGlyphOutline, meaning its not an outline - // font. - return; - } - } - QFontEngine::addBitmapFontToPath(x, y, glyphs, path, flags); -} - -QFontEngine::FaceId QWindowsFontEngine::faceId() const -{ - return _faceId; -} - -QT_BEGIN_INCLUDE_NAMESPACE -#include -QT_END_INCLUDE_NAMESPACE - -int QWindowsFontEngine::synthesized() const -{ - if(synthesized_flags == -1) { - synthesized_flags = 0; - if(ttf) { - const DWORD HEAD = MAKE_LITTLE_ENDIAN_TAG('h', 'e', 'a', 'd'); - HDC hdc = m_fontEngineData->hdc; - SelectObject(hdc, hfont); - uchar data[4]; - GetFontData(hdc, HEAD, 44, &data, 4); - USHORT macStyle = getUShort(data); - if (tm.tmItalic && !(macStyle & 2)) - synthesized_flags = SynthesizedItalic; - if (fontDef.stretch != 100 && ttf) - synthesized_flags |= SynthesizedStretch; - if (tm.tmWeight >= 500 && !(macStyle & 1)) - synthesized_flags |= SynthesizedBold; - //qDebug() << "font is" << _name << - // "it=" << (macStyle & 2) << fontDef.style << "flags=" << synthesized_flags; - } - } - return synthesized_flags; -} - -QFixed QWindowsFontEngine::emSquareSize() const -{ - return unitsPerEm; -} - -QFontEngine::Properties QWindowsFontEngine::properties() const -{ - LOGFONT lf = m_logfont; - lf.lfHeight = unitsPerEm; - HFONT hf = CreateFontIndirect(&lf); - HDC hdc = m_fontEngineData->hdc; - HGDIOBJ oldfont = SelectObject(hdc, hf); - OUTLINETEXTMETRIC *otm = getOutlineTextMetric(hdc); - Properties p; - p.emSquare = unitsPerEm; - p.italicAngle = otm->otmItalicAngle; - const QByteArray name = stringFromOutLineTextMetric(otm, otm->otmpFamilyName).toLatin1() - + stringFromOutLineTextMetric(otm, otm->otmpStyleName).toLatin1(); - p.postscriptName = QFontEngine::convertToPostscriptFontFamilyName(name); - p.boundingBox = QRectF(otm->otmrcFontBox.left, -otm->otmrcFontBox.top, - otm->otmrcFontBox.right - otm->otmrcFontBox.left, - otm->otmrcFontBox.top - otm->otmrcFontBox.bottom); - p.ascent = otm->otmAscent; - p.descent = -otm->otmDescent; - p.leading = int(otm->otmLineGap); - p.capHeight = 0; - p.lineWidth = otm->otmsUnderscoreSize; - free(otm); - DeleteObject(SelectObject(hdc, oldfont)); - return p; -} - -void QWindowsFontEngine::getUnscaledGlyph(glyph_t glyph, QPainterPath *path, glyph_metrics_t *metrics) -{ - LOGFONT lf = m_logfont; - lf.lfHeight = -unitsPerEm; - int flags = synthesized(); - if(flags & SynthesizedItalic) - lf.lfItalic = false; - lf.lfWidth = 0; - HFONT hf = CreateFontIndirect(&lf); - HDC hdc = m_fontEngineData->hdc; - HGDIOBJ oldfont = SelectObject(hdc, hf); - QFixedPoint p; - p.x = 0; - p.y = 0; - addGlyphToPath(glyph, p, hdc, path, ttf, metrics); - DeleteObject(SelectObject(hdc, oldfont)); -} - -bool QWindowsFontEngine::getSfntTableData(uint tag, uchar *buffer, uint *length) const -{ - if (!ttf && !cffTable) - return false; - HDC hdc = m_fontEngineData->hdc; - SelectObject(hdc, hfont); - DWORD t = qbswap(tag); - *length = GetFontData(hdc, t, 0, buffer, *length); - Q_ASSERT(*length == GDI_ERROR || int(*length) > 0); - return *length != GDI_ERROR; -} - -#if !defined(CLEARTYPE_QUALITY) -# define CLEARTYPE_QUALITY 5 -#endif - -QWindowsNativeImage *QWindowsFontEngine::drawGDIGlyph(HFONT font, glyph_t glyph, int margin, - const QTransform &t, - QImage::Format mask_format) -{ - Q_UNUSED(mask_format) - glyph_metrics_t gm = boundingBox(glyph); - -// printf(" -> for glyph %4x\n", glyph); - - int gx = gm.x.toInt(); - int gy = gm.y.toInt(); - int iw = gm.width.toInt(); - int ih = gm.height.toInt(); - - if (iw <= 0 || ih <= 0) - return 0; - - bool has_transformation = t.type() > QTransform::TxTranslate; - - unsigned int options = ttf ? ETO_GLYPH_INDEX : 0; - XFORM xform; - - if (has_transformation) { - xform.eM11 = FLOAT(t.m11()); - xform.eM12 = FLOAT(t.m12()); - xform.eM21 = FLOAT(t.m21()); - xform.eM22 = FLOAT(t.m22()); - xform.eDx = margin; - xform.eDy = margin; - - const HDC hdc = m_fontEngineData->hdc; - - SetGraphicsMode(hdc, GM_ADVANCED); - SetWorldTransform(hdc, &xform); - HGDIOBJ old_font = SelectObject(hdc, font); - - const UINT ggo_options = GGO_METRICS | (ttf ? GGO_GLYPH_INDEX : 0); - GLYPHMETRICS tgm; - MAT2 mat; - memset(&mat, 0, sizeof(mat)); - mat.eM11.value = mat.eM22.value = 1; - - const DWORD result = GetGlyphOutline(hdc, glyph, ggo_options, &tgm, 0, 0, &mat); - - XFORM identity = {1, 0, 0, 1, 0, 0}; - SetWorldTransform(hdc, &identity); - SetGraphicsMode(hdc, GM_COMPATIBLE); - SelectObject(hdc, old_font); - - if (result == GDI_ERROR) { - const int errorCode = int(GetLastError()); - qErrnoWarning(errorCode, "QWinFontEngine: unable to query transformed glyph metrics (GetGlyphOutline() failed, error %d)...", errorCode); - return 0; - } - - iw = int(tgm.gmBlackBoxX); - ih = int(tgm.gmBlackBoxY); - - xform.eDx -= tgm.gmptGlyphOrigin.x; - xform.eDy += tgm.gmptGlyphOrigin.y; - } - - // The padding here needs to be kept in sync with the values in alphaMapBoundingBox. - QWindowsNativeImage *ni = new QWindowsNativeImage(iw + 2 * margin, - ih + 2 * margin, - QWindowsNativeImage::systemFormat()); - - /*If cleartype is enabled we use the standard system format even on Windows CE - and not the special textbuffer format we have to use if cleartype is disabled*/ - - ni->image().fill(0xffffffff); - - HDC hdc = ni->hdc(); - - SelectObject(hdc, GetStockObject(NULL_BRUSH)); - SelectObject(hdc, GetStockObject(BLACK_PEN)); - SetTextColor(hdc, RGB(0,0,0)); - SetBkMode(hdc, TRANSPARENT); - SetTextAlign(hdc, TA_BASELINE); - - HGDIOBJ old_font = SelectObject(hdc, font); - - if (has_transformation) { - SetGraphicsMode(hdc, GM_ADVANCED); - SetWorldTransform(hdc, &xform); - ExtTextOut(hdc, 0, 0, options, 0, reinterpret_cast(&glyph), 1, 0); - } else { - ExtTextOut(hdc, -gx + margin, -gy + margin, options, 0, reinterpret_cast(&glyph), 1, 0); - } - - SelectObject(hdc, old_font); - return ni; -} - -glyph_metrics_t QWindowsFontEngine::alphaMapBoundingBox(glyph_t glyph, QFixed, const QTransform &matrix, GlyphFormat format) -{ - int margin = 0; - if (format == QFontEngine::Format_A32 || format == QFontEngine::Format_ARGB) - margin = glyphMargin(QFontEngine::Format_A32); - glyph_metrics_t gm = boundingBox(glyph, matrix); - gm.width += margin * 2; - gm.height += margin * 2; - return gm; -} - -QImage QWindowsFontEngine::alphaMapForGlyph(glyph_t glyph, const QTransform &xform) -{ - HFONT font = hfont; - - bool clearTypeTemporarilyDisabled = (m_fontEngineData->clearTypeEnabled && m_logfont.lfQuality != NONANTIALIASED_QUALITY); - if (clearTypeTemporarilyDisabled) { - LOGFONT lf = m_logfont; - lf.lfQuality = ANTIALIASED_QUALITY; - font = CreateFontIndirect(&lf); - } - QImage::Format mask_format = QWindowsNativeImage::systemFormat(); - mask_format = QImage::Format_RGB32; - - const QWindowsNativeImage *mask = drawGDIGlyph(font, glyph, 0, xform, mask_format); - if (mask == 0) { - if (m_fontEngineData->clearTypeEnabled) - DeleteObject(font); - return QImage(); - } - - QImage alphaMap(mask->width(), mask->height(), QImage::Format_Alpha8); - - - // Copy data... Cannot use QPainter here as GDI has messed up the - // Alpha channel of the ni.image pixels... - for (int y=0; yheight(); ++y) { - uchar *dest = alphaMap.scanLine(y); - if (mask->image().format() == QImage::Format_RGB16) { - const qint16 *src = reinterpret_cast(mask->image().constScanLine(y)); - for (int x=0; xwidth(); ++x) - dest[x] = 255 - qGray(src[x]); - } else { - const uint *src = reinterpret_cast(mask->image().constScanLine(y)); - for (int x=0; xwidth(); ++x) { - if (QWindowsNativeImage::systemFormat() == QImage::Format_RGB16) - dest[x] = 255 - qGray(src[x]); - else - dest[x] = 255 - (m_fontEngineData->pow_gamma[qGray(src[x])] * 255. / 2047.); - } - } - } - - // Cleanup... - delete mask; - if (clearTypeTemporarilyDisabled) { - DeleteObject(font); - } - - return alphaMap; -} - -#define SPI_GETFONTSMOOTHINGCONTRAST 0x200C -#define SPI_SETFONTSMOOTHINGCONTRAST 0x200D - -QImage QWindowsFontEngine::alphaRGBMapForGlyph(glyph_t glyph, QFixed, const QTransform &t) -{ - HFONT font = hfont; - - UINT contrast; - SystemParametersInfo(SPI_GETFONTSMOOTHINGCONTRAST, 0, &contrast, 0); - SystemParametersInfo(SPI_SETFONTSMOOTHINGCONTRAST, 0, reinterpret_cast(quintptr(1000)), 0); - - int margin = glyphMargin(QFontEngine::Format_A32); - QWindowsNativeImage *mask = drawGDIGlyph(font, glyph, margin, t, QImage::Format_RGB32); - SystemParametersInfo(SPI_SETFONTSMOOTHINGCONTRAST, 0, reinterpret_cast(quintptr(contrast)), 0); - - if (mask == 0) - return QImage(); - - // Gracefully handle the odd case when the display is 16-bit - const QImage source = mask->image().depth() == 32 - ? mask->image() - : mask->image().convertToFormat(QImage::Format_RGB32); - - QImage rgbMask(mask->width(), mask->height(), QImage::Format_RGB32); - for (int y=0; yheight(); ++y) { - uint *dest = (uint *) rgbMask.scanLine(y); - const uint *src = reinterpret_cast(source.constScanLine(y)); - for (int x=0; xwidth(); ++x) { - dest[x] = 0xffffffff - (0x00ffffff & src[x]); - } - } - - delete mask; - - return rgbMask; -} - -QFontEngine *QWindowsFontEngine::cloneWithSize(qreal pixelSize) const -{ - QFontDef request = fontDef; - QString actualFontName = request.family; - if (!uniqueFamilyName.isEmpty()) - request.family = uniqueFamilyName; - request.pixelSize = pixelSize; - - QFontEngine *fontEngine = - QWindowsFontDatabase::createEngine(request, - QWindowsContext::instance()->defaultDPI(), - m_fontEngineData); - if (fontEngine) { - fontEngine->fontDef.family = actualFontName; - if (!uniqueFamilyName.isEmpty()) { - static_cast(fontEngine)->setUniqueFamilyName(uniqueFamilyName); - QPlatformFontDatabase *pfdb = QWindowsIntegration::instance()->fontDatabase(); - static_cast(pfdb)->refUniqueFont(uniqueFamilyName); - } - } - return fontEngine; -} - -Qt::HANDLE QWindowsFontEngine::handle() const -{ - return hfont; -} - -void QWindowsFontEngine::initFontInfo(const QFontDef &request, - int dpi) -{ - fontDef = request; // most settings are equal - HDC dc = m_fontEngineData->hdc; - SelectObject(dc, hfont); - wchar_t n[64]; - GetTextFace(dc, 64, n); - fontDef.family = QString::fromWCharArray(n); - fontDef.fixedPitch = !(tm.tmPitchAndFamily & TMPF_FIXED_PITCH); - if (fontDef.pointSize < 0) { - fontDef.pointSize = fontDef.pixelSize * 72. / dpi; - } else if (fontDef.pixelSize == -1) { - fontDef.pixelSize = qRound(fontDef.pointSize * dpi / 72.); - } -} - -/*! - \class QWindowsMultiFontEngine - \brief Standard Windows Multi font engine. - \internal - \ingroup qt-lighthouse-win - - "Merges" several font engines that have gaps in the - supported writing systems. - - Will probably be superseded by a common Free Type font engine in Qt 5.X. -*/ -QWindowsMultiFontEngine::QWindowsMultiFontEngine(QFontEngine *fe, int script) - : QFontEngineMulti(fe, script) -{ -} - -QFontEngine *QWindowsMultiFontEngine::loadEngine(int at) -{ - QFontEngine *fontEngine = engine(0); - QSharedPointer data; - LOGFONT lf; - -#ifndef QT_NO_DIRECTWRITE - if (fontEngine->type() == QFontEngine::DirectWrite) { - QWindowsFontEngineDirectWrite *fe = static_cast(fontEngine); - lf = QWindowsFontDatabase::fontDefToLOGFONT(fe->fontDef); - - data = fe->fontEngineData(); - } else -#endif - { - QWindowsFontEngine *fe = static_cast(fontEngine); - lf = fe->m_logfont; - - data = fe->fontEngineData(); - } - - const QString fam = fallbackFamilyAt(at - 1); - const int faceNameLength = qMin(fam.length(), LF_FACESIZE - 1); - memcpy(lf.lfFaceName, fam.utf16(), faceNameLength * sizeof(wchar_t)); - lf.lfFaceName[faceNameLength] = 0; - -#ifndef QT_NO_DIRECTWRITE - if (fontEngine->type() == QFontEngine::DirectWrite) { - const QString nameSubstitute = QWindowsFontEngineDirectWrite::fontNameSubstitute(fam); - if (nameSubstitute != fam) { - const int nameSubstituteLength = qMin(nameSubstitute.length(), LF_FACESIZE - 1); - memcpy(lf.lfFaceName, nameSubstitute.utf16(), nameSubstituteLength * sizeof(wchar_t)); - lf.lfFaceName[nameSubstituteLength] = 0; - } - - IDWriteFont *directWriteFont = 0; - HRESULT hr = data->directWriteGdiInterop->CreateFontFromLOGFONT(&lf, &directWriteFont); - if (FAILED(hr)) { - qErrnoWarning("%s: CreateFontFromLOGFONT failed", __FUNCTION__); - } else { - Q_ASSERT(directWriteFont); - IDWriteFontFace *directWriteFontFace = NULL; - HRESULT hr = directWriteFont->CreateFontFace(&directWriteFontFace); - if (SUCCEEDED(hr)) { - Q_ASSERT(directWriteFontFace); - QWindowsFontEngineDirectWrite *fedw = new QWindowsFontEngineDirectWrite(directWriteFontFace, - fontEngine->fontDef.pixelSize, - data); - fedw->fontDef.weight = fontEngine->fontDef.weight; - if (fontEngine->fontDef.style > QFont::StyleNormal) - fedw->fontDef.style = fontEngine->fontDef.style; - fedw->fontDef.family = fam; - fedw->fontDef.hintingPreference = fontEngine->fontDef.hintingPreference; - return fedw; - } else { - qErrnoWarning("%s: CreateFontFace failed", __FUNCTION__); - } - } - } -#endif - - // Get here if original font is not DirectWrite or DirectWrite creation failed for some - // reason - - QFontEngine *fe = new QWindowsFontEngine(fam, lf, data); - fe->fontDef.weight = fontEngine->fontDef.weight; - if (fontEngine->fontDef.style > QFont::StyleNormal) - fe->fontDef.style = fontEngine->fontDef.style; - fe->fontDef.family = fam; - fe->fontDef.hintingPreference = fontEngine->fontDef.hintingPreference; - return fe; -} - -bool QWindowsFontEngine::supportsTransformation(const QTransform &transform) const -{ - // Support all transformations for ttf files, and translations for raster fonts - return ttf || transform.type() <= QTransform::TxTranslate; -} - -QT_END_NAMESPACE - diff --git a/src/plugins/platforms/windows/qwindowsfontengine.h b/src/plugins/platforms/windows/qwindowsfontengine.h deleted file mode 100644 index b63d8fd282..0000000000 --- a/src/plugins/platforms/windows/qwindowsfontengine.h +++ /dev/null @@ -1,187 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QWINDOWSFONTENGINE_H -#define QWINDOWSFONTENGINE_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include - -#include -#include -#include - -#include - -QT_BEGIN_NAMESPACE - -class QWindowsNativeImage; -class QWindowsFontEngineData; - -class QWindowsFontEngine : public QFontEngine -{ - friend class QWindowsMultiFontEngine; - -public: - QWindowsFontEngine(const QString &name, LOGFONT lf, - const QSharedPointer &fontEngineData); - - ~QWindowsFontEngine(); - void initFontInfo(const QFontDef &request, - int dpi); - - QFixed lineThickness() const Q_DECL_OVERRIDE; - Properties properties() const Q_DECL_OVERRIDE; - void getUnscaledGlyph(glyph_t glyph, QPainterPath *path, glyph_metrics_t *metrics) Q_DECL_OVERRIDE; - FaceId faceId() const Q_DECL_OVERRIDE; - bool getSfntTableData(uint tag, uchar *buffer, uint *length) const Q_DECL_OVERRIDE; - int synthesized() const Q_DECL_OVERRIDE; - QFixed emSquareSize() const Q_DECL_OVERRIDE; - - glyph_t glyphIndex(uint ucs4) const Q_DECL_OVERRIDE; - bool stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, int *nglyphs, ShaperFlags flags) const Q_DECL_OVERRIDE; - void recalcAdvances(QGlyphLayout *glyphs, ShaperFlags) const Q_DECL_OVERRIDE; - - void addOutlineToPath(qreal x, qreal y, const QGlyphLayout &glyphs, QPainterPath *path, QTextItem::RenderFlags flags) Q_DECL_OVERRIDE; - virtual void addGlyphsToPath(glyph_t *glyphs, QFixedPoint *positions, int nglyphs, - QPainterPath *path, QTextItem::RenderFlags flags) Q_DECL_OVERRIDE; - - HGDIOBJ selectDesignFont() const; - - glyph_metrics_t boundingBox(const QGlyphLayout &glyphs) Q_DECL_OVERRIDE; - glyph_metrics_t boundingBox(glyph_t g) Q_DECL_OVERRIDE { return boundingBox(g, QTransform()); } - glyph_metrics_t boundingBox(glyph_t g, const QTransform &t) Q_DECL_OVERRIDE; - - - QFixed ascent() const Q_DECL_OVERRIDE; - QFixed descent() const Q_DECL_OVERRIDE; - QFixed leading() const Q_DECL_OVERRIDE; - QFixed xHeight() const Q_DECL_OVERRIDE; - QFixed capHeight() const Q_DECL_OVERRIDE; - QFixed averageCharWidth() const Q_DECL_OVERRIDE; - qreal maxCharWidth() const Q_DECL_OVERRIDE; - qreal minLeftBearing() const Q_DECL_OVERRIDE; - qreal minRightBearing() const Q_DECL_OVERRIDE; - - QImage alphaMapForGlyph(glyph_t t) Q_DECL_OVERRIDE { return alphaMapForGlyph(t, QTransform()); } - QImage alphaMapForGlyph(glyph_t, const QTransform &xform) Q_DECL_OVERRIDE; - QImage alphaRGBMapForGlyph(glyph_t t, QFixed subPixelPosition, const QTransform &xform) Q_DECL_OVERRIDE; - glyph_metrics_t alphaMapBoundingBox(glyph_t glyph, QFixed, const QTransform &matrix, GlyphFormat) Q_DECL_OVERRIDE; - - QFontEngine *cloneWithSize(qreal pixelSize) const Q_DECL_OVERRIDE; - Qt::HANDLE handle() const Q_DECL_OVERRIDE; - bool supportsTransformation(const QTransform &transform) const Q_DECL_OVERRIDE; - -#ifndef Q_CC_MINGW - void getGlyphBearings(glyph_t glyph, qreal *leftBearing = 0, qreal *rightBearing = 0) Q_DECL_OVERRIDE; -#endif - - bool hasUnreliableGlyphOutline() const Q_DECL_OVERRIDE; - - int getGlyphIndexes(const QChar *ch, int numChars, QGlyphLayout *glyphs) const; - void getCMap(); - - bool getOutlineMetrics(glyph_t glyph, const QTransform &t, glyph_metrics_t *metrics) const; - - const QSharedPointer &fontEngineData() const { return m_fontEngineData; } - - void setUniqueFamilyName(const QString &newName) { uniqueFamilyName = newName; } - -private: - QWindowsNativeImage *drawGDIGlyph(HFONT font, glyph_t, int margin, const QTransform &xform, - QImage::Format mask_format); - bool hasCFFTable() const; - bool hasCMapTable() const; - bool hasGlyfTable() const; - bool hasEbdtTable() const; - - const QSharedPointer m_fontEngineData; - - const QString _name; - QString uniqueFamilyName; - HFONT hfont; - const LOGFONT m_logfont; - uint ttf : 1; - uint hasOutline : 1; - uint hasUnreliableOutline : 1; - uint cffTable : 1; - TEXTMETRIC tm; - const unsigned char *cmap; - int cmapSize; - QByteArray cmapTable; - mutable qreal lbearing; - mutable qreal rbearing; - QFixed designToDevice; - int unitsPerEm; - QFixed x_height; - FaceId _faceId; - - mutable int synthesized_flags; - mutable QFixed lineWidth; - mutable unsigned char *widthCache; - mutable uint widthCacheSize; - mutable QFixed *designAdvances; - mutable int designAdvancesSize; -}; - -class QWindowsMultiFontEngine : public QFontEngineMulti -{ -public: - explicit QWindowsMultiFontEngine(QFontEngine *fe, int script); - - QFontEngine *loadEngine(int at) Q_DECL_OVERRIDE; -}; - -QT_END_NAMESPACE - -Q_DECLARE_METATYPE(HFONT) -Q_DECLARE_METATYPE(LOGFONT) - -#endif // QWINDOWSFONTENGINE_H - diff --git a/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.cpp b/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.cpp deleted file mode 100644 index 334e9cb8b9..0000000000 --- a/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.cpp +++ /dev/null @@ -1,1000 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QT_NO_DIRECTWRITE - -#include "qwindowsfontenginedirectwrite.h" -#include "qwindowsfontdatabase.h" -#include "qwindowscontext.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined(QT_USE_DIRECTWRITE2) -# include -#else -# include -#endif - -#include - -QT_BEGIN_NAMESPACE - -// Convert from design units to logical pixels -#define DESIGN_TO_LOGICAL(DESIGN_UNIT_VALUE) \ - QFixed::fromReal((qreal(DESIGN_UNIT_VALUE) / qreal(m_unitsPerEm)) * fontDef.pixelSize) - -namespace { - - class GeometrySink: public IDWriteGeometrySink - { - public: - GeometrySink(QPainterPath *path) - : m_refCount(0), m_path(path) - { - Q_ASSERT(m_path != 0); - } - virtual ~GeometrySink() - { - } - - IFACEMETHOD_(void, AddBeziers)(const D2D1_BEZIER_SEGMENT *beziers, UINT bezierCount); - IFACEMETHOD_(void, AddLines)(const D2D1_POINT_2F *points, UINT pointCount); - IFACEMETHOD_(void, BeginFigure)(D2D1_POINT_2F startPoint, D2D1_FIGURE_BEGIN figureBegin); - IFACEMETHOD(Close)(); - IFACEMETHOD_(void, EndFigure)(D2D1_FIGURE_END figureEnd); - IFACEMETHOD_(void, SetFillMode)(D2D1_FILL_MODE fillMode); - IFACEMETHOD_(void, SetSegmentFlags)(D2D1_PATH_SEGMENT vertexFlags); - - IFACEMETHOD_(unsigned long, AddRef)(); - IFACEMETHOD_(unsigned long, Release)(); - IFACEMETHOD(QueryInterface)(IID const &riid, void **ppvObject); - - private: - inline static QPointF fromD2D1_POINT_2F(const D2D1_POINT_2F &inp) - { - return QPointF(inp.x, inp.y); - } - - unsigned long m_refCount; - QPointF m_startPoint; - QPainterPath *m_path; - }; - - void GeometrySink::AddBeziers(const D2D1_BEZIER_SEGMENT *beziers, - UINT bezierCount) - { - for (uint i=0; icubicTo(c1, c2, p2); - } - } - - void GeometrySink::AddLines(const D2D1_POINT_2F *points, UINT pointsCount) - { - for (uint i=0; ilineTo(fromD2D1_POINT_2F(points[i])); - } - - void GeometrySink::BeginFigure(D2D1_POINT_2F startPoint, - D2D1_FIGURE_BEGIN /*figureBegin*/) - { - m_startPoint = fromD2D1_POINT_2F(startPoint); - m_path->moveTo(m_startPoint); - } - - IFACEMETHODIMP GeometrySink::Close() - { - return E_NOTIMPL; - } - - void GeometrySink::EndFigure(D2D1_FIGURE_END figureEnd) - { - if (figureEnd == D2D1_FIGURE_END_CLOSED) - m_path->closeSubpath(); - } - - void GeometrySink::SetFillMode(D2D1_FILL_MODE fillMode) - { - m_path->setFillRule(fillMode == D2D1_FILL_MODE_ALTERNATE - ? Qt::OddEvenFill - : Qt::WindingFill); - } - - void GeometrySink::SetSegmentFlags(D2D1_PATH_SEGMENT /*vertexFlags*/) - { - /* Not implemented */ - } - - IFACEMETHODIMP_(unsigned long) GeometrySink::AddRef() - { - return InterlockedIncrement(&m_refCount); - } - - IFACEMETHODIMP_(unsigned long) GeometrySink::Release() - { - unsigned long newCount = InterlockedDecrement(&m_refCount); - if (newCount == 0) - { - delete this; - return 0; - } - - return newCount; - } - - IFACEMETHODIMP GeometrySink::QueryInterface(IID const &riid, void **ppvObject) - { - if (__uuidof(IDWriteGeometrySink) == riid) { - *ppvObject = this; - } else if (__uuidof(IUnknown) == riid) { - *ppvObject = this; - } else { - *ppvObject = NULL; - return E_FAIL; - } - - AddRef(); - return S_OK; - } - -} - -static DWRITE_RENDERING_MODE hintingPreferenceToRenderingMode(QFont::HintingPreference hintingPreference) -{ - switch (hintingPreference) { - case QFont::PreferNoHinting: - return DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC; - case QFont::PreferVerticalHinting: - return DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL; - default: - return DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC; - } -} - -/*! - \class QWindowsFontEngineDirectWrite - \brief Windows font engine using Direct Write. - \internal - \ingroup qt-lighthouse-win - - Font engine for subpixel positioned text on Windows Vista - (with platform update) and Windows 7. If selected during - configuration, the engine will be selected only when the hinting - preference of a font is set to None or Vertical hinting. The font - database uses most of the same logic but creates a direct write - font based on the LOGFONT rather than a GDI handle. - - Will probably be superseded by a common Free Type font engine in Qt 5.X. -*/ - -QWindowsFontEngineDirectWrite::QWindowsFontEngineDirectWrite(IDWriteFontFace *directWriteFontFace, - qreal pixelSize, - const QSharedPointer &d) - : QFontEngine(DirectWrite) - , m_fontEngineData(d) - , m_directWriteFontFace(directWriteFontFace) - , m_directWriteBitmapRenderTarget(0) - , m_lineThickness(-1) - , m_unitsPerEm(-1) - , m_ascent(-1) - , m_capHeight(-1) - , m_descent(-1) - , m_xHeight(-1) - , m_lineGap(-1) -{ - qCDebug(lcQpaFonts) << __FUNCTION__ << pixelSize; - - Q_ASSERT(m_directWriteFontFace); - - m_fontEngineData->directWriteFactory->AddRef(); - m_directWriteFontFace->AddRef(); - - fontDef.pixelSize = pixelSize; - collectMetrics(); - cache_cost = (m_ascent.toInt() + m_descent.toInt()) * m_xHeight.toInt() * 2000; -} - -QWindowsFontEngineDirectWrite::~QWindowsFontEngineDirectWrite() -{ - qCDebug(lcQpaFonts) << __FUNCTION__; - - m_fontEngineData->directWriteFactory->Release(); - m_directWriteFontFace->Release(); - - if (m_directWriteBitmapRenderTarget != 0) - m_directWriteBitmapRenderTarget->Release(); - - if (!m_uniqueFamilyName.isEmpty()) { - QPlatformFontDatabase *pfdb = QGuiApplicationPrivate::platformIntegration()->fontDatabase(); - static_cast(pfdb)->derefUniqueFont(m_uniqueFamilyName); - } -} - -#ifndef Q_CC_MINGW -typedef IDWriteLocalFontFileLoader QIdWriteLocalFontFileLoader; - -static UUID uuidIdWriteLocalFontFileLoader() -{ - return __uuidof(IDWriteLocalFontFileLoader); -} -#else // !Q_CC_MINGW -DECLARE_INTERFACE_(QIdWriteLocalFontFileLoader, IDWriteFontFileLoader) -{ - STDMETHOD(GetFilePathLengthFromKey)(THIS_ void const *, UINT32, UINT32*) PURE; - STDMETHOD(GetFilePathFromKey)(THIS_ void const *, UINT32, WCHAR *, UINT32) PURE; - STDMETHOD(GetLastWriteTimeFromKey)(THIS_ void const *, UINT32, FILETIME *) PURE; -}; - -static UUID uuidIdWriteLocalFontFileLoader() -{ - static const UUID result = { 0xb2d9f3ec, 0xc9fe, 0x4a11, {0xa2, 0xec, 0xd8, 0x62, 0x8, 0xf7, 0xc0, 0xa2}}; - return result; -} -#endif // Q_CC_MINGW - -QString QWindowsFontEngineDirectWrite::filenameFromFontFile(IDWriteFontFile *fontFile) -{ - IDWriteFontFileLoader *loader = Q_NULLPTR; - - HRESULT hr = fontFile->GetLoader(&loader); - if (FAILED(hr)) { - qErrnoWarning("%s: GetLoader failed", __FUNCTION__); - return QString(); - } - - QIdWriteLocalFontFileLoader *localLoader = Q_NULLPTR; - hr = loader->QueryInterface(uuidIdWriteLocalFontFileLoader(), - reinterpret_cast(&localLoader)); - - const void *fontFileReferenceKey = Q_NULLPTR; - UINT32 fontFileReferenceKeySize = 0; - if (SUCCEEDED(hr)) { - hr = fontFile->GetReferenceKey(&fontFileReferenceKey, - &fontFileReferenceKeySize); - if (FAILED(hr)) - qErrnoWarning(hr, "%s: GetReferenceKey failed", __FUNCTION__); - } - - UINT32 filePathLength = 0; - if (SUCCEEDED(hr)) { - hr = localLoader->GetFilePathLengthFromKey(fontFileReferenceKey, - fontFileReferenceKeySize, - &filePathLength); - if (FAILED(hr)) - qErrnoWarning(hr, "GetFilePathLength failed", __FUNCTION__); - } - - QString ret; - if (SUCCEEDED(hr) && filePathLength > 0) { - QVarLengthArray filePath(filePathLength + 1); - - hr = localLoader->GetFilePathFromKey(fontFileReferenceKey, - fontFileReferenceKeySize, - filePath.data(), - filePathLength + 1); - if (FAILED(hr)) - qErrnoWarning(hr, "%s: GetFilePathFromKey failed", __FUNCTION__); - else - ret = QString::fromWCharArray(filePath.data()); - } - - if (localLoader != Q_NULLPTR) - localLoader->Release(); - - if (loader != Q_NULLPTR) - loader->Release(); - return ret; -} - -void QWindowsFontEngineDirectWrite::collectMetrics() -{ - DWRITE_FONT_METRICS metrics; - - m_directWriteFontFace->GetMetrics(&metrics); - m_unitsPerEm = metrics.designUnitsPerEm; - - m_lineThickness = DESIGN_TO_LOGICAL(metrics.underlineThickness); - m_ascent = DESIGN_TO_LOGICAL(metrics.ascent); - m_capHeight = DESIGN_TO_LOGICAL(metrics.capHeight); - m_descent = DESIGN_TO_LOGICAL(metrics.descent); - m_xHeight = DESIGN_TO_LOGICAL(metrics.xHeight); - m_lineGap = DESIGN_TO_LOGICAL(metrics.lineGap); - m_underlinePosition = DESIGN_TO_LOGICAL(metrics.underlinePosition); - - IDWriteFontFile *fontFile = Q_NULLPTR; - UINT32 numberOfFiles = 1; - if (SUCCEEDED(m_directWriteFontFace->GetFiles(&numberOfFiles, &fontFile))) { - m_faceId.filename = QFile::encodeName(filenameFromFontFile(fontFile)); - fontFile->Release(); - } -} - -QFixed QWindowsFontEngineDirectWrite::underlinePosition() const -{ - if (m_underlinePosition > 0) - return m_underlinePosition; - else - return QFontEngine::underlinePosition(); -} - -QFixed QWindowsFontEngineDirectWrite::lineThickness() const -{ - if (m_lineThickness > 0) - return m_lineThickness; - else - return QFontEngine::lineThickness(); -} - -bool QWindowsFontEngineDirectWrite::getSfntTableData(uint tag, uchar *buffer, uint *length) const -{ - bool ret = false; - - const void *tableData = 0; - UINT32 tableSize; - void *tableContext = 0; - BOOL exists; - HRESULT hr = m_directWriteFontFace->TryGetFontTable(qbswap(tag), - &tableData, &tableSize, - &tableContext, &exists); - if (SUCCEEDED(hr)) { - if (exists) { - ret = true; - if (buffer && *length >= tableSize) - memcpy(buffer, tableData, tableSize); - *length = tableSize; - Q_ASSERT(int(*length) > 0); - } - m_directWriteFontFace->ReleaseFontTable(tableContext); - } else { - qErrnoWarning("%s: TryGetFontTable failed", __FUNCTION__); - } - - return ret; -} - -QFixed QWindowsFontEngineDirectWrite::emSquareSize() const -{ - if (m_unitsPerEm > 0) - return m_unitsPerEm; - else - return QFontEngine::emSquareSize(); -} - -glyph_t QWindowsFontEngineDirectWrite::glyphIndex(uint ucs4) const -{ - UINT16 glyphIndex; - - HRESULT hr = m_directWriteFontFace->GetGlyphIndicesW(&ucs4, 1, &glyphIndex); - if (FAILED(hr)) { - qErrnoWarning("%s: glyphIndex failed", __FUNCTION__); - glyphIndex = 0; - } - - return glyphIndex; -} - -bool QWindowsFontEngineDirectWrite::stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, - int *nglyphs, QFontEngine::ShaperFlags flags) const -{ - Q_ASSERT(glyphs->numGlyphs >= *nglyphs); - if (*nglyphs < len) { - *nglyphs = len; - return false; - } - - QVarLengthArray codePoints(len); - int actualLength = 0; - QStringIterator it(str, str + len); - while (it.hasNext()) - codePoints[actualLength++] = it.next(); - - QVarLengthArray glyphIndices(actualLength); - HRESULT hr = m_directWriteFontFace->GetGlyphIndicesW(codePoints.data(), actualLength, - glyphIndices.data()); - if (FAILED(hr)) { - qErrnoWarning("%s: GetGlyphIndicesW failed", __FUNCTION__); - return false; - } - - for (int i = 0; i < actualLength; ++i) - glyphs->glyphs[i] = glyphIndices.at(i); - - *nglyphs = actualLength; - glyphs->numGlyphs = actualLength; - - if (!(flags & GlyphIndicesOnly)) - recalcAdvances(glyphs, 0); - - return true; -} - -QFontEngine::FaceId QWindowsFontEngineDirectWrite::faceId() const -{ - return m_faceId; -} - -void QWindowsFontEngineDirectWrite::recalcAdvances(QGlyphLayout *glyphs, QFontEngine::ShaperFlags) const -{ - QVarLengthArray glyphIndices(glyphs->numGlyphs); - - // ### Caching? - for(int i=0; inumGlyphs; i++) - glyphIndices[i] = UINT16(glyphs->glyphs[i]); - - QVarLengthArray glyphMetrics(glyphIndices.size()); - HRESULT hr = m_directWriteFontFace->GetDesignGlyphMetrics(glyphIndices.data(), - glyphIndices.size(), - glyphMetrics.data()); - if (SUCCEEDED(hr)) { - qreal stretch = fontDef.stretch != QFont::AnyStretch ? fontDef.stretch / 100.0 : 1.0; - for (int i = 0; i < glyphs->numGlyphs; ++i) - glyphs->advances[i] = DESIGN_TO_LOGICAL(glyphMetrics[i].advanceWidth * stretch); - if (fontDef.styleStrategy & QFont::ForceIntegerMetrics) { - for (int i = 0; i < glyphs->numGlyphs; ++i) - glyphs->advances[i] = glyphs->advances[i].round(); - } - } else { - qErrnoWarning("%s: GetDesignGlyphMetrics failed", __FUNCTION__); - } -} - -void QWindowsFontEngineDirectWrite::addGlyphsToPath(glyph_t *glyphs, QFixedPoint *positions, int nglyphs, - QPainterPath *path, QTextItem::RenderFlags flags) -{ - QVarLengthArray glyphIndices(nglyphs); - QVarLengthArray glyphOffsets(nglyphs); - QVarLengthArray glyphAdvances(nglyphs); - - for (int i=0; iGetGlyphRunOutline( - fontDef.pixelSize, - glyphIndices.data(), - glyphAdvances.data(), - glyphOffsets.data(), - nglyphs, - false, - flags & QTextItem::RightToLeft, - &geometrySink - ); - - if (FAILED(hr)) - qErrnoWarning("%s: GetGlyphRunOutline failed", __FUNCTION__); -} - -glyph_metrics_t QWindowsFontEngineDirectWrite::boundingBox(const QGlyphLayout &glyphs) -{ - if (glyphs.numGlyphs == 0) - return glyph_metrics_t(); - - bool round = fontDef.styleStrategy & QFont::ForceIntegerMetrics; - - QFixed w = 0; - for (int i = 0; i < glyphs.numGlyphs; ++i) { - w += round ? glyphs.effectiveAdvance(i).round() : glyphs.effectiveAdvance(i); - - } - - return glyph_metrics_t(0, -m_ascent, w - lastRightBearing(glyphs), m_ascent + m_descent, w, 0); -} - -glyph_metrics_t QWindowsFontEngineDirectWrite::boundingBox(glyph_t g) -{ - UINT16 glyphIndex = g; - - DWRITE_GLYPH_METRICS glyphMetrics; - HRESULT hr = m_directWriteFontFace->GetDesignGlyphMetrics(&glyphIndex, 1, &glyphMetrics); - if (SUCCEEDED(hr)) { - QFixed advanceWidth = DESIGN_TO_LOGICAL(glyphMetrics.advanceWidth); - QFixed leftSideBearing = DESIGN_TO_LOGICAL(glyphMetrics.leftSideBearing); - QFixed rightSideBearing = DESIGN_TO_LOGICAL(glyphMetrics.rightSideBearing); - QFixed advanceHeight = DESIGN_TO_LOGICAL(glyphMetrics.advanceHeight); - QFixed verticalOriginY = DESIGN_TO_LOGICAL(glyphMetrics.verticalOriginY); - QFixed topSideBearing = DESIGN_TO_LOGICAL(glyphMetrics.topSideBearing); - QFixed bottomSideBearing = DESIGN_TO_LOGICAL(glyphMetrics.bottomSideBearing); - - if (fontDef.styleStrategy & QFont::ForceIntegerMetrics) { - advanceWidth = advanceWidth.round(); - advanceHeight = advanceHeight.round(); - } - - QFixed width = advanceWidth - leftSideBearing - rightSideBearing; - QFixed height = advanceHeight - topSideBearing - bottomSideBearing; - return glyph_metrics_t(leftSideBearing, - -verticalOriginY + topSideBearing, - width, - height, - advanceWidth, - 0); - } else { - qErrnoWarning("%s: GetDesignGlyphMetrics failed", __FUNCTION__); - } - - return glyph_metrics_t(); -} - -QFixed QWindowsFontEngineDirectWrite::ascent() const -{ - return fontDef.styleStrategy & QFont::ForceIntegerMetrics - ? m_ascent.round() - : m_ascent; -} - -QFixed QWindowsFontEngineDirectWrite::capHeight() const -{ - if (m_capHeight <= 0) - return calculatedCapHeight(); - - return fontDef.styleStrategy & QFont::ForceIntegerMetrics - ? m_capHeight.round() - : m_capHeight; -} - -QFixed QWindowsFontEngineDirectWrite::descent() const -{ - return fontDef.styleStrategy & QFont::ForceIntegerMetrics - ? m_descent.round() - : m_descent; -} - -QFixed QWindowsFontEngineDirectWrite::leading() const -{ - return fontDef.styleStrategy & QFont::ForceIntegerMetrics - ? m_lineGap.round() - : m_lineGap; -} - -QFixed QWindowsFontEngineDirectWrite::xHeight() const -{ - return fontDef.styleStrategy & QFont::ForceIntegerMetrics - ? m_xHeight.round() - : m_xHeight; -} - -qreal QWindowsFontEngineDirectWrite::maxCharWidth() const -{ - // ### - return 0; -} - -QImage QWindowsFontEngineDirectWrite::alphaMapForGlyph(glyph_t glyph, QFixed subPixelPosition, const QTransform &t) -{ - QImage im = alphaRGBMapForGlyph(glyph, subPixelPosition, t); - - QImage alphaMap(im.width(), im.height(), QImage::Format_Alpha8); - - for (int y=0; y(im.constScanLine(y)); - uchar *dst = alphaMap.scanLine(y); - for (int x=0; xpow_gamma[qGray(0xffffffff - *src)] * 255. / 2047.); - ++dst; - ++src; - } - } - - return alphaMap; -} - -QImage QWindowsFontEngineDirectWrite::alphaMapForGlyph(glyph_t glyph, QFixed subPixelPosition) -{ - return alphaMapForGlyph(glyph, subPixelPosition, QTransform()); -} - -bool QWindowsFontEngineDirectWrite::supportsSubPixelPositions() const -{ - return true; -} - -QImage QWindowsFontEngineDirectWrite::imageForGlyph(glyph_t t, - QFixed subPixelPosition, - int margin, - const QTransform &originalTransform) -{ - UINT16 glyphIndex = t; - FLOAT glyphAdvance = 0; - - DWRITE_GLYPH_OFFSET glyphOffset; - glyphOffset.advanceOffset = 0; - glyphOffset.ascenderOffset = 0; - - DWRITE_GLYPH_RUN glyphRun; - glyphRun.fontFace = m_directWriteFontFace; - glyphRun.fontEmSize = fontDef.pixelSize; - glyphRun.glyphCount = 1; - glyphRun.glyphIndices = &glyphIndex; - glyphRun.glyphAdvances = &glyphAdvance; - glyphRun.isSideways = false; - glyphRun.bidiLevel = 0; - glyphRun.glyphOffsets = &glyphOffset; - - QTransform xform = originalTransform; - if (fontDef.stretch != 100) - xform.scale(fontDef.stretch / 100.0, 1.0); - - DWRITE_MATRIX transform; - transform.dx = subPixelPosition.toReal(); - transform.dy = 0; - transform.m11 = xform.m11(); - transform.m12 = xform.m12(); - transform.m21 = xform.m21(); - transform.m22 = xform.m22(); - - DWRITE_RENDERING_MODE renderMode = - hintingPreferenceToRenderingMode(QFont::HintingPreference(fontDef.hintingPreference)); - - IDWriteGlyphRunAnalysis *glyphAnalysis = NULL; - HRESULT hr = m_fontEngineData->directWriteFactory->CreateGlyphRunAnalysis( - &glyphRun, - 1.0f, - &transform, - renderMode, - DWRITE_MEASURING_MODE_NATURAL, - 0.0, 0.0, - &glyphAnalysis - ); - - if (SUCCEEDED(hr)) { - RECT rect; - glyphAnalysis->GetAlphaTextureBounds(DWRITE_TEXTURE_CLEARTYPE_3x1, &rect); - - QRect boundingRect = QRect(QPoint(rect.left - margin, - rect.top - margin), - QPoint(rect.right + margin, - rect.bottom + margin)); - - - const int width = boundingRect.width() - 1; // -1 due to Qt's off-by-one definition of a QRect - const int height = boundingRect.height() - 1; - - QImage image; -#if defined(QT_USE_DIRECTWRITE2) - HRESULT hr = DWRITE_E_NOCOLOR; - IDWriteColorGlyphRunEnumerator *enumerator = 0; - IDWriteFactory2 *factory2 = Q_NULLPTR; - if (glyphFormat == QFontEngine::Format_ARGB - && SUCCEEDED(m_fontEngineData->directWriteFactory->QueryInterface(__uuidof(IDWriteFactory2), - reinterpret_cast(&factory2)))) { - hr = factory2->TranslateColorGlyphRun(0.0f, - 0.0f, - &glyphRun, - NULL, - DWRITE_MEASURING_MODE_NATURAL, - NULL, - 0, - &enumerator); - image = QImage(width, height, QImage::Format_ARGB32_Premultiplied); - image.fill(0); - } else -#endif - { - image = QImage(width, height, QImage::Format_RGB32); - image.fill(0xffffffff); - } - -#if defined(QT_USE_DIRECTWRITE2) - BOOL ok = true; - if (SUCCEEDED(hr)) { - while (SUCCEEDED(hr) && ok) { - const DWRITE_COLOR_GLYPH_RUN *colorGlyphRun = 0; - hr = enumerator->GetCurrentRun(&colorGlyphRun); - if (FAILED(hr)) { // No colored runs, only outline - qErrnoWarning(hr, "%s: IDWriteColorGlyphRunEnumerator::GetCurrentRun failed", __FUNCTION__); - break; - } - - IDWriteGlyphRunAnalysis *colorGlyphsAnalysis = NULL; - hr = m_fontEngineData->directWriteFactory->CreateGlyphRunAnalysis( - &colorGlyphRun->glyphRun, - 1.0f, - &transform, - renderMode, - DWRITE_MEASURING_MODE_NATURAL, - 0.0, 0.0, - &colorGlyphsAnalysis - ); - if (FAILED(hr)) { - qErrnoWarning(hr, "%s: CreateGlyphRunAnalysis failed for color run", __FUNCTION__); - break; - } - - float r = qBound(0.0f, colorGlyphRun->runColor.r, 1.0f); - float g = qBound(0.0f, colorGlyphRun->runColor.g, 1.0f); - float b = qBound(0.0f, colorGlyphRun->runColor.b, 1.0f); - float a = qBound(0.0f, colorGlyphRun->runColor.a, 1.0f); - - if (!qFuzzyIsNull(a)) { - renderGlyphRun(&image, - r, - g, - b, - a, - colorGlyphsAnalysis, - boundingRect); - } - colorGlyphsAnalysis->Release(); - - hr = enumerator->MoveNext(&ok); - if (FAILED(hr)) { - qErrnoWarning(hr, "%s: IDWriteColorGlyphRunEnumerator::MoveNext failed", __FUNCTION__); - break; - } - } - } else -#endif - { - renderGlyphRun(&image, - 0.0, - 0.0, - 0.0, - 1.0, - glyphAnalysis, - boundingRect); - } - - glyphAnalysis->Release(); - return image; - } else { - qErrnoWarning(hr, "%s: CreateGlyphRunAnalysis failed", __FUNCTION__); - return QImage(); - } -} - - -void QWindowsFontEngineDirectWrite::renderGlyphRun(QImage *destination, - float r, - float g, - float b, - float a, - IDWriteGlyphRunAnalysis *glyphAnalysis, - const QRect &boundingRect) -{ - const int width = destination->width(); - const int height = destination->height(); - - r *= 255.0; - g *= 255.0; - b *= 255.0; - - const int size = width * height * 3; - if (size > 0) { - RECT rect; - rect.left = boundingRect.left(); - rect.top = boundingRect.top(); - rect.right = boundingRect.right(); - rect.bottom = boundingRect.bottom(); - - QVarLengthArray alphaValueArray(size); - BYTE *alphaValues = alphaValueArray.data(); - memset(alphaValues, 0, size); - - HRESULT hr = glyphAnalysis->CreateAlphaTexture(DWRITE_TEXTURE_CLEARTYPE_3x1, - &rect, - alphaValues, - size); - if (SUCCEEDED(hr)) { - if (destination->hasAlphaChannel()) { - for (int y = 0; y < height; ++y) { - uint *dest = reinterpret_cast(destination->scanLine(y)); - BYTE *src = alphaValues + width * 3 * y; - - for (int x = 0; x < width; ++x) { - float redAlpha = a * *src++ / 255.0; - float greenAlpha = a * *src++ / 255.0; - float blueAlpha = a * *src++ / 255.0; - float averageAlpha = (redAlpha + greenAlpha + blueAlpha) / 3.0; - - QRgb currentRgb = dest[x]; - dest[x] = qRgba(qRound(qRed(currentRgb) * (1.0 - averageAlpha) + averageAlpha * r), - qRound(qGreen(currentRgb) * (1.0 - averageAlpha) + averageAlpha * g), - qRound(qBlue(currentRgb) * (1.0 - averageAlpha) + averageAlpha * b), - qRound(qAlpha(currentRgb) * (1.0 - averageAlpha) + averageAlpha * 255)); - } - } - - } else { - for (int y = 0; y < height; ++y) { - uint *dest = reinterpret_cast(destination->scanLine(y)); - BYTE *src = alphaValues + width * 3 * y; - - for (int x = 0; x < width; ++x) { - dest[x] = *(src + 0) << 16 - | *(src + 1) << 8 - | *(src + 2); - - src += 3; - } - } - } - } else { - qErrnoWarning("%s: CreateAlphaTexture failed", __FUNCTION__); - } - } else { - glyphAnalysis->Release(); - qWarning("%s: Glyph has no bounds", __FUNCTION__); - } -} - -QImage QWindowsFontEngineDirectWrite::alphaRGBMapForGlyph(glyph_t t, - QFixed subPixelPosition, - const QTransform &xform) -{ - QImage mask = imageForGlyph(t, - subPixelPosition, - glyphMargin(QFontEngine::Format_A32), - xform); - - return mask.depth() == 32 - ? mask - : mask.convertToFormat(QImage::Format_RGB32); -} - -QFontEngine *QWindowsFontEngineDirectWrite::cloneWithSize(qreal pixelSize) const -{ - QWindowsFontEngineDirectWrite *fontEngine = new QWindowsFontEngineDirectWrite(m_directWriteFontFace, - pixelSize, - m_fontEngineData); - - fontEngine->fontDef = fontDef; - fontEngine->fontDef.pixelSize = pixelSize; - if (!m_uniqueFamilyName.isEmpty()) { - fontEngine->setUniqueFamilyName(m_uniqueFamilyName); - QPlatformFontDatabase *pfdb = QGuiApplicationPrivate::platformIntegration()->fontDatabase(); - static_cast(pfdb)->refUniqueFont(m_uniqueFamilyName); - } - - return fontEngine; -} - -Qt::HANDLE QWindowsFontEngineDirectWrite::handle() const -{ - return m_directWriteFontFace; -} - -void QWindowsFontEngineDirectWrite::initFontInfo(const QFontDef &request, - int dpi) -{ - fontDef = request; - - if (fontDef.pointSize < 0) - fontDef.pointSize = fontDef.pixelSize * 72. / dpi; - else if (fontDef.pixelSize == -1) - fontDef.pixelSize = qRound(fontDef.pointSize * dpi / 72.); -} - -QString QWindowsFontEngineDirectWrite::fontNameSubstitute(const QString &familyName) -{ - static const char keyC[] = "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\" - "FontSubstitutes"; - return QSettings(QLatin1String(keyC), QSettings::NativeFormat).value(familyName, familyName).toString(); -} - -glyph_metrics_t QWindowsFontEngineDirectWrite::alphaMapBoundingBox(glyph_t glyph, - QFixed subPixelPosition, - const QTransform &originalTransform, - GlyphFormat format) -{ - Q_UNUSED(format); - - QTransform matrix = originalTransform; - if (fontDef.stretch != 100) - matrix.scale(fontDef.stretch / 100.0, 1.0); - - glyph_metrics_t bbox = QFontEngine::boundingBox(glyph, matrix); // To get transformed advance - - UINT16 glyphIndex = glyph; - FLOAT glyphAdvance = 0; - - DWRITE_GLYPH_OFFSET glyphOffset; - glyphOffset.advanceOffset = 0; - glyphOffset.ascenderOffset = 0; - - DWRITE_GLYPH_RUN glyphRun; - glyphRun.fontFace = m_directWriteFontFace; - glyphRun.fontEmSize = fontDef.pixelSize; - glyphRun.glyphCount = 1; - glyphRun.glyphIndices = &glyphIndex; - glyphRun.glyphAdvances = &glyphAdvance; - glyphRun.isSideways = false; - glyphRun.bidiLevel = 0; - glyphRun.glyphOffsets = &glyphOffset; - - DWRITE_MATRIX transform; - transform.dx = subPixelPosition.toReal(); - transform.dy = 0; - transform.m11 = matrix.m11(); - transform.m12 = matrix.m12(); - transform.m21 = matrix.m21(); - transform.m22 = matrix.m22(); - - DWRITE_RENDERING_MODE renderMode = - hintingPreferenceToRenderingMode(QFont::HintingPreference(fontDef.hintingPreference)); - - IDWriteGlyphRunAnalysis *glyphAnalysis = NULL; - HRESULT hr = m_fontEngineData->directWriteFactory->CreateGlyphRunAnalysis( - &glyphRun, - 1.0f, - &transform, - renderMode, - DWRITE_MEASURING_MODE_NATURAL, - 0.0, 0.0, - &glyphAnalysis - ); - - if (SUCCEEDED(hr)) { - RECT rect; - glyphAnalysis->GetAlphaTextureBounds(DWRITE_TEXTURE_CLEARTYPE_3x1, &rect); - glyphAnalysis->Release(); - - int margin = glyphMargin(QFontEngine::Format_A32); - - return glyph_metrics_t(rect.left, - rect.top, - rect.right - rect.left + margin * 2, - rect.bottom - rect.top + margin * 2, - bbox.xoff, bbox.yoff); - } else { - return glyph_metrics_t(); - } -} - -QImage QWindowsFontEngineDirectWrite::bitmapForGlyph(glyph_t glyph, QFixed subPixelPosition, const QTransform &t) -{ - return imageForGlyph(glyph, subPixelPosition, glyphMargin(QFontEngine::Format_A32), t); -} - -QT_END_NAMESPACE - -#endif // QT_NO_DIRECTWRITE diff --git a/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.h b/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.h deleted file mode 100644 index e4a82c6a6e..0000000000 --- a/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.h +++ /dev/null @@ -1,143 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QWINDOWSFONTENGINEDIRECTWRITE_H -#define QWINDOWSFONTENGINEDIRECTWRITE_H - -#include - -#ifndef QT_NO_DIRECTWRITE - -#include -#include - -struct IDWriteFont; -struct IDWriteFontFace; -struct IDWriteFontFile; -struct IDWriteFactory; -struct IDWriteBitmapRenderTarget; -struct IDWriteGdiInterop; -struct IDWriteGlyphRunAnalysis; - -QT_BEGIN_NAMESPACE - -class QWindowsFontEngineData; - -class QWindowsFontEngineDirectWrite : public QFontEngine -{ -public: - explicit QWindowsFontEngineDirectWrite(IDWriteFontFace *directWriteFontFace, - qreal pixelSize, - const QSharedPointer &d); - ~QWindowsFontEngineDirectWrite(); - - void initFontInfo(const QFontDef &request, int dpi); - - QFixed lineThickness() const Q_DECL_OVERRIDE; - QFixed underlinePosition() const Q_DECL_OVERRIDE; - bool getSfntTableData(uint tag, uchar *buffer, uint *length) const Q_DECL_OVERRIDE; - QFixed emSquareSize() const Q_DECL_OVERRIDE; - - glyph_t glyphIndex(uint ucs4) const Q_DECL_OVERRIDE; - bool stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, int *nglyphs, - ShaperFlags flags) const Q_DECL_OVERRIDE; - void recalcAdvances(QGlyphLayout *glyphs, ShaperFlags) const Q_DECL_OVERRIDE; - - void addGlyphsToPath(glyph_t *glyphs, QFixedPoint *positions, int nglyphs, - QPainterPath *path, QTextItem::RenderFlags flags) Q_DECL_OVERRIDE; - - glyph_metrics_t boundingBox(const QGlyphLayout &glyphs) Q_DECL_OVERRIDE; - glyph_metrics_t boundingBox(glyph_t g) Q_DECL_OVERRIDE; - glyph_metrics_t alphaMapBoundingBox(glyph_t glyph, QFixed, - const QTransform &matrix, GlyphFormat) Q_DECL_OVERRIDE; - - QFixed ascent() const Q_DECL_OVERRIDE; - QFixed capHeight() const Q_DECL_OVERRIDE; - QFixed descent() const Q_DECL_OVERRIDE; - QFixed leading() const Q_DECL_OVERRIDE; - QFixed xHeight() const Q_DECL_OVERRIDE; - qreal maxCharWidth() const Q_DECL_OVERRIDE; - FaceId faceId() const Q_DECL_OVERRIDE; - - bool supportsSubPixelPositions() const Q_DECL_OVERRIDE; - - QImage alphaMapForGlyph(glyph_t glyph, QFixed subPixelPosition) Q_DECL_OVERRIDE; - QImage alphaMapForGlyph(glyph_t glyph, QFixed subPixelPosition, const QTransform &t) Q_DECL_OVERRIDE; - QImage alphaRGBMapForGlyph(glyph_t t, QFixed subPixelPosition, const QTransform &xform) Q_DECL_OVERRIDE; - QImage bitmapForGlyph(glyph_t, QFixed subPixelPosition, const QTransform &t) Q_DECL_OVERRIDE; - - QFontEngine *cloneWithSize(qreal pixelSize) const Q_DECL_OVERRIDE; - Qt::HANDLE handle() const Q_DECL_OVERRIDE; - - const QSharedPointer &fontEngineData() const { return m_fontEngineData; } - - static QString fontNameSubstitute(const QString &familyName); - - IDWriteFontFace *directWriteFontFace() const { return m_directWriteFontFace; } - - void setUniqueFamilyName(const QString &newName) { m_uniqueFamilyName = newName; } - -private: - QImage imageForGlyph(glyph_t t, QFixed subPixelPosition, int margin, const QTransform &xform); - void collectMetrics(); - void renderGlyphRun(QImage *destination, float r, float g, float b, float a, IDWriteGlyphRunAnalysis *glyphAnalysis, const QRect &boundingRect); - static QString filenameFromFontFile(IDWriteFontFile *fontFile); - - const QSharedPointer m_fontEngineData; - - IDWriteFontFace *m_directWriteFontFace; - IDWriteBitmapRenderTarget *m_directWriteBitmapRenderTarget; - - QFixed m_lineThickness; - QFixed m_underlinePosition; - int m_unitsPerEm; - QFixed m_ascent; - QFixed m_capHeight; - QFixed m_descent; - QFixed m_xHeight; - QFixed m_lineGap; - FaceId m_faceId; - QString m_uniqueFamilyName; -}; - -QT_END_NAMESPACE - -#endif // QT_NO_DIRECTWRITE - -#endif // QWINDOWSFONTENGINEDIRECTWRITE_H diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp index 16a2b56774..004b03d9a9 100644 --- a/src/plugins/platforms/windows/qwindowsintegration.cpp +++ b/src/plugins/platforms/windows/qwindowsintegration.cpp @@ -47,9 +47,8 @@ #include "qwindowstheme.h" #include "qwindowsservices.h" #ifndef QT_NO_FREETYPE -# include "qwindowsfontdatabase_ft.h" +# include #endif -#include "qwindowsfontdatabase.h" #ifndef QT_NO_CLIPBOARD # include "qwindowsclipboard.h" # ifndef QT_NO_DRAGANDDROP @@ -220,6 +219,7 @@ QWindowsIntegrationPrivate::QWindowsIntegrationPrivate(const QStringList ¶mL // are connected to Windows 8.1 QtWindows::ProcessDpiAwareness dpiAwareness = QtWindows::ProcessPerMonitorDpiAware; m_options = parseOptions(paramList, &tabletAbsoluteRange, &dpiAwareness); + QWindowsFontDatabase::setFontOptions(m_options); if (tabletAbsoluteRange >= 0) m_context.setTabletAbsoluteRange(tabletAbsoluteRange); if (!dpiAwarenessSet) { // Set only once in case of repeated instantiations of QGuiApplication. diff --git a/src/plugins/platforms/windows/qwindowsintegration.h b/src/plugins/platforms/windows/qwindowsintegration.h index 4258f908e7..a668470993 100644 --- a/src/plugins/platforms/windows/qwindowsintegration.h +++ b/src/plugins/platforms/windows/qwindowsintegration.h @@ -43,6 +43,7 @@ #include #include +#include QT_BEGIN_NAMESPACE @@ -61,8 +62,9 @@ public: NoNativeDialogs = 0x8, XpNativeDialogs = 0x10, DontPassOsMouseEventsSynthesizedFromTouch = 0x20, // Do not pass OS-generated mouse events from touch. - DontUseDirectWriteFonts = 0x40, - DontUseColorFonts = 0x80 + // Keep in sync with QWindowsFontDatabase::FontOptions + DontUseDirectWriteFonts = QWindowsFontDatabase::DontUseDirectWriteFonts, + DontUseColorFonts = QWindowsFontDatabase::DontUseColorFonts }; explicit QWindowsIntegration(const QStringList ¶mList); diff --git a/src/plugins/platforms/windows/qwindowsnativeimage.cpp b/src/plugins/platforms/windows/qwindowsnativeimage.cpp deleted file mode 100644 index ec9683ea8d..0000000000 --- a/src/plugins/platforms/windows/qwindowsnativeimage.cpp +++ /dev/null @@ -1,150 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qwindowsnativeimage.h" -#include "qwindowscontext.h" - -#include -#include - -QT_BEGIN_NAMESPACE - -typedef struct { - BITMAPINFOHEADER bmiHeader; - DWORD redMask; - DWORD greenMask; - DWORD blueMask; -} BITMAPINFO_MASK; - -/*! - \class QWindowsNativeImage - \brief Windows Native image - - Note that size can be 0 (widget autotests with zero size), which - causes CreateDIBSection() to fail. - - \sa QWindowsBackingStore - \internal - \ingroup qt-lighthouse-win -*/ - -static inline HDC createDC() -{ - HDC display_dc = GetDC(0); - HDC hdc = CreateCompatibleDC(display_dc); - ReleaseDC(0, display_dc); - Q_ASSERT(hdc); - return hdc; -} - -static inline HBITMAP createDIB(HDC hdc, int width, int height, - QImage::Format format, - uchar **bitsIn) -{ - BITMAPINFO_MASK bmi; - memset(&bmi, 0, sizeof(bmi)); - bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - bmi.bmiHeader.biWidth = width; - bmi.bmiHeader.biHeight = -height; // top-down. - bmi.bmiHeader.biPlanes = 1; - bmi.bmiHeader.biSizeImage = 0; - - if (format == QImage::Format_RGB16) { - bmi.bmiHeader.biBitCount = 16; - bmi.bmiHeader.biCompression = BI_BITFIELDS; - bmi.redMask = 0xF800; - bmi.greenMask = 0x07E0; - bmi.blueMask = 0x001F; - } else { - bmi.bmiHeader.biBitCount = 32; - bmi.bmiHeader.biCompression = BI_RGB; - bmi.redMask = 0; - bmi.greenMask = 0; - bmi.blueMask = 0; - } - - uchar *bits = Q_NULLPTR; - HBITMAP bitmap = CreateDIBSection(hdc, reinterpret_cast(&bmi), - DIB_RGB_COLORS, reinterpret_cast(&bits), 0, 0); - if (Q_UNLIKELY(!bitmap || !bits)) - qFatal("%s: CreateDIBSection failed.", __FUNCTION__); - - *bitsIn = bits; - return bitmap; -} - -QWindowsNativeImage::QWindowsNativeImage(int width, int height, - QImage::Format format) : - m_hdc(createDC()), - m_bitmap(0), - m_null_bitmap(0) -{ - if (width != 0 && height != 0) { - uchar *bits; - m_bitmap = createDIB(m_hdc, width, height, format, &bits); - m_null_bitmap = static_cast(SelectObject(m_hdc, m_bitmap)); - m_image = QImage(bits, width, height, format); - Q_ASSERT(m_image.paintEngine()->type() == QPaintEngine::Raster); - static_cast(m_image.paintEngine())->setDC(m_hdc); - } else { - m_image = QImage(width, height, format); - } - - GdiFlush(); -} - -QWindowsNativeImage::~QWindowsNativeImage() -{ - if (m_hdc) { - if (m_bitmap) { - if (m_null_bitmap) - SelectObject(m_hdc, m_null_bitmap); - DeleteObject(m_bitmap); - } - DeleteDC(m_hdc); - } -} - -QImage::Format QWindowsNativeImage::systemFormat() -{ - static const int depth = QWindowsContext::instance()->screenDepth(); - return depth == 16 ? QImage::Format_RGB16 : QImage::Format_RGB32; -} - -QT_END_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsnativeimage.h b/src/plugins/platforms/windows/qwindowsnativeimage.h deleted file mode 100644 index bfe0f07dfd..0000000000 --- a/src/plugins/platforms/windows/qwindowsnativeimage.h +++ /dev/null @@ -1,78 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QWINDOWSNATIVEIMAGE_H -#define QWINDOWSNATIVEIMAGE_H - -#include - -#include - -QT_BEGIN_NAMESPACE - -class QWindowsNativeImage -{ - Q_DISABLE_COPY(QWindowsNativeImage) -public: - QWindowsNativeImage(int width, int height, - QImage::Format format); - - ~QWindowsNativeImage(); - - inline int width() const { return m_image.width(); } - inline int height() const { return m_image.height(); } - - QImage &image() { return m_image; } - const QImage &image() const { return m_image; } - - HDC hdc() const { return m_hdc; } - - static QImage::Format systemFormat(); - -private: - const HDC m_hdc; - QImage m_image; - - HBITMAP m_bitmap; - HBITMAP m_null_bitmap; -}; - -QT_END_NAMESPACE - -#endif // QWINDOWSNATIVEIMAGE_H diff --git a/src/plugins/platforms/windows/qwindowsnativeinterface.cpp b/src/plugins/platforms/windows/qwindowsnativeinterface.cpp index e0ae111b9a..eaa6e45b9f 100644 --- a/src/plugins/platforms/windows/qwindowsnativeinterface.cpp +++ b/src/plugins/platforms/windows/qwindowsnativeinterface.cpp @@ -41,7 +41,6 @@ #include "qwindowswindow.h" #include "qwindowscontext.h" #include "qwindowscursor.h" -#include "qwindowsfontdatabase.h" #include "qwindowsopenglcontext.h" #include "qwindowsopengltester.h" #include "qwindowsintegration.h" @@ -51,6 +50,7 @@ #include #include #include +#include QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowstheme.cpp b/src/plugins/platforms/windows/qwindowstheme.cpp index fe67c0ce37..ed12c8124e 100644 --- a/src/plugins/platforms/windows/qwindowstheme.cpp +++ b/src/plugins/platforms/windows/qwindowstheme.cpp @@ -48,7 +48,6 @@ #include "qwindowscontext.h" #include "qwindowsintegration.h" #include "qt_windows.h" -#include "qwindowsfontdatabase.h" #include #include #ifndef Q_CC_MINGW @@ -69,6 +68,7 @@ #include #include #include +#include #include #include diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index 0ebed59a1d..a9b061ad73 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -38,7 +38,6 @@ ****************************************************************************/ #include "qwindowswindow.h" -#include "qwindowsnativeimage.h" #include "qwindowscontext.h" #include "qwindowsdrag.h" #include "qwindowsscreen.h" diff --git a/src/plugins/platforms/windows/windows.pri b/src/plugins/platforms/windows/windows.pri index 411c9e032b..d97e49309f 100644 --- a/src/plugins/platforms/windows/windows.pri +++ b/src/plugins/platforms/windows/windows.pri @@ -9,24 +9,12 @@ LIBS += -lshlwapi -lshell32 -ladvapi32 DEFINES *= QT_NO_CAST_FROM_ASCII -qtConfig(directwrite) { - qtConfig(directwrite2): \ - DEFINES *= QT_USE_DIRECTWRITE2 - - SOURCES += $$PWD/qwindowsfontenginedirectwrite.cpp - HEADERS += $$PWD/qwindowsfontenginedirectwrite.h -} else { - DEFINES *= QT_NO_DIRECTWRITE -} - SOURCES += \ $$PWD/qwindowswindow.cpp \ $$PWD/qwindowsintegration.cpp \ $$PWD/qwindowscontext.cpp \ $$PWD/qwindowsscreen.cpp \ $$PWD/qwindowskeymapper.cpp \ - $$PWD/qwindowsfontengine.cpp \ - $$PWD/qwindowsfontdatabase.cpp \ $$PWD/qwindowsmousehandler.cpp \ $$PWD/qwindowsole.cpp \ $$PWD/qwindowsmime.cpp \ @@ -36,7 +24,6 @@ SOURCES += \ $$PWD/qwindowstheme.cpp \ $$PWD/qwindowsdialoghelpers.cpp \ $$PWD/qwindowsservices.cpp \ - $$PWD/qwindowsnativeimage.cpp \ $$PWD/qwindowsnativeinterface.cpp \ $$PWD/qwindowsopengltester.cpp @@ -46,8 +33,6 @@ HEADERS += \ $$PWD/qwindowscontext.h \ $$PWD/qwindowsscreen.h \ $$PWD/qwindowskeymapper.h \ - $$PWD/qwindowsfontengine.h \ - $$PWD/qwindowsfontdatabase.h \ $$PWD/qwindowsmousehandler.h \ $$PWD/qtwindowsglobal.h \ $$PWD/qwindowsole.h \ @@ -58,7 +43,6 @@ HEADERS += \ $$PWD/qwindowstheme.h \ $$PWD/qwindowsdialoghelpers.h \ $$PWD/qwindowsservices.h \ - $$PWD/qwindowsnativeimage.h \ $$PWD/qwindowsnativeinterface.h \ $$PWD/qwindowsopengltester.h \ $$PWD/qwindowsthreadpoolrunner.h @@ -111,11 +95,6 @@ qtConfig(dynamicgl) { RESOURCES += $$PWD/openglblacklists.qrc -qtConfig(freetype) { - HEADERS += $$PWD/qwindowsfontdatabase_ft.h - SOURCES += $$PWD/qwindowsfontdatabase_ft.cpp -} - qtConfig(accessibility): include($$PWD/accessible/accessible.pri) DEFINES *= LIBEGL_NAME=$${LIBEGL_NAME} -- cgit v1.2.3 From 8d9c42e36217e14efa69974c2cdc8d90f465a959 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Thu, 27 Oct 2016 09:49:24 +0200 Subject: xcb: Avoid crash when requesting non-supported stereo formats Introduced in the 5.7 branch by 5f39a0ef8d037ed8d1fa19d5514308ed4a2ca161. Add also a warning in the GLX backend instead of just dereferencing the null pointer. Task-number: QTBUG-55291 Change-Id: I1f2930768b39a04ee443a68d0ac7dc9ecf26cb9c Reviewed-by: Louai Al-Khanji --- src/platformsupport/glxconvenience/qglxconvenience.cpp | 5 +++++ src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxwindow.cpp | 4 ++++ 2 files changed, 9 insertions(+) (limited to 'src') diff --git a/src/platformsupport/glxconvenience/qglxconvenience.cpp b/src/platformsupport/glxconvenience/qglxconvenience.cpp index 7dc29fae6d..4225bebf37 100644 --- a/src/platformsupport/glxconvenience/qglxconvenience.cpp +++ b/src/platformsupport/glxconvenience/qglxconvenience.cpp @@ -386,5 +386,10 @@ bool qglx_reduceFormat(QSurfaceFormat *format) return true; } + if (format->stereo()) { + format->setStereo(false); + return true; + } + return false; } diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxwindow.cpp b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxwindow.cpp index 8ae83b8084..a8d51d5e8c 100644 --- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxwindow.cpp +++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxwindow.cpp @@ -59,6 +59,10 @@ const xcb_visualtype_t *QXcbGlxWindow::createVisual() if (!scr) return Q_NULLPTR; XVisualInfo *visualInfo = qglx_findVisualInfo(DISPLAY_FROM_XCB(scr), scr->screenNumber(), &m_format); + if (!visualInfo) { + qWarning() << "No XVisualInfo for format" << m_format; + return Q_NULLPTR; + } const xcb_visualtype_t *xcb_visualtype = scr->visualForId(visualInfo->visualid); XFree(visualInfo); return xcb_visualtype; -- cgit v1.2.3 From f577a01f5e8d9678d268917ca727a6e9a3e819a6 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Thu, 27 Oct 2016 12:29:26 +0200 Subject: eglfs: Cast to EGLNativeDisplayType in EGLDevice backend When compiling with EGL native types being the Xlib types (uncommon since we disable this both for Mesa and NVIDIA embedded, but can happen with other vendor's headers), the types for EGLDeviceEXT (void*) and EGLNativeDisplayType (Display, i.e. _XDisplay*) won't match, breaking compilation. At runtime we won't hit that path, so all we need to ensure is that the code compiles. Do this via a cast. When the native types are generic, both types are void* so the cast has no effect. Change-Id: Ib54f569d4494906f74107f08b47bd6b521d700db Reviewed-by: Louai Al-Khanji --- .../eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldevice.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldevice.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldevice.cpp index 743f714cf0..f6e86bf0bc 100644 --- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldevice.cpp +++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldevice.cpp @@ -71,7 +71,7 @@ void QEglFSKmsEglDevice::close() EGLNativeDisplayType QEglFSKmsEglDevice::nativeDisplay() const { - return static_cast(m_integration)->eglDevice(); + return reinterpret_cast(static_cast(m_integration)->eglDevice()); } QEglFSKmsScreen *QEglFSKmsEglDevice::createScreen(QEglFSKmsIntegration *integration, QEglFSKmsDevice *device, QEglFSKmsOutput output, QPoint position) -- cgit v1.2.3 From f9280ba45ed6e492871cd25026a1bce7a17042dc Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Mon, 24 Oct 2016 13:49:41 -0700 Subject: QNSColorPanelDelegate: Don't restore stolen view on dealloc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We may not be playing nice with Cocoa's internals when we decide to reparent NSColorPanel's contents to add QColorDialog's own OK/Cancel buttons. In order to reduce issues, we should avoid poking at things during the application's shutdown sequence. Simply releasing the stolen view should be enough at that point. A similar pattern exists in QNSFontPanelDelegate. Change-Id: I678c236e0c57c4d08a1109a479d965f924288c54 Task-number: QTBUG-56448 Reviewed-by: Tor Arne Vestbø Reviewed-by: Timur Pocheptsov Reviewed-by: Erik Verbruggen --- src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm | 2 +- src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm b/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm index ed17ef8fe9..3c924bec94 100644 --- a/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm +++ b/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm @@ -116,7 +116,7 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSColorPanelDelegate); - (void)dealloc { - [self restoreOriginalContentView]; + [mStolenContentView release]; [mColorPanel setDelegate:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self]; diff --git a/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm b/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm index d1802fe4f9..5b27dc1da9 100644 --- a/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm +++ b/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm @@ -144,7 +144,7 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSFontPanelDelegate); - (void)dealloc { - [self restoreOriginalContentView]; + [mStolenContentView release]; [mFontPanel setDelegate:nil]; [[NSFontManager sharedFontManager] setDelegate:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self]; -- cgit v1.2.3 From d245db2f8350a949a83a75ff36f5d9d8ec75db9a Mon Sep 17 00:00:00 2001 From: Anton Kudryavtsev Date: Wed, 12 Oct 2016 18:29:40 +0300 Subject: QWidgetPrivate: remove unused declarations of methods ... such as beginSharedPainter() and endSharedPainter() Change-Id: I0e76dd172c2f3bce169f58e4c62bd47c73c99dcd Reviewed-by: Edward Welbourne Reviewed-by: Marc Mutz Reviewed-by: Thiago Macieira --- src/widgets/kernel/qwidget_p.h | 3 --- 1 file changed, 3 deletions(-) (limited to 'src') diff --git a/src/widgets/kernel/qwidget_p.h b/src/widgets/kernel/qwidget_p.h index 37f2c0e5c7..dbc9d86172 100644 --- a/src/widgets/kernel/qwidget_p.h +++ b/src/widgets/kernel/qwidget_p.h @@ -395,9 +395,6 @@ public: const QRegion &rgn, const QPoint &offset, int flags, QPainter *sharedPainter, QWidgetBackingStore *backingStore); - - QPainter *beginSharedPainter(); - bool endSharedPainter(); #ifndef QT_NO_GRAPHICSVIEW static QGraphicsProxyWidget * nearestGraphicsProxyWidget(const QWidget *origin); #endif -- cgit v1.2.3 From bda6c2b018d31eaa53e67d0274d0d5863ae2f11c Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 29 Sep 2016 18:52:07 +0200 Subject: remove monolithic platformsupport module all users have migrated to the modular libraries. Change-Id: Ifc470583c86a4f30af5335c21f2e3e4d19d39954 Reviewed-by: Lars Knoll --- src/platformsupport/legacy.cpp | 48 --------------------------------- src/platformsupport/legacy.pro | 32 ---------------------- src/platformsupport/platformsupport.pro | 5 ---- 3 files changed, 85 deletions(-) delete mode 100644 src/platformsupport/legacy.cpp delete mode 100644 src/platformsupport/legacy.pro (limited to 'src') diff --git a/src/platformsupport/legacy.cpp b/src/platformsupport/legacy.cpp deleted file mode 100644 index 49def2ecca..0000000000 --- a/src/platformsupport/legacy.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include - -QT_BEGIN_NAMESPACE - -void dummy() -{ -} - -QT_END_NAMESPACE diff --git a/src/platformsupport/legacy.pro b/src/platformsupport/legacy.pro deleted file mode 100644 index 042f16301d..0000000000 --- a/src/platformsupport/legacy.pro +++ /dev/null @@ -1,32 +0,0 @@ -TARGET = QtPlatformSupport -MODULE = platformsupport - -QT_FOR_CONFIG += gui-private -CONFIG += static internal_module - -SOURCES += legacy.cpp - -mods = \ - accessibility \ - cgl \ - clipboard \ - devicediscovery \ - egl \ - eventdispatcher \ - fb \ - fontdatabase \ - glx \ - graphics \ - input \ - linuxaccessibility \ - platformcompositor \ - service \ - theme - -for (mod, mods) { - mod = $${mod}_support-private - qtHaveModule($$mod): \ - QT += $$mod -} - -load(qt_module) diff --git a/src/platformsupport/platformsupport.pro b/src/platformsupport/platformsupport.pro index bb0b7b81a3..09e2922505 100644 --- a/src/platformsupport/platformsupport.pro +++ b/src/platformsupport/platformsupport.pro @@ -40,8 +40,3 @@ darwin { macos: \ SUBDIRS += cglconvenience } - -# This aggregates all of them. -legacy.file = legacy.pro -legacy.depends = $$SUBDIRS -SUBDIRS += legacy -- cgit v1.2.3 From eb9681397609eee38703f0e0f005a234f95ad99f Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Tue, 25 Oct 2016 14:23:22 +0200 Subject: Document use of BSD code in Qt Core Change-Id: I31305e40dc57ddd37e5ef35a52cc99dc7ebb3bc5 Reviewed-by: Lars Knoll --- src/corelib/codecs/QBKCODEC_LICENSE.txt | 24 ++ src/corelib/codecs/QEUCJPCODEC_LICENSE.txt | 22 ++ src/corelib/codecs/QEUCKRCODEC_LICENSE.txt | 22 ++ src/corelib/codecs/QJISCODEC_LICENSE.txt | 22 ++ src/corelib/codecs/QSJISCODEC_LICENSE.txt | 22 ++ src/corelib/codecs/QTSCIICODEC_LICENSE.txt | 22 ++ src/corelib/codecs/codecs.qdoc | 249 +-------------------- src/corelib/codecs/qt_attribution.json | 103 +++++++++ src/corelib/io/QTEMPORARYFILE_LICENSE.txt | 26 +++ src/corelib/io/qt_attribution.json | 13 ++ src/corelib/kernel/QEVENTDISPATCHER_CF_LICENSE.txt | 29 +++ src/corelib/kernel/qt_attribution.json | 13 ++ 12 files changed, 329 insertions(+), 238 deletions(-) create mode 100644 src/corelib/codecs/QBKCODEC_LICENSE.txt create mode 100644 src/corelib/codecs/QEUCJPCODEC_LICENSE.txt create mode 100644 src/corelib/codecs/QEUCKRCODEC_LICENSE.txt create mode 100644 src/corelib/codecs/QJISCODEC_LICENSE.txt create mode 100644 src/corelib/codecs/QSJISCODEC_LICENSE.txt create mode 100644 src/corelib/codecs/QTSCIICODEC_LICENSE.txt create mode 100644 src/corelib/codecs/qt_attribution.json create mode 100644 src/corelib/io/QTEMPORARYFILE_LICENSE.txt create mode 100644 src/corelib/io/qt_attribution.json create mode 100644 src/corelib/kernel/QEVENTDISPATCHER_CF_LICENSE.txt create mode 100644 src/corelib/kernel/qt_attribution.json (limited to 'src') diff --git a/src/corelib/codecs/QBKCODEC_LICENSE.txt b/src/corelib/codecs/QBKCODEC_LICENSE.txt new file mode 100644 index 0000000000..1eb9e3b0d4 --- /dev/null +++ b/src/corelib/codecs/QBKCODEC_LICENSE.txt @@ -0,0 +1,24 @@ +Copyright (C) 2000 TurboLinux, Inc. Written by Justin Yu and Sean Chen. +Copyright (C) 2001, 2002 Turbolinux, Inc. Written by James Su. +Copyright (C) 2001, 2002 ThizLinux Laboratory Ltd. Written by Anthony Fok. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/src/corelib/codecs/QEUCJPCODEC_LICENSE.txt b/src/corelib/codecs/QEUCJPCODEC_LICENSE.txt new file mode 100644 index 0000000000..b1754cf198 --- /dev/null +++ b/src/corelib/codecs/QEUCJPCODEC_LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (C) 1999 Serika Kurusugawa, All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/src/corelib/codecs/QEUCKRCODEC_LICENSE.txt b/src/corelib/codecs/QEUCKRCODEC_LICENSE.txt new file mode 100644 index 0000000000..81327f1bcb --- /dev/null +++ b/src/corelib/codecs/QEUCKRCODEC_LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (C) 1999-2000 Mizi Research Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/src/corelib/codecs/QJISCODEC_LICENSE.txt b/src/corelib/codecs/QJISCODEC_LICENSE.txt new file mode 100644 index 0000000000..b1754cf198 --- /dev/null +++ b/src/corelib/codecs/QJISCODEC_LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (C) 1999 Serika Kurusugawa, All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/src/corelib/codecs/QSJISCODEC_LICENSE.txt b/src/corelib/codecs/QSJISCODEC_LICENSE.txt new file mode 100644 index 0000000000..b1754cf198 --- /dev/null +++ b/src/corelib/codecs/QSJISCODEC_LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (C) 1999 Serika Kurusugawa, All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/src/corelib/codecs/QTSCIICODEC_LICENSE.txt b/src/corelib/codecs/QTSCIICODEC_LICENSE.txt new file mode 100644 index 0000000000..c66ff21389 --- /dev/null +++ b/src/corelib/codecs/QTSCIICODEC_LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (C) 2000 Hans Petter Bieker. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/src/corelib/codecs/codecs.qdoc b/src/corelib/codecs/codecs.qdoc index e0f1c9b060..9364b7a989 100644 --- a/src/corelib/codecs/codecs.qdoc +++ b/src/corelib/codecs/codecs.qdoc @@ -55,35 +55,7 @@ \ \ to adapt the code for Qt. - \legalese - Copyright (C) 2000 Ming-Che Chuang - Copyright (C) 2002 James Su, Turbolinux Inc. - Copyright (C) 2002 Anthony Fok, ThizLinux Laboratory Ltd. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - \list 1 - \li Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - \li Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - \endlist - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. - \endlegalese + \sa{Text Codecs: Big5, Big5-HKSCS} */ /*! @@ -124,36 +96,7 @@ Li18nux Big5 Standard Subgroup. See \l{http://www.autrijus.org/xml/} for the various Big5 CharMapML tables. - \legalese - Copyright (C) 2000 Ming-Che Chuang - Copyright (C) 2001, 2002 James Su, Turbolinux Inc. - Copyright (C) 2002 WU Yi, HancomLinux Inc. - Copyright (C) 2001, 2002 Anthony Fok, ThizLinux Laboratory Ltd. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - \list 1 - \li Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - \li Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - \endlist - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. - \endlegalese + \sa{Text Codecs: Big5, Big5-HKSCS} */ /*! @@ -171,37 +114,9 @@ Most of the code here was written by Serika Kurusugawa, a.k.a. Junji Takagi, and is included in Qt with the author's - permission and the grateful thanks of the Qt team. Here is - the copyright statement for that code: - - \legalese - - Copyright (C) 1999 Serika Kurusugawa. All rights reserved. + permission and the grateful thanks of the Qt team. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - \list 1 - \li Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - \li Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - \endlist - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS". - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. - \endlegalese + \sa{Text Codec: EUC-JP} */ /*! @@ -217,34 +132,7 @@ contribution. The subsequent modifications are covered by the usual copyright for Qt. - \legalese - - Copyright (C) 1999-2000 Mizi Research Inc. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - \list 1 - \li Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - \li Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - \endlist - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. - \endlegalese + \sa{Text Codec: EUC-KR} */ /*! @@ -292,37 +180,7 @@ A copy of the source Perl script is available at \l{http://people.debian.org/~foka/gb18030/gen-qgb18030codec.pl} - The copyright notice for their code follows: - - \legalese - Copyright (C) 2000 TurboLinux, Inc. Written by Justin Yu and Sean Chen. - Copyright (C) 2001, 2002 Turbolinux, Inc. Written by James Su. - Copyright (C) 2001, 2002 ThizLinux Laboratory Ltd. Written by Anthony Fok. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - \list 1 - \li Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - \li Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - \endlist - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. - \endlegalese + \sa{Text Codec: GBK} */ /*! @@ -381,37 +239,9 @@ Most of the code here was written by Serika Kurusugawa, a.k.a. Junji Takagi, and is included in Qt with the author's - permission and the grateful thanks of the Qt team. Here is - the copyright statement for that code: - - \legalese + permission and the grateful thanks of the Qt team. - Copyright (C) 1999 Serika Kurusugawa. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - \list 1 - \li Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - \li Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - \endlist - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS". - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. - \endlegalese + \sa{Text Codec: ISO 2022-JP (JIS)} */ /*! @@ -433,34 +263,7 @@ contribution. The subsequent modifications are covered by the usual copyright for Qt. - \legalese - - Copyright (C) 1999 Serika Kurusugawa. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - \list 1 - \li Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - \li Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - \endlist - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS". - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. - \endlegalese + \sa{Text Codec: Shift-JIS} */ /*! @@ -483,37 +286,7 @@ Most of the code was written by Hans Petter Bieker and is included in Qt with the author's permission and the grateful - thanks of the Qt team. Here is the copyright statement for - the code as it was at the point of contribution. The - subsequent modifications are covered by the usual copyright for - Qt: - - \legalese - - Copyright (c) 2000 Hans Petter Bieker. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - \list 1 - \li Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - \li Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - \endlist + thanks of the Qt team. - THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. - \endlegalese + \sa{Text Codec: TSCII} */ diff --git a/src/corelib/codecs/qt_attribution.json b/src/corelib/codecs/qt_attribution.json new file mode 100644 index 0000000000..41f644a030 --- /dev/null +++ b/src/corelib/codecs/qt_attribution.json @@ -0,0 +1,103 @@ +[ + { + "Id": "qbig5codecs", + "Name": "Text Codecs: Big5, Big5-HKSCS", + "QDocModule": "qtcore", + "QtUsage": "Used in Qt Core if ICU is not used. Configure with -icu to avoid.", + "Path": "qbig5codec.cpp", + + "Description": "The Big5 codecs (QBig5Codec, QBig5hkscsCodec) +provide conversion to and from the Big5 encodings.", + "License": "BSD 2-clause \"Simplified\" License", + "LicenseId": "BSD-2-Clause", + "LicenseFile": "QBIG5CODEC_LICENSE.txt", + "Copyright": "Copyright (C) 2000 Ming-Che Chuang +Copyright (C) 2001, 2002 James Su, Turbolinux Inc. +Copyright (C) 2002 WU Yi, HancomLinux Inc. +Copyright (C) 2001, 2002 Anthony Fok, ThizLinux Laboratory Ltd." +}, + { + "Id": "qeucjpcodec", + "Name": "Text Codec: EUC-JP", + "QDocModule": "qtcore", + "QtUsage": "Used in Qt Core if ICU is not used. Configure with -icu to avoid.", + "Path": "qeucjpcodec.cpp", + + "Description": "The EUC-JP text codec provides conversion to and from EUC-JP, +the main legacy encoding for Unix machines in Japan.", + "License": "BSD 2-clause \"Simplified\" License", + "LicenseId": "BSD-2-Clause", + "LicenseFile": "QEUCJPCODEC_LICENSE.txt", + "Copyright": "Copyright (C) 1999 Serika Kurusugawa." + }, + { + "Id": "qeuckrcodec", + "Name": "Text Codec: EUC-KR", + "QDocModule": "qtcore", + "QtUsage": "Used in Qt Core if ICU is not used. Configure with -icu to avoid.", + "Path": "qeuckrcodec.cpp", + + "Description": "The EUC-KR text codec provides conversion to and from EUC-KR, KR, +the main legacy encoding for Unix machines in Korea.", + "License": "BSD 2-clause \"Simplified\" License", + "LicenseId": "BSD-2-Clause", + "LicenseFile": "QEUCKRCODEC_LICENSE.txt", + "Copyright": "Copyright (C) 1999-2000 Mizi Research Inc." + }, + { + "Id": "qjiscodec", + "Name": "Text Codec: ISO 2022-JP (JIS)", + "QDocModule": "qtcore", + "QtUsage": "Used in Qt Core if ICU is not used. Configure with -icu to avoid.", + "Path": "qjiscodec.cpp", + + "Description": "The ISO 2022-JP (JIS) text codec provides conversion to and from ISO 2022-JP.", + "License": "BSD 2-clause \"Simplified\" License", + "LicenseId": "BSD-2-Clause", + "LicenseFile": "QJISCODEC_LICENSE.txt", + "Copyright": "Copyright (C) 1999 Serika Kurusugawa." + }, + { + "Id": "qsjiscodec", + "Name": "Text Codec: Shift-JIS", + "QDocModule": "qtcore", + "QtUsage": "Used in Qt Core if ICU is not used. Configure with -icu to avoid.", + "Path": "qsjiscodec.cpp", + + "Description": "The Shift-JIS text codec provides conversion to and from Shift-JIS.", + "License": "BSD 2-clause \"Simplified\" License", + "LicenseId": "BSD-2-Clause", + "LicenseFile": "QSJISCODEC_LICENSE.txt", + "Copyright": "Copyright (C) 1999 Serika Kurusugawa." + }, + { + "Id": "qtsciicodec", + "Name": "Text Codec: TSCII", + "QDocModule": "qtcore", + "QtUsage": "Used in Qt Core.", + "Path": "qtsciicodec.cpp", + + "Description": "The TSCII text codec provides conversion to and from the Tamil TSCII +encoding.", + "License": "BSD 2-clause \"Simplified\" License", + "LicenseId": "BSD-2-Clause", + "LicenseFile": "QTSCIICODEC_LICENSE.txt", + "Copyright": "Copyright (C) 2000 Hans Petter Bieker." + }, + { + "Id": "qbkcodec", + "Name": "Text Codec: GBK", + "QDocModule": "qtcore", + "QtUsage": "Used in Qt Core if ICU is not used. Configure with -icu to avoid.", + "Path": "qgb18030codec.cpp", + + "Description": "The GBK codec provides conversion to and from the Chinese +GB18030/GBK/GB2312 encoding.", + "License": "BSD 2-clause \"Simplified\" License", + "LicenseId": "BSD-2-Clause", + "LicenseFile": "QBKCODEC_LICENSE.txt", + "Copyright": "Copyright (C) 2000 TurboLinux, Inc. Written by Justin Yu and Sean Chen. +Copyright (C) 2001, 2002 Turbolinux, Inc. Written by James Su. +Copyright (C) 2001, 2002 ThizLinux Laboratory Ltd. Written by Anthony Fok." + } +] diff --git a/src/corelib/io/QTEMPORARYFILE_LICENSE.txt b/src/corelib/io/QTEMPORARYFILE_LICENSE.txt new file mode 100644 index 0000000000..f5f1a2e05e --- /dev/null +++ b/src/corelib/io/QTEMPORARYFILE_LICENSE.txt @@ -0,0 +1,26 @@ +Copyright (c) 1987, 1993 + The Regents of the University of California. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/src/corelib/io/qt_attribution.json b/src/corelib/io/qt_attribution.json new file mode 100644 index 0000000000..2a616a2819 --- /dev/null +++ b/src/corelib/io/qt_attribution.json @@ -0,0 +1,13 @@ +{ + "Id": "qtemporaryfile", + "Name": "Parts of QTemporaryFile", + "QDocModule": "qtcore", + "QtUsage": "Used in Qt Core. Disable the qtemporaryfile feature to avoid.", + "Path": "qtemporaryfile.cpp", + + "Description": "Generates a unique file path and returns a native handle to the open file.", + "License": "BSD 3-clause \"New\" or \"Revised\" License", + "LicenseId": "BSD-3-Clause", + "LicenseFile": "QTEMPORARYFILE_LICENSE.txt", + "Copyright": "Copyright (c) 1987, 1993 The Regents of the University of California." +} diff --git a/src/corelib/kernel/QEVENTDISPATCHER_CF_LICENSE.txt b/src/corelib/kernel/QEVENTDISPATCHER_CF_LICENSE.txt new file mode 100644 index 0000000000..8c08f48528 --- /dev/null +++ b/src/corelib/kernel/QEVENTDISPATCHER_CF_LICENSE.txt @@ -0,0 +1,29 @@ +Copyright (c) 2007-2008, Apple, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Apple, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/corelib/kernel/qt_attribution.json b/src/corelib/kernel/qt_attribution.json new file mode 100644 index 0000000000..37764a5330 --- /dev/null +++ b/src/corelib/kernel/qt_attribution.json @@ -0,0 +1,13 @@ +{ + "Id": "qeventdispatcher_cf", + "Name": "QEventDispatcher on macOS", + "QDocModule": "qtcore", + "QtUsage": "Used in Qt Core on macOS.", + "Path": "qeventdispatcher_cf_p.h", + + "Description": "Implementation of QAbstractEventDispatcher for macOS.", + "License": "BSD 3-clause \"New\" or \"Revised\" License", + "LicenseId": "BSD-3-Clause", + "LicenseFile": "QEVENTDISPATCHER_CF_LICENSE.txt", + "Copyright": "Copyright (c) 2007-2008, Apple, Inc." +} -- cgit v1.2.3 From e46cf80f8a9b3ef9b5ab46f25f947d8cf88415de Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Tue, 25 Oct 2016 16:23:55 +0200 Subject: Remove legalese text from QLocale MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The mentioned functions are now documented in src/3rdparty/freebsd. Anyhow, the license and copyright differs ... Change-Id: Ib59ace624d1d8244f591668ed05993787ca65d24 Reviewed-by: Topi Reiniö --- src/corelib/tools/qlocale.qdoc | 20 -------------------- 1 file changed, 20 deletions(-) (limited to 'src') diff --git a/src/corelib/tools/qlocale.qdoc b/src/corelib/tools/qlocale.qdoc index f4b49095df..8c5711fb5e 100644 --- a/src/corelib/tools/qlocale.qdoc +++ b/src/corelib/tools/qlocale.qdoc @@ -94,26 +94,6 @@ QLocale's data is based on Common Locale Data Repository v29. - The double-to-string and string-to-double conversion functions are - covered by the following licenses: - - \legalese - Copyright (c) 1991 by AT&T. - - Permission to use, copy, modify, and distribute this software for any - purpose without fee is hereby granted, provided that this entire notice - is included in all copies of any software which is or includes a copy - or modification of this software and in all copies of the supporting - documentation for such software. - - THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED - WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR AT&T MAKES ANY - REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY - OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. - - This product includes software developed by the University of - California, Berkeley and its contributors. - \sa QString::arg(), QString::toInt(), QString::toDouble(), QInputMethod::locale() */ -- cgit v1.2.3 From e5451f086bb9551527a4f0da06525eef860a53a9 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Thu, 27 Oct 2016 12:46:58 +0200 Subject: Document license for CLDR data in Qt Core Change-Id: I21bf76a5603f3384fccad46a16b7304380a7a444 Reviewed-by: Lars Knoll --- src/corelib/tools/CLDR_LICENSE.txt | 31 +++++++++++++++++++++++++++++++ src/corelib/tools/qt_attribution.json | 13 +++++++++++++ src/corelib/tools/qtimezone.cpp | 24 ++---------------------- 3 files changed, 46 insertions(+), 22 deletions(-) create mode 100644 src/corelib/tools/CLDR_LICENSE.txt create mode 100644 src/corelib/tools/qt_attribution.json (limited to 'src') diff --git a/src/corelib/tools/CLDR_LICENSE.txt b/src/corelib/tools/CLDR_LICENSE.txt new file mode 100644 index 0000000000..ad28161436 --- /dev/null +++ b/src/corelib/tools/CLDR_LICENSE.txt @@ -0,0 +1,31 @@ +Copyright © 1991-2016 Unicode, Inc. All rights reserved. +Distributed under the Terms of Use in http://www.unicode.org/copyright.html. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Unicode data files and any associated documentation +(the "Data Files") or Unicode software and any associated documentation +(the "Software") to deal in the Data Files or Software +without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, and/or sell copies of +the Data Files or Software, and to permit persons to whom the Data Files +or Software are furnished to do so, provided that either +(a) this copyright and permission notice appear with all copies +of the Data Files or Software, or +(b) this copyright and permission notice appear in associated +Documentation. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT OF THIRD PARTY RIGHTS. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS +NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL +DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THE DATA FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder +shall not be used in advertising or otherwise to promote the sale, +use or other dealings in these Data Files or Software without prior +written authorization of the copyright holder. diff --git a/src/corelib/tools/qt_attribution.json b/src/corelib/tools/qt_attribution.json new file mode 100644 index 0000000000..eec2cd6795 --- /dev/null +++ b/src/corelib/tools/qt_attribution.json @@ -0,0 +1,13 @@ +{ + "Id": "cldr-data", + "Name": "Unicode CLDR (Unicode Common Locale Data Repository)", + "QDocModule": "qtcore", + "QtUsage": "Used in Qt Core (QTimeZone). Disable the timezone feature to avoid.", + "Files": "qlocale_data_p.h", + + "Description": "QTimeZone includes data obtained from the CLDR data files.", + "License": "Unicode Data Files and Software License", + "LicenseId": "Unicode-TOU", + "LicenseFile": "CLDR_LICENSE.txt", + "Copyright": "Copyright (C) 1991-2016 Unicode, Inc." +} diff --git a/src/corelib/tools/qtimezone.cpp b/src/corelib/tools/qtimezone.cpp index 63a21ec75c..e423d9af0c 100644 --- a/src/corelib/tools/qtimezone.cpp +++ b/src/corelib/tools/qtimezone.cpp @@ -218,28 +218,8 @@ Q_GLOBAL_STATIC(QTimeZoneSingleton, global_tz); \section2 License This class includes data obtained from the CLDR data files under the terms - of the Unicode license. - - \legalese - COPYRIGHT AND PERMISSION NOTICE - - Copyright © 1991-2012 Unicode, Inc. All rights reserved. Distributed under - the Terms of Use in http://www.unicode.org/copyright.html. - - Permission is hereby granted, free of charge, to any person obtaining a - copy of the Unicode data files and any associated documentation (the "Data - Files") or Unicode software and any associated documentation (the "Software") - to deal in the Data Files or Software without restriction, including without - limitation the rights to use, copy, modify, merge, publish, distribute, and/or - sell copies of the Data Files or Software, and to permit persons to whom the - Data Files or Software are furnished to do so, provided that (a) the above - copyright notice(s) and this permission notice appear with all copies of the - Data Files or Software, (b) both the above copyright notice(s) and this - permission notice appear in associated documentation, and (c) there is clear - notice in each modified Data File or in the Software as well as in the - documentation associated with the Data File(s) or Software that the data or - software has been modified. - \endlegalese + of the Unicode Data Files and Software License. See + \l{Unicode CLDR (Unicode Common Locale Data Repository)} for the details. \sa QDateTime */ -- cgit v1.2.3 From dbf35d75714fac1e836e697650e32365a2a3493e Mon Sep 17 00:00:00 2001 From: Topi Reinio Date: Thu, 7 Apr 2016 11:05:04 +0200 Subject: Doc: Fix a typo in QtConcurrent example snippet And use different wording to describe QtConcurrent::filtered(), as it doesn't modify the sequence it operates on. Change-Id: I768c0d121e027c5de36ba7bd548c2d4c2a7f1bd9 Reviewed-by: Martin Smith --- .../doc/snippets/code/src_concurrent_qtconcurrentfilter.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/concurrent/doc/snippets/code/src_concurrent_qtconcurrentfilter.cpp b/src/concurrent/doc/snippets/code/src_concurrent_qtconcurrentfilter.cpp index 86ca09a421..77233bdbf7 100644 --- a/src/concurrent/doc/snippets/code/src_concurrent_qtconcurrentfilter.cpp +++ b/src/concurrent/doc/snippets/code/src_concurrent_qtconcurrentfilter.cpp @@ -103,9 +103,9 @@ QSet dictionary = QtConcurrent::blockingFilteredReduced(strings, allLow //! [7] // keep only images with an alpha channel QList images = ...; -QFuture alphaImages = QtConcurrent::filter(strings, &QImage::hasAlphaChannel); +QFuture alphaImages = QtConcurrent::filter(images, &QImage::hasAlphaChannel); -// keep only gray scale images +// retrieve gray scale images QList images = ...; QFuture grayscaleImages = QtConcurrent::filtered(images, &QImage::isGrayscale); -- cgit v1.2.3 From 4c00246fea63c348a2992f5a54499f2928bf0605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Somers?= Date: Tue, 25 Oct 2016 16:27:58 +0200 Subject: Fixed crash taking null central widget When no central widget has been set, calling takeCentralWidget should just return a null pointer instead of crashing. [ChangeLog][QtWidgets][QMainWindow] Fixed crash using takeCentralWidget when the central widget was not set. Task-number: QTBUG-56628 Change-Id: I240ccf4caa41d2716a78851571fbfbf444a4922e Reviewed-by: Giuseppe D'Angelo --- src/widgets/widgets/qmainwindow.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/widgets/widgets/qmainwindow.cpp b/src/widgets/widgets/qmainwindow.cpp index 50ba7f97ec..e454e3e991 100644 --- a/src/widgets/widgets/qmainwindow.cpp +++ b/src/widgets/widgets/qmainwindow.cpp @@ -664,8 +664,10 @@ QWidget *QMainWindow::takeCentralWidget() { Q_D(QMainWindow); QWidget *oldcentralwidget = d->layout->centralWidget(); - oldcentralwidget->setParent(0); - d->layout->setCentralWidget(0); + if (oldcentralwidget) { + oldcentralwidget->setParent(0); + d->layout->setCentralWidget(0); + } return oldcentralwidget; } -- cgit v1.2.3 From 8cd812455932f896b45aae84c4dc571f60f60b25 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 28 Oct 2016 14:11:21 +0200 Subject: Windows QPA: Do not use QSettings to access the registry When commenting out the warning in createOrOpenKey() (src\corelib\io\qsettings_win.cpp:157), applications produce warnings: QSettings: Failed to create subkey "Software\Microsoft\Windows NT\CurrentVersion\FontSubstitutes": Access is denied. indicating that an attempt to open the registry in read/write mode fails. Add a utility function to read out registry strings in read-only mode to the font database and use that instead. Change-Id: I4187344cac7ec2ba27f15b51e237575efc171853 Reviewed-by: Joerg Bornemann --- .../fontdatabases/windows/qwindowsfontdatabase.cpp | 22 ++++++++++++++++++++ .../fontdatabases/windows/qwindowsfontdatabase_p.h | 2 ++ .../windows/qwindowsfontenginedirectwrite.cpp | 9 ++++---- .../windows/accessible/qwindowsaccessibility.cpp | 24 +++++++++++----------- .../windows/accessible/qwindowsmsaaaccessible.cpp | 1 - 5 files changed, 41 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp index ad653ab95d..434aa16d16 100644 --- a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp @@ -1981,4 +1981,26 @@ int QWindowsFontDatabase::defaultVerticalDPI() return vDPI; } +QString QWindowsFontDatabase::readRegistryString(HKEY parentHandle, const wchar_t *keyPath, const wchar_t *keyName) +{ + QString result; + HKEY handle = 0; + if (RegOpenKeyEx(parentHandle, keyPath, 0, KEY_READ, &handle) == ERROR_SUCCESS) { + // get the size and type of the value + DWORD dataType; + DWORD dataSize; + if (RegQueryValueEx(handle, keyName, 0, &dataType, 0, &dataSize) == ERROR_SUCCESS) { + if (dataType == REG_SZ || dataType == REG_EXPAND_SZ) { + dataSize += 2; // '\0' missing? + QVarLengthArray data(dataSize); + data[dataSize - 2] = data[dataSize - 1] = '\0'; + if (RegQueryValueEx(handle, keyName, 0, 0, data.data(), &dataSize) == ERROR_SUCCESS) + result = QString::fromWCharArray(reinterpret_cast(data.data())); + } + } + RegCloseKey(handle); + } + return result; +} + QT_END_NAMESPACE diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h index d240f77a66..b7ebfc033f 100644 --- a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_p.h @@ -130,6 +130,8 @@ public: static void setFontOptions(unsigned options); static unsigned fontOptions(); + static QString readRegistryString(HKEY parentHandle, const wchar_t *keyPath, const wchar_t *keyName); + private: void populateFamily(const QString &familyName, bool registerAlias); void removeApplicationFonts(); diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite.cpp index a1d8c2b9e8..f266e85126 100644 --- a/src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite.cpp +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite.cpp @@ -42,7 +42,6 @@ #include "qwindowsfontenginedirectwrite_p.h" #include "qwindowsfontdatabase_p.h" -#include #include #include #include @@ -915,9 +914,11 @@ void QWindowsFontEngineDirectWrite::initFontInfo(const QFontDef &request, QString QWindowsFontEngineDirectWrite::fontNameSubstitute(const QString &familyName) { - static const char keyC[] = "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\" - "FontSubstitutes"; - return QSettings(QLatin1String(keyC), QSettings::NativeFormat).value(familyName, familyName).toString(); + const wchar_t key[] = L"Software\\Microsoft\\Windows NT\\CurrentVersion\\FontSubstitutes"; + const QString substitute = + QWindowsFontDatabase::readRegistryString(HKEY_LOCAL_MACHINE, key, + reinterpret_cast(familyName.utf16())); + return substitute.isEmpty() ? familyName : substitute; } glyph_metrics_t QWindowsFontEngineDirectWrite::alphaMapBoundingBox(glyph_t glyph, diff --git a/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp b/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp index 7cf24421f8..aed9c94003 100644 --- a/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp +++ b/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp @@ -47,13 +47,13 @@ #include #include #include -#include #include #include #include #include #include #include +#include // registry helper #include "qwindowsaccessibility.h" #ifdef Q_CC_MINGW @@ -114,6 +114,14 @@ static inline QString messageBoxAlertSound(const QObject *messageBox) return QString(); } +static QString soundFileName(const QString &soundName) +{ + const QString key = QStringLiteral("AppEvents\\Schemes\\Apps\\.Default\\") + + soundName + QStringLiteral("\\.Current"); + return QWindowsFontDatabase::readRegistryString(HKEY_CURRENT_USER, + reinterpret_cast(key.utf16()), L""); +} + void QWindowsAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event) { QString soundName; @@ -134,17 +142,9 @@ void QWindowsAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event) break; } - if (!soundName.isEmpty()) { -#ifndef QT_NO_SETTINGS - QSettings settings(QLatin1String("HKEY_CURRENT_USER\\AppEvents\\Schemes\\Apps\\.Default\\") + soundName, - QSettings::NativeFormat); - QString file = settings.value(QLatin1String(".Current/.")).toString(); -#else - QString file; -#endif - if (!file.isEmpty()) { - PlaySound(reinterpret_cast(soundName.utf16()), 0, SND_ALIAS | SND_ASYNC | SND_NODEFAULT | SND_NOWAIT); - } + if (!soundName.isEmpty() && !soundFileName(soundName).isEmpty()) { + PlaySound(reinterpret_cast(soundName.utf16()), 0, + SND_ALIAS | SND_ASYNC | SND_NODEFAULT | SND_NOWAIT); } // An event has to be associated with a window, diff --git a/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp b/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp index ff115a2249..9803dedb1e 100644 --- a/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp +++ b/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp @@ -50,7 +50,6 @@ #include #include #include -#include #include #include #include -- cgit v1.2.3 From 4039568837919fa3e172a71950b235fcf1ddedc7 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 27 Oct 2016 09:17:54 +0200 Subject: Direct2d: Add missing dependency to platformsupport's accessibility Change-Id: I620370bb5f4bbac11c1e5740c706e0cb64d9d407 Reviewed-by: Joerg Bornemann --- src/plugins/platforms/direct2d/direct2d.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/plugins/platforms/direct2d/direct2d.pro b/src/plugins/platforms/direct2d/direct2d.pro index c30703720c..224f122fc4 100644 --- a/src/plugins/platforms/direct2d/direct2d.pro +++ b/src/plugins/platforms/direct2d/direct2d.pro @@ -2,7 +2,7 @@ TARGET = qdirect2d QT += \ core-private gui-private \ - eventdispatcher_support-private \ + eventdispatcher_support-private accessibility_support-private \ fontdatabase_support-private theme_support-private LIBS += -ldwmapi -ld2d1 -ld3d11 -ldwrite -lVersion -lgdi32 -- cgit v1.2.3 From f2f39946d2911fe1157d3f71094cc7acf06e2f46 Mon Sep 17 00:00:00 2001 From: Liang Qi Date: Fri, 28 Oct 2016 11:57:38 +0200 Subject: Fix a mis-merge in af0d0b9 "-framework AudioToolbox" was lost. Task-number: QTBUG-56784 Change-Id: Ibd536c53e7e1456077559c021a70407339f33971 Reviewed-by: Richard Moe Gustavsen --- src/plugins/platforms/ios/kernel.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/plugins/platforms/ios/kernel.pro b/src/plugins/platforms/ios/kernel.pro index d8235ee011..955f8d9642 100644 --- a/src/plugins/platforms/ios/kernel.pro +++ b/src/plugins/platforms/ios/kernel.pro @@ -1,7 +1,7 @@ TARGET = qios QT += core-private gui-private platformsupport-private -LIBS += -framework Foundation -framework UIKit -framework QuartzCore +LIBS += -framework Foundation -framework UIKit -framework QuartzCore -framework AudioToolbox OBJECTIVE_SOURCES = \ plugin.mm \ -- cgit v1.2.3 From 56734cdf3383837f1fd59f2a0e8b0f39fcce71f3 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Fri, 30 Sep 2016 11:53:07 +0200 Subject: QFileSystemModel: improve readability of the renaming code Instead of calling QHash::value(), inserting the return value into the hash with a different name and only many lines later removing the old node, do the extraction into a QScopedPointer, and the insertion into the hash from the QScopedPoiner, keeping the node update in between the two. Avoids the double-lookup of 'oldName', makes it clearer what's going on, and limits the potential for some return between the insertion under the new name and the removal under the old one sneaking in, which would cause a double-delete later in the dtor. Change-Id: Ia2d1cca77c04708421ccb5e594729ec83de85345 Reviewed-by: Edward Welbourne --- src/widgets/dialogs/qfilesystemmodel.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/widgets/dialogs/qfilesystemmodel.cpp b/src/widgets/dialogs/qfilesystemmodel.cpp index 6e1bee94c4..db1ce3fe0e 100644 --- a/src/widgets/dialogs/qfilesystemmodel.cpp +++ b/src/widgets/dialogs/qfilesystemmodel.cpp @@ -904,16 +904,14 @@ bool QFileSystemModel::setData(const QModelIndex &idx, const QVariant &value, in int visibleLocation = parentNode->visibleLocation(parentNode->children.value(indexNode->fileName)->fileName); parentNode->visibleChildren.removeAt(visibleLocation); - QFileSystemModelPrivate::QFileSystemNode * oldValue = parentNode->children.value(oldName); - parentNode->children[newName] = oldValue; - oldValue->fileName = newName; - oldValue->parent = parentNode; + QScopedPointer nodeToRename(parentNode->children.take(oldName)); + nodeToRename->fileName = newName; + nodeToRename->parent = parentNode; #ifndef QT_NO_FILESYSTEMWATCHER - oldValue->populate(d->fileInfoGatherer.getInfo(QFileInfo(parentPath, newName))); + nodeToRename->populate(d->fileInfoGatherer.getInfo(QFileInfo(parentPath, newName))); #endif - oldValue->isVisible = true; - - parentNode->children.remove(oldName); + nodeToRename->isVisible = true; + parentNode->children[newName] = nodeToRename.take(); parentNode->visibleChildren.insert(visibleLocation, newName); d->delayedSort(); -- cgit v1.2.3 From f9ec707e4960bf7d5298ee2ba8f22d7506ef54a7 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Tue, 18 Oct 2016 10:56:11 -0700 Subject: windows: Disable OpenGL proper on Intel 945 Change-Id: I77fbf5bafcd6b0fe5040513ef6b0d049600f9b33 Task-number: QTBUG-40991 Reviewed-by: Friedemann Kleint --- src/plugins/platforms/windows/openglblacklists/default.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'src') diff --git a/src/plugins/platforms/windows/openglblacklists/default.json b/src/plugins/platforms/windows/openglblacklists/default.json index 1e00da52eb..dd99e674ec 100644 --- a/src/plugins/platforms/windows/openglblacklists/default.json +++ b/src/plugins/platforms/windows/openglblacklists/default.json @@ -102,6 +102,18 @@ "features": [ "disable_desktopgl", "disable_d3d11", "disable_d3d9" ] + }, + { + "id": 9, + "description": "Intel 945 crash (QTBUG-40991)", + "vendor_id": "0x8086", + "device_id": [ "0x27A2" ], + "os": { + "type": "win" + }, + "features": [ + "disable_desktopgl" + ] } ] } -- cgit v1.2.3 From ca5d4137aa352d61d796c82b06e2d8f19a07cf10 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Thu, 27 Oct 2016 12:37:02 +0200 Subject: minimalegl: Reorder includes to avoid EGL native type clashes Some of the qminimaleglscreen.h includes are not even necessary. With the inclusion of egl.h (or qt_egl_p.h in 5.7 and up) isolated to this header, all we need to ensure is that the sources that include it place the include at a suitable place. This is not the only possible solution, there are alternatives (each with its own caveat), but this is likely the least intrusive. Task-number: QTBUG-56559 Change-Id: I17db031c8e401d9895a417ba3568ad1e4ba30f72 Reviewed-by: Louai Al-Khanji --- src/plugins/platforms/minimalegl/qminimaleglintegration.cpp | 3 ++- src/plugins/platforms/minimalegl/qminimaleglintegration.h | 2 -- src/plugins/platforms/minimalegl/qminimaleglwindow.h | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/minimalegl/qminimaleglintegration.cpp b/src/plugins/platforms/minimalegl/qminimaleglintegration.cpp index 1bcb22618e..5328a8b353 100644 --- a/src/plugins/platforms/minimalegl/qminimaleglintegration.cpp +++ b/src/plugins/platforms/minimalegl/qminimaleglintegration.cpp @@ -52,7 +52,8 @@ #include #include -#include +// this is where EGL headers are pulled in, make sure it is last +#include "qminimaleglscreen.h" QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/minimalegl/qminimaleglintegration.h b/src/plugins/platforms/minimalegl/qminimaleglintegration.h index 7a2c23ced4..8ceeb7b193 100644 --- a/src/plugins/platforms/minimalegl/qminimaleglintegration.h +++ b/src/plugins/platforms/minimalegl/qminimaleglintegration.h @@ -34,8 +34,6 @@ #ifndef QMINIMALEGLINTEGRATION_H #define QMINIMALEGLINTEGRATION_H -#include "qminimaleglscreen.h" - #include #include diff --git a/src/plugins/platforms/minimalegl/qminimaleglwindow.h b/src/plugins/platforms/minimalegl/qminimaleglwindow.h index ba7f999602..4edeaf4da9 100644 --- a/src/plugins/platforms/minimalegl/qminimaleglwindow.h +++ b/src/plugins/platforms/minimalegl/qminimaleglwindow.h @@ -35,7 +35,6 @@ #define QMINIMALEGLWINDOW_H #include "qminimaleglintegration.h" -#include "qminimaleglscreen.h" #include -- cgit v1.2.3 From 694702e09d9b17d91db282784f009178cfb1059b Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Fri, 14 Oct 2016 15:37:19 +0200 Subject: Mark the entire widget dirty when changing flush paths This augments 2a7cee47e5e84c73e32a6953e145771196645f1a Task-number: QTBUG-56534 Task-number: QTBUG-54241 Change-Id: I635478c43e353b0e435d3ac30e4cc608a5a2a6a5 Reviewed-by: Friedemann Kleint Reviewed-by: Paul Olav Tvete --- src/widgets/kernel/qwidgetbackingstore.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/widgets/kernel/qwidgetbackingstore.cpp b/src/widgets/kernel/qwidgetbackingstore.cpp index 557e71014e..e00dbaba14 100644 --- a/src/widgets/kernel/qwidgetbackingstore.cpp +++ b/src/widgets/kernel/qwidgetbackingstore.cpp @@ -106,6 +106,7 @@ void QWidgetBackingStore::qt_flush(QWidget *widget, const QRegion ®ion, QBack if (widget != tlw) offset += widget->mapTo(tlw, QPoint()); + QRegion effectiveRegion = region; #ifndef QT_NO_OPENGL const bool compositionWasActive = widget->d_func()->renderToTextureComposeActive; if (!widgetTextures) { @@ -119,6 +120,11 @@ void QWidgetBackingStore::qt_flush(QWidget *widget, const QRegion ®ion, QBack } else { widget->d_func()->renderToTextureComposeActive = true; } + // When changing the composition status, make sure the dirty region covers + // the entire widget. Just having e.g. the shown/hidden render-to-texture + // widget's area marked as dirty is incorrect when changing flush paths. + if (compositionWasActive != widget->d_func()->renderToTextureComposeActive) + effectiveRegion = widget->rect(); // re-test since we may have been forced to this path via the dummy texture list above if (widgetTextures) { @@ -130,12 +136,12 @@ void QWidgetBackingStore::qt_flush(QWidget *widget, const QRegion ®ion, QBack const bool translucentBackground = widget->testAttribute(Qt::WA_TranslucentBackground); // Use the tlw's context, not widget's. The difference is important with native child // widgets where tlw != widget. - backingStore->handle()->composeAndFlush(widget->windowHandle(), region, offset, widgetTextures, + backingStore->handle()->composeAndFlush(widget->windowHandle(), effectiveRegion, offset, widgetTextures, tlw->d_func()->shareContext(), translucentBackground); widget->window()->d_func()->sendComposeStatus(widget->window(), true); } else #endif - backingStore->flush(region, widget->windowHandle(), offset); + backingStore->flush(effectiveRegion, widget->windowHandle(), offset); } #ifndef QT_NO_PAINT_DEBUG -- cgit v1.2.3 From cd9de59177ccbeb7fdfacf8716af7bb20112c880 Mon Sep 17 00:00:00 2001 From: Liang Qi Date: Mon, 31 Oct 2016 11:15:17 +0100 Subject: Revert "Deduplication fetchTransformed" A merge from 5.7 with this change will trigger a compiler crash on gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6) on Linux RHEL_7_2 (gcc-x86_64). This reverts commit eeb03fbf262e2a4790579c2100930799b0866057. Task-number: QTBUG-56817 Change-Id: I143fdf43e0530d68d627718c515c2063630bd920 Reviewed-by: Olivier Goffart (Woboq GmbH) Reviewed-by: Eirik Aavitsland --- src/gui/painting/qdrawhelper.cpp | 185 +++++++++++++++++++++++++++++---------- 1 file changed, 137 insertions(+), 48 deletions(-) (limited to 'src') diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index 928a56fd2f..2716d92d13 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -836,10 +836,7 @@ static const uint *QT_FASTCALL convertGrayscale8FromARGB32PM(uint *buffer, const } template static -uint QT_FASTCALL fetchPixel(const uchar *, int) -{ - Q_UNREACHABLE(); -} +uint QT_FASTCALL fetchPixel(const uchar *src, int index); template <> inline uint QT_FASTCALL fetchPixel(const uchar *src, int index) @@ -1557,11 +1554,92 @@ static const QRgba64 *QT_FASTCALL fetchUntransformed64(QRgba64 *buffer, const Op } } -template +// blendType is either BlendTransformed or BlendTransformedTiled +template +static const uint *QT_FASTCALL fetchTransformedARGB32PM(uint *buffer, const Operator *, const QSpanData *data, + int y, int x, int length) +{ + int image_width = data->texture.width; + int image_height = data->texture.height; + + const qreal cx = x + qreal(0.5); + const qreal cy = y + qreal(0.5); + + const uint *end = buffer + length; + uint *b = buffer; + if (data->fast_matrix) { + // The increment pr x in the scanline + int fdx = (int)(data->m11 * fixed_scale); + int fdy = (int)(data->m12 * fixed_scale); + + int fx = int((data->m21 * cy + + data->m11 * cx + data->dx) * fixed_scale); + int fy = int((data->m22 * cy + + data->m12 * cx + data->dy) * fixed_scale); + + while (b < end) { + int px = fx >> 16; + int py = fy >> 16; + + if (blendType == BlendTransformedTiled) { + px %= image_width; + py %= image_height; + if (px < 0) px += image_width; + if (py < 0) py += image_height; + } else { + px = qBound(0, px, image_width - 1); + py = qBound(0, py, image_height - 1); + } + *b = reinterpret_cast(data->texture.scanLine(py))[px]; + + fx += fdx; + fy += fdy; + ++b; + } + } else { + const qreal fdx = data->m11; + const qreal fdy = data->m12; + const qreal fdw = data->m13; + + qreal fx = data->m21 * cy + data->m11 * cx + data->dx; + qreal fy = data->m22 * cy + data->m12 * cx + data->dy; + qreal fw = data->m23 * cy + data->m13 * cx + data->m33; + + while (b < end) { + const qreal iw = fw == 0 ? 1 : 1 / fw; + const qreal tx = fx * iw; + const qreal ty = fy * iw; + int px = int(tx) - (tx < 0); + int py = int(ty) - (ty < 0); + + if (blendType == BlendTransformedTiled) { + px %= image_width; + py %= image_height; + if (px < 0) px += image_width; + if (py < 0) py += image_height; + } else { + px = qBound(0, px, image_width - 1); + py = qBound(0, py, image_height - 1); + } + *b = reinterpret_cast(data->texture.scanLine(py))[px]; + + fx += fdx; + fy += fdy; + fw += fdw; + //force increment to avoid /0 + if (!fw) { + fw += fdw; + } + ++b; + } + } + return buffer; +} + +template /* either BlendTransformed or BlendTransformedTiled */ static const uint *QT_FASTCALL fetchTransformed(uint *buffer, const Operator *, const QSpanData *data, int y, int x, int length) { - Q_STATIC_ASSERT(blendType == BlendTransformed || blendType == BlendTransformedTiled); int image_width = data->texture.width; int image_height = data->texture.height; @@ -1569,12 +1647,9 @@ static const uint *QT_FASTCALL fetchTransformed(uint *buffer, const Operator *, const qreal cy = y + qreal(0.5); const QPixelLayout *layout = &qPixelLayouts[data->texture.format]; - if (bpp != QPixelLayout::BPPNone) // Like this to not ICE on GCC 5.3.1 - Q_ASSERT(layout->bpp == bpp); - // When templated 'fetch' should be inlined at compile time: - const FetchPixelFunc fetch = (bpp == QPixelLayout::BPPNone) ? qFetchPixel[layout->bpp] : fetchPixel; + FetchPixelFunc fetch = qFetchPixel[layout->bpp]; - uint *const end = buffer + length; + const uint *end = buffer + length; uint *b = buffer; if (data->fast_matrix) { // The increment pr x in the scanline @@ -2510,17 +2585,12 @@ static const uint * QT_FASTCALL fetchTransformedBilinearARGB32PM(uint *buffer, c } // blendType = BlendTransformedBilinear or BlendTransformedBilinearTiled -template +template static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Operator *, const QSpanData *data, int y, int x, int length) { const QPixelLayout *layout = &qPixelLayouts[data->texture.format]; const QVector *clut = data->texture.colorTable; - if (bpp != QPixelLayout::BPPNone) // Like this to not ICE on GCC 5.3.1 - Q_ASSERT(layout->bpp == bpp); - // When templated 'fetch' should be inlined at compile time: - const FetchPixelsFunc fetch = (bpp == QPixelLayout::BPPNone) ? qFetchPixels[layout->bpp] : fetchPixels; - const FetchPixelFunc fetch1 = (bpp == QPixelLayout::BPPNone) ? qFetchPixel[layout->bpp] : fetchPixel; int image_width = data->texture.width; int image_height = data->texture.height; @@ -2558,6 +2628,7 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper // The idea is first to do the interpolation between the row s1 and the row s2 // into an intermediate buffer, then we interpolate between two pixel of this buffer. + FetchPixelsFunc fetch = qFetchPixels[layout->bpp]; // +1 for the last pixel to interpolate with, and +1 for rounding errors. uint buf1[buffer_size + 2]; uint buf2[buffer_size + 2]; @@ -2646,6 +2717,7 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper fx += fdx; } } else { + FetchPixelFunc fetch = qFetchPixel[layout->bpp]; uint buf1[buffer_size]; uint buf2[buffer_size]; uint *b = buffer; @@ -2656,10 +2728,19 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper int x1 = (fx >> 16); int x2; fetchTransformedBilinear_pixelBounds(image_width, image_x1, image_x2, x1, x2); - buf1[i * 2 + 0] = fetch1(s1, x1); - buf1[i * 2 + 1] = fetch1(s1, x2); - buf2[i * 2 + 0] = fetch1(s2, x1); - buf2[i * 2 + 1] = fetch1(s2, x2); + + if (layout->bpp == QPixelLayout::BPP32) { + buf1[i * 2 + 0] = ((const uint*)s1)[x1]; + buf1[i * 2 + 1] = ((const uint*)s1)[x2]; + buf2[i * 2 + 0] = ((const uint*)s2)[x1]; + buf2[i * 2 + 1] = ((const uint*)s2)[x2]; + } else { + buf1[i * 2 + 0] = fetch(s1, x1); + buf1[i * 2 + 1] = fetch(s1, x2); + buf2[i * 2 + 0] = fetch(s2, x1); + buf2[i * 2 + 1] = fetch(s2, x2); + } + fx += fdx; } layout->convertToARGB32PM(buf1, buf1, len * 2, clut, 0); @@ -2689,6 +2770,7 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper } } } else { //rotation + FetchPixelFunc fetch = qFetchPixel[layout->bpp]; uint buf1[buffer_size]; uint buf2[buffer_size]; uint *b = buffer; @@ -2707,10 +2789,19 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper const uchar *s1 = data->texture.scanLine(y1); const uchar *s2 = data->texture.scanLine(y2); - buf1[i * 2 + 0] = fetch1(s1, x1); - buf1[i * 2 + 1] = fetch1(s1, x2); - buf2[i * 2 + 0] = fetch1(s2, x1); - buf2[i * 2 + 1] = fetch1(s2, x2); + + if (layout->bpp == QPixelLayout::BPP32) { + buf1[i * 2 + 0] = ((const uint*)s1)[x1]; + buf1[i * 2 + 1] = ((const uint*)s1)[x2]; + buf2[i * 2 + 0] = ((const uint*)s2)[x1]; + buf2[i * 2 + 1] = ((const uint*)s2)[x2]; + } else { + buf1[i * 2 + 0] = fetch(s1, x1); + buf1[i * 2 + 1] = fetch(s1, x2); + buf2[i * 2 + 0] = fetch(s2, x1); + buf2[i * 2 + 1] = fetch(s2, x2); + } + fx += fdx; fy += fdy; } @@ -2757,6 +2848,7 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper qreal fy = data->m22 * cy + data->m12 * cx + data->dy; qreal fw = data->m23 * cy + data->m13 * cx + data->m33; + FetchPixelFunc fetch = qFetchPixel[layout->bpp]; uint buf1[buffer_size]; uint buf2[buffer_size]; uint *b = buffer; @@ -2784,10 +2876,18 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper const uchar *s1 = data->texture.scanLine(y1); const uchar *s2 = data->texture.scanLine(y2); - buf1[i * 2 + 0] = fetch1(s1, x1); - buf1[i * 2 + 1] = fetch1(s1, x2); - buf2[i * 2 + 0] = fetch1(s2, x1); - buf2[i * 2 + 1] = fetch1(s2, x2); + + if (layout->bpp == QPixelLayout::BPP32) { + buf1[i * 2 + 0] = ((const uint*)s1)[x1]; + buf1[i * 2 + 1] = ((const uint*)s1)[x2]; + buf2[i * 2 + 0] = ((const uint*)s2)[x1]; + buf2[i * 2 + 1] = ((const uint*)s2)[x2]; + } else { + buf1[i * 2 + 0] = fetch(s1, x1); + buf1[i * 2 + 1] = fetch(s1, x2); + buf2[i * 2 + 0] = fetch(s2, x1); + buf2[i * 2 + 1] = fetch(s2, x2); + } fx += fdx; fy += fdy; @@ -3193,32 +3293,23 @@ static SourceFetchProc sourceFetchUntransformed[QImage::NImageFormats] = { }; static const SourceFetchProc sourceFetchGeneric[NBlendTypes] = { - fetchUntransformed, // Untransformed - fetchUntransformed, // Tiled - fetchTransformed, // Transformed - fetchTransformed, // TransformedTiled - fetchTransformedBilinear, // TransformedBilinear - fetchTransformedBilinear // TransformedBilinearTiled + fetchUntransformed, // Untransformed + fetchUntransformed, // Tiled + fetchTransformed, // Transformed + fetchTransformed, // TransformedTiled + fetchTransformedBilinear, // Bilinear + fetchTransformedBilinear // BilinearTiled }; static SourceFetchProc sourceFetchARGB32PM[NBlendTypes] = { fetchUntransformedARGB32PM, // Untransformed fetchUntransformedARGB32PM, // Tiled - fetchTransformed, // Transformed - fetchTransformed, // TransformedTiled + fetchTransformedARGB32PM, // Transformed + fetchTransformedARGB32PM, // TransformedTiled fetchTransformedBilinearARGB32PM, // Bilinear fetchTransformedBilinearARGB32PM // BilinearTiled }; -static SourceFetchProc sourceFetchAny32[NBlendTypes] = { - fetchUntransformed, // Untransformed - fetchUntransformed, // Tiled - fetchTransformed, // Transformed - fetchTransformed, // TransformedTiled - fetchTransformedBilinear, // TransformedBilinear - fetchTransformedBilinear // TransformedBilinearTiled -}; - static const SourceFetchProc64 sourceFetchGeneric64[NBlendTypes] = { fetchUntransformed64, // Untransformed fetchUntransformed64, // Tiled @@ -3234,8 +3325,6 @@ static inline SourceFetchProc getSourceFetch(TextureBlendType blendType, QImage: return sourceFetchARGB32PM[blendType]; if (blendType == BlendUntransformed || blendType == BlendTiled) return sourceFetchUntransformed[format]; - if (qPixelLayouts[format].bpp == QPixelLayout::BPP32) - return sourceFetchAny32[blendType]; return sourceFetchGeneric[blendType]; } -- cgit v1.2.3