summaryrefslogtreecommitdiffstats
path: root/src/gui
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/doc/qtgui.qdocconf1
-rw-r--r--src/gui/image/qpixmap.cpp2
-rw-r--r--src/gui/itemmodels/qstandarditemmodel.cpp11
-rw-r--r--src/gui/kernel/qevent.cpp9
-rw-r--r--src/gui/kernel/qevent.h2
-rw-r--r--src/gui/kernel/qhighdpiscaling_p.h2
-rw-r--r--src/gui/kernel/qplatformwindow.cpp5
-rw-r--r--src/gui/kernel/qscreen.cpp15
-rw-r--r--src/gui/kernel/qshortcutmap.cpp4
-rw-r--r--src/gui/kernel/qwindow.cpp6
-rw-r--r--src/gui/kernel/qwindowsysteminterface.h12
-rw-r--r--src/gui/kernel/qwindowsysteminterface_p.h2
-rw-r--r--src/gui/painting/qdrawhelper.cpp4
-rw-r--r--src/gui/painting/qdrawhelper_p.h2
-rw-r--r--src/gui/painting/qdrawhelper_ssse3.cpp57
-rw-r--r--src/gui/text/qcssparser.cpp2
-rw-r--r--src/gui/text/qtextdocument_p.cpp2
17 files changed, 115 insertions, 23 deletions
diff --git a/src/gui/doc/qtgui.qdocconf b/src/gui/doc/qtgui.qdocconf
index e34347b801..027d2663de 100644
--- a/src/gui/doc/qtgui.qdocconf
+++ b/src/gui/doc/qtgui.qdocconf
@@ -33,6 +33,7 @@ depends += \
qtmultimedia \
qtnetwork \
qtopengl \
+ qtplatformheaders \
qtsvg \
qtqml \
qtquick \
diff --git a/src/gui/image/qpixmap.cpp b/src/gui/image/qpixmap.cpp
index cabcf656c3..09d23c0084 100644
--- a/src/gui/image/qpixmap.cpp
+++ b/src/gui/image/qpixmap.cpp
@@ -487,7 +487,7 @@ QMatrix QPixmap::trueMatrix(const QMatrix &m, int w, int h)
bool QPixmap::isQBitmap() const
{
- return data->type == QPlatformPixmap::BitmapType;
+ return data && data->type == QPlatformPixmap::BitmapType;
}
/*!
diff --git a/src/gui/itemmodels/qstandarditemmodel.cpp b/src/gui/itemmodels/qstandarditemmodel.cpp
index 479a4283b0..9b0c6163b4 100644
--- a/src/gui/itemmodels/qstandarditemmodel.cpp
+++ b/src/gui/itemmodels/qstandarditemmodel.cpp
@@ -57,6 +57,11 @@
QT_BEGIN_NAMESPACE
+static inline QString qStandardItemModelDataListMimeType()
+{
+ return QStringLiteral("application/x-qstandarditemmodeldatalist");
+}
+
class QStandardItemModelLessThan
{
public:
@@ -2977,7 +2982,7 @@ void QStandardItemModel::sort(int column, Qt::SortOrder order)
*/
QStringList QStandardItemModel::mimeTypes() const
{
- return QAbstractItemModel::mimeTypes() << QLatin1String("application/x-qstandarditemmodeldatalist");
+ return QAbstractItemModel::mimeTypes() << qStandardItemModelDataListMimeType();
}
/*!
@@ -2989,7 +2994,7 @@ QMimeData *QStandardItemModel::mimeData(const QModelIndexList &indexes) const
if(!data)
return 0;
- QString format = QLatin1String("application/x-qstandarditemmodeldatalist");
+ const QString format = qStandardItemModelDataListMimeType();
if (!mimeTypes().contains(format))
return data;
QByteArray encoded;
@@ -3084,7 +3089,7 @@ bool QStandardItemModel::dropMimeData(const QMimeData *data, Qt::DropAction acti
if (!data || !(action == Qt::CopyAction || action == Qt::MoveAction))
return false;
// check if the format is supported
- QString format = QLatin1String("application/x-qstandarditemmodeldatalist");
+ const QString format = qStandardItemModelDataListMimeType();
if (!data->hasFormat(format))
return QAbstractItemModel::dropMimeData(data, action, row, column, parent);
diff --git a/src/gui/kernel/qevent.cpp b/src/gui/kernel/qevent.cpp
index d84cbeddf2..34387d95d8 100644
--- a/src/gui/kernel/qevent.cpp
+++ b/src/gui/kernel/qevent.cpp
@@ -733,7 +733,8 @@ QHoverEvent::~QHoverEvent()
QWheelEvent::QWheelEvent(const QPointF &pos, int delta,
Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers,
Qt::Orientation orient)
- : QInputEvent(Wheel, modifiers), p(pos), qt4D(delta), qt4O(orient), mouseState(buttons)
+ : QInputEvent(Wheel, modifiers), p(pos), qt4D(delta), qt4O(orient), mouseState(buttons),
+ ph(Qt::NoScrollPhase), src(Qt::MouseEventNotSynthesized)
{
g = QCursor::pos();
if (orient == Qt::Vertical)
@@ -767,7 +768,8 @@ QWheelEvent::~QWheelEvent()
QWheelEvent::QWheelEvent(const QPointF &pos, const QPointF& globalPos, int delta,
Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers,
Qt::Orientation orient)
- : QInputEvent(Wheel, modifiers), p(pos), g(globalPos), qt4D(delta), qt4O(orient), mouseState(buttons)
+ : QInputEvent(Wheel, modifiers), p(pos), g(globalPos), qt4D(delta), qt4O(orient), mouseState(buttons),
+ ph(Qt::NoScrollPhase), src(Qt::MouseEventNotSynthesized)
{
if (orient == Qt::Vertical)
angleD = QPoint(0, delta);
@@ -803,7 +805,8 @@ QWheelEvent::QWheelEvent(const QPointF &pos, const QPointF& globalPos,
QPoint pixelDelta, QPoint angleDelta, int qt4Delta, Qt::Orientation qt4Orientation,
Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers)
: QInputEvent(Wheel, modifiers), p(pos), g(globalPos), pixelD(pixelDelta),
- angleD(angleDelta), qt4D(qt4Delta), qt4O(qt4Orientation), mouseState(buttons), ph(Qt::ScrollUpdate)
+ angleD(angleDelta), qt4D(qt4Delta), qt4O(qt4Orientation), mouseState(buttons), ph(Qt::NoScrollPhase),
+ src(Qt::MouseEventNotSynthesized)
{}
/*!
diff --git a/src/gui/kernel/qevent.h b/src/gui/kernel/qevent.h
index eca5e6951d..2f31566b23 100644
--- a/src/gui/kernel/qevent.h
+++ b/src/gui/kernel/qevent.h
@@ -224,6 +224,8 @@ protected:
uint ph : 2;
uint src: 2;
int reserved : 28;
+
+ friend class QApplication;
};
#endif
diff --git a/src/gui/kernel/qhighdpiscaling_p.h b/src/gui/kernel/qhighdpiscaling_p.h
index a48ad3180d..a871fe0024 100644
--- a/src/gui/kernel/qhighdpiscaling_p.h
+++ b/src/gui/kernel/qhighdpiscaling_p.h
@@ -168,7 +168,7 @@ inline QRect toNative(const QRect &rect, qreal scaleFactor, const QPoint &origin
inline QRect fromNative(const QRect &rect, const QScreen *screen, const QPoint &screenOrigin)
{
- return toNative(rect, QHighDpiScaling::factor(screen), screenOrigin);
+ return fromNative(rect, QHighDpiScaling::factor(screen), screenOrigin);
}
inline QRect fromNativeScreenGeometry(const QRect &nativeScreenGeometry, const QScreen *screen)
diff --git a/src/gui/kernel/qplatformwindow.cpp b/src/gui/kernel/qplatformwindow.cpp
index 1d444f94c9..347d02d616 100644
--- a/src/gui/kernel/qplatformwindow.cpp
+++ b/src/gui/kernel/qplatformwindow.cpp
@@ -492,8 +492,9 @@ QPlatformScreen *QPlatformWindow::screenForGeometry(const QRect &newGeometry) co
QPlatformScreen *fallback = currentScreen;
// QRect::center can return a value outside the rectangle if it's empty.
// Apply mapToGlobal() in case it is a foreign/embedded window.
- const QPoint center =
- mapToGlobal(newGeometry.isEmpty() ? newGeometry.topLeft() : newGeometry.center());
+ QPoint center = newGeometry.isEmpty() ? newGeometry.topLeft() : newGeometry.center();
+ if (window()->type() == Qt::ForeignWindow)
+ center = mapToGlobal(center - newGeometry.topLeft());
if (!parent() && currentScreen && !currentScreen->geometry().contains(center)) {
const auto screens = currentScreen->virtualSiblings();
diff --git a/src/gui/kernel/qscreen.cpp b/src/gui/kernel/qscreen.cpp
index 0e17b2d803..bc4a25a65f 100644
--- a/src/gui/kernel/qscreen.cpp
+++ b/src/gui/kernel/qscreen.cpp
@@ -46,6 +46,7 @@
#include <QtCore/QDebug>
#include <QtCore/private/qobject_p.h>
+#include "qhighdpiscaling_p.h"
QT_BEGIN_NAMESPACE
@@ -692,7 +693,19 @@ QPixmap QScreen::grabWindow(WId window, int x, int y, int width, int height)
qWarning("invoked with handle==0");
return QPixmap();
}
- return platformScreen->grabWindow(window, x, y, width, height);
+ const qreal factor = QHighDpiScaling::factor(this);
+ if (qFuzzyCompare(factor, 1))
+ return platformScreen->grabWindow(window, x, y, width, height);
+
+ const QPoint nativePos = QHighDpi::toNative(QPoint(x, y), factor);
+ QSize nativeSize(width, height);
+ if (nativeSize.isValid())
+ nativeSize = QHighDpi::toNative(nativeSize, factor);
+ QPixmap result =
+ platformScreen->grabWindow(window, nativePos.x(), nativePos.y(),
+ nativeSize.width(), nativeSize.height());
+ result.setDevicePixelRatio(factor);
+ return result;
}
#ifndef QT_NO_DEBUG_STREAM
diff --git a/src/gui/kernel/qshortcutmap.cpp b/src/gui/kernel/qshortcutmap.cpp
index 5eb216d58e..3b40aba49e 100644
--- a/src/gui/kernel/qshortcutmap.cpp
+++ b/src/gui/kernel/qshortcutmap.cpp
@@ -375,7 +375,7 @@ QKeySequence::SequenceMatch QShortcutMap::nextState(QKeyEvent *e)
QKeySequence::SequenceMatch result = QKeySequence::NoMatch;
// We start fresh each time..
- d->identicals.resize(0);
+ d->identicals.clear();
result = find(e);
if (result == QKeySequence::NoMatch && (e->modifiers() & Qt::KeypadModifier)) {
@@ -448,7 +448,7 @@ QKeySequence::SequenceMatch QShortcutMap::find(QKeyEvent *e, int ignoredModifier
}
// Looking for new identicals, scrap old
- d->identicals.resize(0);
+ d->identicals.clear();
bool partialFound = false;
bool identicalDisabledFound = false;
diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp
index 44fa88e7cf..f43ef43c6c 100644
--- a/src/gui/kernel/qwindow.cpp
+++ b/src/gui/kernel/qwindow.cpp
@@ -1002,7 +1002,7 @@ QRegion QWindow::mask() const
/*!
Requests the window to be activated, i.e. receive keyboard focus.
- \sa isActive(), QGuiApplication::focusWindow()
+ \sa isActive(), QGuiApplication::focusWindow(), QWindowsWindowFunctions::setWindowActivationBehavior()
*/
void QWindow::requestActivate()
{
@@ -2335,7 +2335,7 @@ QPoint QWindow::mapToGlobal(const QPoint &pos) const
// QTBUG-43252, prefer platform implementation for foreign windows.
if (d->platformWindow
&& (type() == Qt::ForeignWindow || d->platformWindow->isEmbedded())) {
- return d->platformWindow->mapToGlobal(pos);
+ return QHighDpi::fromNativeLocalPosition(d->platformWindow->mapToGlobal(QHighDpi::toNativeLocalPosition(pos, this)), this);
}
return pos + d->globalPosition();
}
@@ -2355,7 +2355,7 @@ QPoint QWindow::mapFromGlobal(const QPoint &pos) const
// QTBUG-43252, prefer platform implementation for foreign windows.
if (d->platformWindow
&& (type() == Qt::ForeignWindow || d->platformWindow->isEmbedded())) {
- return d->platformWindow->mapFromGlobal(pos);
+ return QHighDpi::fromNativeLocalPosition(d->platformWindow->mapFromGlobal(QHighDpi::toNativeLocalPosition(pos, this)), this);
}
return pos - d->globalPosition();
}
diff --git a/src/gui/kernel/qwindowsysteminterface.h b/src/gui/kernel/qwindowsysteminterface.h
index 0aec2cec07..66a4afb085 100644
--- a/src/gui/kernel/qwindowsysteminterface.h
+++ b/src/gui/kernel/qwindowsysteminterface.h
@@ -100,8 +100,16 @@ public:
quint32 nativeModifiers,
const QString& text = QString(), bool autorep = false,
ushort count = 1, bool tryShortcutOverride = true);
- static void handleWheelEvent(QWindow *w, const QPointF & local, const QPointF & global, QPoint pixelDelta, QPoint angleDelta, Qt::KeyboardModifiers mods = Qt::NoModifier, Qt::ScrollPhase phase = Qt::ScrollUpdate, Qt::MouseEventSource source = Qt::MouseEventNotSynthesized);
- static void handleWheelEvent(QWindow *w, ulong timestamp, const QPointF & local, const QPointF & global, QPoint pixelDelta, QPoint angleDelta, Qt::KeyboardModifiers mods = Qt::NoModifier, Qt::ScrollPhase phase = Qt::ScrollUpdate, Qt::MouseEventSource source = Qt::MouseEventNotSynthesized);
+ static void handleWheelEvent(QWindow *w, const QPointF & local, const QPointF & global,
+ QPoint pixelDelta, QPoint angleDelta,
+ Qt::KeyboardModifiers mods = Qt::NoModifier,
+ Qt::ScrollPhase phase = Qt::NoScrollPhase,
+ Qt::MouseEventSource source = Qt::MouseEventNotSynthesized);
+ static void handleWheelEvent(QWindow *w, ulong timestamp, const QPointF & local, const QPointF & global,
+ QPoint pixelDelta, QPoint angleDelta,
+ Qt::KeyboardModifiers mods = Qt::NoModifier,
+ Qt::ScrollPhase phase = Qt::NoScrollPhase,
+ Qt::MouseEventSource source = Qt::MouseEventNotSynthesized);
// Wheel event compatibility functions. Will be removed: do not use.
static void handleWheelEvent(QWindow *w, const QPointF & local, const QPointF & global, int d, Qt::Orientation o, Qt::KeyboardModifiers mods = Qt::NoModifier);
diff --git a/src/gui/kernel/qwindowsysteminterface_p.h b/src/gui/kernel/qwindowsysteminterface_p.h
index 35e036dc62..523aa984a9 100644
--- a/src/gui/kernel/qwindowsysteminterface_p.h
+++ b/src/gui/kernel/qwindowsysteminterface_p.h
@@ -242,7 +242,7 @@ public:
class WheelEvent : public InputEvent {
public:
WheelEvent(QWindow *w, ulong time, const QPointF & local, const QPointF & global, QPoint pixelD, QPoint angleD, int qt4D, Qt::Orientation qt4O,
- Qt::KeyboardModifiers mods, Qt::ScrollPhase phase = Qt::ScrollUpdate, Qt::MouseEventSource src = Qt::MouseEventNotSynthesized)
+ Qt::KeyboardModifiers mods, Qt::ScrollPhase phase = Qt::NoScrollPhase, Qt::MouseEventSource src = Qt::MouseEventNotSynthesized)
: InputEvent(w, time, Wheel, mods), pixelDelta(pixelD), angleDelta(angleD), qt4Delta(qt4D), qt4Orientation(qt4O), localPos(local), globalPos(global), phase(phase), source(src) { }
QPoint pixelDelta;
QPoint angleDelta;
diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp
index 1143123717..112dbd4738 100644
--- a/src/gui/painting/qdrawhelper.cpp
+++ b/src/gui/painting/qdrawhelper.cpp
@@ -961,7 +961,7 @@ const FetchPixelsFunc qFetchPixels[QPixelLayout::BPPCount] = {
fetchPixels<QPixelLayout::BPP32> // BPP32
};
-const StorePixelsFunc qStorePixels[QPixelLayout::BPPCount] = {
+StorePixelsFunc qStorePixels[QPixelLayout::BPPCount] = {
0, // BPPNone
storePixels<QPixelLayout::BPP1MSB>, // BPP1MSB
storePixels<QPixelLayout::BPP1LSB>, // BPP1LSB
@@ -6375,10 +6375,12 @@ static void qInitDrawhelperFunctions()
int w, int h,
int const_alpha);
+ extern void QT_FASTCALL storePixelsBPP24_ssse3(uchar *dest, const uint *src, int index, int count);
qBlendFunctions[QImage::Format_RGB32][QImage::Format_ARGB32_Premultiplied] = qt_blend_argb32_on_argb32_ssse3;
qBlendFunctions[QImage::Format_ARGB32_Premultiplied][QImage::Format_ARGB32_Premultiplied] = qt_blend_argb32_on_argb32_ssse3;
qBlendFunctions[QImage::Format_RGBX8888][QImage::Format_RGBA8888_Premultiplied] = qt_blend_argb32_on_argb32_ssse3;
qBlendFunctions[QImage::Format_RGBA8888_Premultiplied][QImage::Format_RGBA8888_Premultiplied] = qt_blend_argb32_on_argb32_ssse3;
+ qStorePixels[QPixelLayout::BPP24] = storePixelsBPP24_ssse3;
}
#endif // SSSE3
diff --git a/src/gui/painting/qdrawhelper_p.h b/src/gui/painting/qdrawhelper_p.h
index af52ed0b43..21af6039f8 100644
--- a/src/gui/painting/qdrawhelper_p.h
+++ b/src/gui/painting/qdrawhelper_p.h
@@ -1213,7 +1213,7 @@ typedef void (QT_FASTCALL *StorePixelsFunc)(uchar *dest, const uint *src, int in
extern QPixelLayout qPixelLayouts[QImage::NImageFormats];
extern const FetchPixelsFunc qFetchPixels[QPixelLayout::BPPCount];
-extern const StorePixelsFunc qStorePixels[QPixelLayout::BPPCount];
+extern StorePixelsFunc qStorePixels[QPixelLayout::BPPCount];
diff --git a/src/gui/painting/qdrawhelper_ssse3.cpp b/src/gui/painting/qdrawhelper_ssse3.cpp
index 09b25d30fd..e0d1bac6b1 100644
--- a/src/gui/painting/qdrawhelper_ssse3.cpp
+++ b/src/gui/painting/qdrawhelper_ssse3.cpp
@@ -176,6 +176,63 @@ void qt_blend_argb32_on_argb32_ssse3(uchar *destPixels, int dbpl,
}
}
+static inline void store_uint24_ssse3(uchar *dst, const uint *src, int len)
+{
+ int i = 0;
+
+ quint24 *dst24 = reinterpret_cast<quint24*>(dst);
+ // Align dst on 16 bytes
+ for (; i < len && (reinterpret_cast<quintptr>(dst24) & 0xf); ++i)
+ *dst24++ = quint24(*src++);
+
+ // Shuffle masks for first and second half of every output, all outputs are aligned so the shuffled ends are not used.
+ const __m128i shuffleMask1 = _mm_setr_epi8(char(0x80), char(0x80), char(0x80), char(0x80), 2, 1, 0, 6, 5, 4, 10, 9, 8, 14, 13, 12);
+ const __m128i shuffleMask2 = _mm_setr_epi8(2, 1, 0, 6, 5, 4, 10, 9, 8, 14, 13, 12, char(0x80), char(0x80), char(0x80), char(0x80));
+
+ const __m128i *inVectorPtr = (const __m128i *)src;
+ __m128i *dstVectorPtr = (__m128i *)dst24;
+
+ for (; i < (len - 15); i += 16) {
+ // Load four vectors, store three.
+ // Create each output vector by combining two shuffled input vectors.
+ __m128i srcVector1 = _mm_loadu_si128(inVectorPtr);
+ ++inVectorPtr;
+ __m128i srcVector2 = _mm_loadu_si128(inVectorPtr);
+ ++inVectorPtr;
+ __m128i outputVector1 = _mm_shuffle_epi8(srcVector1, shuffleMask1);
+ __m128i outputVector2 = _mm_shuffle_epi8(srcVector2, shuffleMask2);
+ __m128i outputVector = _mm_alignr_epi8(outputVector2, outputVector1, 4);
+ _mm_store_si128(dstVectorPtr, outputVector);
+ ++dstVectorPtr;
+
+ srcVector1 = _mm_loadu_si128(inVectorPtr);
+ ++inVectorPtr;
+ outputVector1 = _mm_shuffle_epi8(srcVector2, shuffleMask1);
+ outputVector2 = _mm_shuffle_epi8(srcVector1, shuffleMask2);
+ outputVector = _mm_alignr_epi8(outputVector2, outputVector1, 8);
+ _mm_store_si128(dstVectorPtr, outputVector);
+ ++dstVectorPtr;
+
+ srcVector2 = _mm_loadu_si128(inVectorPtr);
+ ++inVectorPtr;
+ outputVector1 = _mm_shuffle_epi8(srcVector1, shuffleMask1);
+ outputVector2 = _mm_shuffle_epi8(srcVector2, shuffleMask2);
+ outputVector = _mm_alignr_epi8(outputVector2, outputVector1, 12);
+ _mm_store_si128(dstVectorPtr, outputVector);
+ ++dstVectorPtr;
+ }
+ dst24 = reinterpret_cast<quint24*>(dstVectorPtr);
+ src = reinterpret_cast<const uint*>(inVectorPtr);
+
+ for (; i < len; ++i)
+ *dst24++ = quint24(*src++);
+}
+
+void QT_FASTCALL storePixelsBPP24_ssse3(uchar *dest, const uint *src, int index, int count)
+{
+ store_uint24_ssse3(dest + index * 3, src, count);
+}
+
QT_END_NAMESPACE
#endif // QT_COMPILER_SUPPORTS_SSSE3
diff --git a/src/gui/text/qcssparser.cpp b/src/gui/text/qcssparser.cpp
index fceb11959a..b9e05e726e 100644
--- a/src/gui/text/qcssparser.cpp
+++ b/src/gui/text/qcssparser.cpp
@@ -2166,7 +2166,7 @@ void Parser::init(const QString &css, bool isFile)
}
hasEscapeSequences = false;
- symbols.resize(0);
+ symbols.clear();
symbols.reserve(8);
Scanner::scan(Scanner::preprocess(styleSheet, &hasEscapeSequences), &symbols);
index = 0;
diff --git a/src/gui/text/qtextdocument_p.cpp b/src/gui/text/qtextdocument_p.cpp
index 348fa83756..93071aaf59 100644
--- a/src/gui/text/qtextdocument_p.cpp
+++ b/src/gui/text/qtextdocument_p.cpp
@@ -1128,7 +1128,7 @@ void QTextDocumentPrivate::clearUndoRedoStacks(QTextDocument::Stacks stacksToCle
delete c.custom;
}
undoState = 0;
- undoStack.resize(0);
+ undoStack.clear();
if (emitSignals && undoCommandsAvailable)
emitUndoAvailable(false);
if (emitSignals && redoCommandsAvailable)