Merge remote-tracking branch 'origin/5.13' into dev

Change-Id: I1c9449ab064deed1367a7e5dbedfcb489f28140e
This commit is contained in:
Qt Forward Merge Bot 2019-04-27 01:00:10 +02:00
commit 03f7d0a005
21 changed files with 228 additions and 75 deletions

View File

@ -62,28 +62,27 @@
*/
/*!
\externalpage http://www.cmake.org/cmake/help/v2.8.11/cmake.html#command:find_package
\externalpage https://cmake.org/cmake/help/latest/command/find_package.html
\title CMake find_package Documentation
*/
/*!
\externalpage http://www.cmake.org/cmake/help/v2.8.11/cmake.html#prop_tgt:AUTOMOC
\externalpage https://cmake.org/cmake/help/latest/manual/cmake-qt.7.html#automoc
\title CMake AUTOMOC Documentation
*/
/*!
\externalpage http://www.cmake.org/cmake/help/v2.8.11/cmake.html#prop_tgt:LOCATION
\externalpage https://cmake.org/cmake/help/latest/prop_tgt/LOCATION.html
\title CMake LOCATION Documentation
*/
/*!
\externalpage http://www.cmake.org/cmake/help/v2.8.11/cmake.html#prop_tgt:POSITION_INDEPENDENT_CODE
\externalpage https://cmake.org/cmake/help/latest/prop_tgt/POSITION_INDEPENDENT_CODE.html
\title CMake POSITION_INDEPENDENT_CODE Documentation
*/
/*!
\externalpage http://www.cmake.org/cmake/help/v2.8.11/cmake.html#command:target_link_libraries
\externalpage https://cmake.org/cmake/help/latest/command/target_link_libraries.html
\title CMake target_link_libraries Documentation
*/

View File

@ -267,9 +267,13 @@ isEmpty($${target_prefix}.INCDIRS) {
for (line, output) {
contains(line, "^libraries: .*") {
line ~= s,^libraries: ,,
# clang (7.x) on Windows uses the wrong path list separator ...
equals(QMAKE_HOST.os, Windows): line ~= s,:(?![/\\\\]),;,
paths = $$split(line, $$QMAKE_DIRLIST_SEP)
equals(QMAKE_HOST.os, Windows) {
# clang (7.x) on Windows uses the wrong path list separator ...
line ~= s,:(?![/\\\\]),;,
paths = $$split(line, ;)
} else {
paths = $$split(line, $$QMAKE_DIRLIST_SEP)
}
for (path, paths): \
QMAKE_DEFAULT_LIBDIRS += $$clean_path($$replace(path, ^=, $$[SYSROOT]))
}

View File

@ -1105,6 +1105,8 @@
\header \li Option \li Description
\row \li app_bundle \li Puts the executable into a bundle (this is the default).
\row \li lib_bundle \li Puts the library into a library bundle.
\row \li plugin_bundle \li Puts the plugin into a plugin bundle. This value
is not supported by the Xcode project generator.
\endtable
The build process for bundles is also influenced by

View File

@ -203,10 +203,13 @@ static CborError preparse_value(CborValue *it)
it->extra = 0;
/* read up to 16 bits into it->extra */
if (bytesNeeded <= 2) {
if (bytesNeeded == 1) {
uint8_t extra;
read_bytes_unchecked(it, &extra, 1, bytesNeeded);
it->extra = extra;
} else if (bytesNeeded == 2) {
read_bytes_unchecked(it, &it->extra, 1, bytesNeeded);
if (bytesNeeded == 2)
it->extra = cbor_ntohs(it->extra);
it->extra = cbor_ntohs(it->extra);
} else {
cbor_static_assert(CborIteratorFlag_IntegerValueTooLarge == (Value32Bit & 3));
cbor_static_assert((CborIteratorFlag_IntegerValueIs64Bit |

View File

@ -45,6 +45,7 @@
#include "qsharedpointer.h"
#include "qvector.h"
#include "qthread.h"
#include "qcoreapplication.h"
#include <QtCore/qrunnable.h>
#include <deque>
@ -474,6 +475,17 @@ void QtAndroidPrivate::runOnAndroidThread(const QtAndroidPrivate::Runnable &runn
env->CallStaticVoidMethod(g_jNativeClass, g_runPendingCppRunnablesMethodID);
}
static bool waitForSemaphore(int timeoutMs, QSharedPointer<QSemaphore> sem)
{
while (timeoutMs > 0) {
if (sem->tryAcquire(1, 10))
return true;
timeoutMs -= 10;
QCoreApplication::processEvents();
}
return false;
}
void QtAndroidPrivate::runOnAndroidThreadSync(const QtAndroidPrivate::Runnable &runnable, JNIEnv *env, int timeoutMs)
{
QSharedPointer<QSemaphore> sem(new QSemaphore);
@ -481,7 +493,7 @@ void QtAndroidPrivate::runOnAndroidThreadSync(const QtAndroidPrivate::Runnable &
runnable();
sem->release();
}, env);
sem->tryAcquire(1, timeoutMs);
waitForSemaphore(timeoutMs, sem);
}
void QtAndroidPrivate::requestPermissions(JNIEnv *env, const QStringList &permissions, const QtAndroidPrivate::PermissionsResultFunc &callbackFunc, bool directCall)
@ -524,7 +536,7 @@ QtAndroidPrivate::PermissionsHash QtAndroidPrivate::requestPermissionsSync(JNIEn
*res = result;
sem->release();
}, true);
if (sem->tryAcquire(1, timeoutMs))
if (waitForSemaphore(timeoutMs, sem))
return std::move(*res);
else // mustn't touch *res
return QHash<QString, QtAndroidPrivate::PermissionsResult>();

View File

@ -767,7 +767,7 @@ void QRasterPaintEngine::updatePen(const QPen &pen)
s->flags.fast_pen = pen_style > Qt::NoPen
&& s->penData.blend
&& ((cosmetic && penWidth <= 1)
|| (!cosmetic && s->flags.tx_noshear && penWidth * s->txscale <= 1));
|| (!cosmetic && (s->flags.tx_noshear || !s->flags.antialiased) && penWidth * s->txscale <= 1));
s->flags.non_complex_pen = qpen_capStyle(s->lastPen) <= Qt::SquareCap && s->flags.tx_noshear;

View File

@ -1148,6 +1148,8 @@ void QDashStroker::processCurrentSubpath()
QSubpathFlatIterator it(&m_elements, m_dashThreshold);
qfixed2d prev = it.next();
if (!prev.isFinite())
return;
bool clipping = !m_clip_rect.isEmpty();
qfixed2d move_to_pos = prev;
@ -1163,6 +1165,8 @@ void QDashStroker::processCurrentSubpath()
bool hasMoveTo = false;
while (it.hasNext()) {
QStrokerOps::Element e = it.next();
if (!qfixed2d(e).isFinite())
continue;
Q_ASSERT(e.isLineTo());
cline = QLineF(qt_fixed_to_real(prev.x),

View File

@ -104,6 +104,7 @@ struct qfixed2d
qfixed x;
qfixed y;
bool isFinite() { return qIsFinite(x) && qIsFinite(y); }
bool operator==(const qfixed2d &other) const { return qFuzzyCompare(x, other.x)
&& qFuzzyCompare(y, other.y); }
};

View File

@ -261,6 +261,10 @@ static RoleMapping map[] = {
//: Role of an accessible object
{ QAccessible::ComplementaryContent, ATSPI_ROLE_SECTION, QT_TRANSLATE_NOOP("QSpiAccessibleBridge", "complementary content") },
//: Role of an accessible object
{ QAccessible::Terminal, ATSPI_ROLE_TERMINAL, QT_TRANSLATE_NOOP("QSpiAccessibleBridge", "terminal") },
//: Role of an accessible object
{ QAccessible::Desktop, ATSPI_ROLE_DESKTOP_FRAME, QT_TRANSLATE_NOOP("QSpiAccessibleBridge", "desktop") },
//: Role of an accessible object
{ QAccessible::UserRole, ATSPI_ROLE_UNKNOWN, QT_TRANSLATE_NOOP("QSpiAccessibleBridge", "unknown") }
};
@ -268,6 +272,12 @@ void QSpiAccessibleBridge::initializeConstantMappings()
{
for (uint i = 0; i < sizeof(map) / sizeof(RoleMapping); ++i)
qSpiRoleMapping.insert(map[i].role, RoleNames(map[i].spiRole, QLatin1String(map[i].name), tr(map[i].name)));
// -1 because we have button duplicated, as PushButton and Button.
Q_ASSERT_X(qSpiRoleMapping.size() ==
QAccessible::staticMetaObject.enumerator(
QAccessible::staticMetaObject.indexOfEnumerator("Role")).keyCount() - 1,
"", "Handle all QAccessible::Role members in qSpiRoleMapping");
}
QT_END_NAMESPACE

View File

@ -523,17 +523,21 @@ QImage ICOReader::iconAt(int index)
if (!image.isNull()) {
readBMP(image);
if (!image.isNull()) {
QImage mask(image.width(), image.height(), QImage::Format_Mono);
if (!mask.isNull()) {
mask.setColorCount(2);
mask.setColor(0, qRgba(255,255,255,0xff));
mask.setColor(1, qRgba(0 ,0 ,0 ,0xff));
read1BitBMP(mask);
if (icoAttrib.depth == 32) {
img = std::move(image).convertToFormat(QImage::Format_ARGB32_Premultiplied);
} else {
QImage mask(image.width(), image.height(), QImage::Format_Mono);
if (!mask.isNull()) {
img = image;
img.setAlphaChannel(mask);
// (Luckily, it seems that setAlphaChannel() does not ruin the alpha values
// of partially transparent pixels in those icons that have that)
mask.setColorCount(2);
mask.setColor(0, qRgba(255,255,255,0xff));
mask.setColor(1, qRgba(0 ,0 ,0 ,0xff));
read1BitBMP(mask);
if (!mask.isNull()) {
img = image;
img.setAlphaChannel(mask);
// (Luckily, it seems that setAlphaChannel() does not ruin the alpha values
// of partially transparent pixels in those icons that have that)
}
}
}
}

View File

@ -40,6 +40,7 @@
#include <QtCore/QCoreApplication>
#include <QtGui/QKeyEvent>
#include <QtGui/QGuiApplication>
#include <locale.h>
@ -121,7 +122,14 @@ bool QComposeInputContext::filterEvent(const QEvent *event)
QInputMethodEvent event;
event.setCommitString(composedText);
QCoreApplication::sendEvent(m_focusObject, &event);
if (!m_focusObject && qApp)
m_focusObject = qApp->focusObject();
if (m_focusObject)
QCoreApplication::sendEvent(m_focusObject, &event);
else
qCWarning(lcXkbCompose, "no focus object");
reset();
return true;

View File

@ -776,7 +776,7 @@ int QWasmEventTranslator::handleTouch(int eventType, const EmscriptenTouchEvent
QWindowSystemInterface::handleTouchCancelEvent(window2, getTimestamp(), touchDevice, keyModifier);
QWasmEventDispatcher::maintainTimers();
return 0;
return 1;
}
quint64 QWasmEventTranslator::getTimestamp()

View File

@ -447,6 +447,42 @@ static const int toolButtonArrowMargin = 2;
static const qreal focusRingWidth = 3.5;
// An application can force 'Aqua' theme while the system theme is one of
// the 'Dark' variants. Since in Qt we sometimes use NSControls and even
// NSCells directly without attaching them to any view hierarchy, we have
// to set NSAppearance.currentAppearance to 'Aqua' manually, to make sure
// the correct rendering path is triggered. Apple recommends us to un-set
// the current appearance back after we finished with drawing. This is what
// AppearanceSync is for.
class AppearanceSync {
public:
AppearanceSync()
{
#if QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_14)
if (QOperatingSystemVersion::current() >= QOperatingSystemVersion::MacOSMojave
&& !qt_mac_applicationIsInDarkMode()) {
auto requiredAppearanceName = NSApplication.sharedApplication.effectiveAppearance.name;
if (![NSAppearance.currentAppearance.name isEqualToString:requiredAppearanceName]) {
previous = NSAppearance.currentAppearance;
NSAppearance.currentAppearance = [NSAppearance appearanceNamed:requiredAppearanceName];
}
}
#endif // QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_14)
}
~AppearanceSync()
{
if (previous)
NSAppearance.currentAppearance = previous;
}
private:
NSAppearance *previous = nil;
Q_DISABLE_COPY(AppearanceSync)
};
static bool setupScroller(NSScroller *scroller, const QStyleOptionSlider *sb)
{
const qreal length = sb->maximum - sb->minimum + sb->pageStep;
@ -2918,6 +2954,7 @@ void QMacStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, QPai
const QWidget *w) const
{
Q_D(const QMacStyle);
const AppearanceSync appSync;
QMacCGContext cg(p);
QWindow *window = w && w->window() ? w->window()->windowHandle() : nullptr;
d->resolveCurrentNSView(window);
@ -3443,6 +3480,7 @@ void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter
const QWidget *w) const
{
Q_D(const QMacStyle);
const AppearanceSync sync;
QMacCGContext cg(p);
QWindow *window = w && w->window() ? w->window()->windowHandle() : nullptr;
d->resolveCurrentNSView(window);
@ -5033,6 +5071,7 @@ void QMacStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComplex
const QWidget *widget) const
{
Q_D(const QMacStyle);
const AppearanceSync sync;
QMacCGContext cg(p);
QWindow *window = widget && widget->window() ? widget->window()->windowHandle() : nullptr;
d->resolveCurrentNSView(window);

View File

@ -900,7 +900,7 @@ bool readInputFile(Options *options)
options->extraPlugins = extraPlugins.toString().split(QLatin1Char(','));
}
if (!options->auxMode) {
{
const QJsonValue stdcppPath = jsonObject.value(QStringLiteral("stdcpp-path"));
if (stdcppPath.isUndefined()) {
fprintf(stderr, "No stdcpp-path defined in json file.\n");

View File

@ -1200,7 +1200,10 @@ void PaintCommands::command_drawRoundRect(QRegularExpressionMatch re)
if (m_verboseMode)
printf(" -(lance) drawRoundRect(%d, %d, %d, %d, [%d, %d])\n", x, y, w, h, xs, ys);
QT_WARNING_PUSH
QT_WARNING_DISABLE_DEPRECATED
m_painter->drawRoundRect(x, y, w, h, xs, ys);
QT_WARNING_POP
}
/***************************************************************************************************/

View File

@ -0,0 +1,79 @@
# Version: 1
# CheckVsReference: 5%
drawRect 0 0 800 800
path_addRect p 0 0 75 75
path_addEllipse p 25 25 75 75
translate -500 -500
begin_block drawing
save
drawLine 0 0 100 100
translate 0 100
drawPath p
translate 0 110
drawRect 0 0 100 100
translate 0 110
drawPolyline [0 0 100 0 50 50]
drawPoint 40 40
drawPoint 41 40
drawPoint 42 40
drawPoint 43 40
drawPoint 44 40
drawPoint 45 40
drawPoint 46 40
drawPoint 47 40
drawPoint 48 40
drawPoint 49 40
drawPoint 50 40
restore
end_block
begin_block univsnonuni
save
save
scale 0.7 0.7
repeat_block drawing
restore
translate 100 0
save
scale 0.7 0.8
repeat_block drawing
restore
restore
end_block
resetMatrix
translate 20.5 20.5
begin_block row
save
repeat_block univsnonuni
translate 240 0
save
rotate 10
repeat_block univsnonuni
restore
translate 220 0
save
rotate_y 30
repeat_block univsnonuni
restore
restore
end_block
translate 0 320
setRenderHint AntiAliasing
repeat_block row

View File

@ -9,3 +9,5 @@ b2qt
ubuntu
b2qt
windows
rhel
suse-leap

View File

@ -45,7 +45,7 @@ InteractiveWidget::InteractiveWidget()
// create and populate the command toolbox
m_commandsToolBox = new QToolBox();
QListWidget *currentListWidget = 0;
QListWidget *currentListWidget = nullptr;
foreach (PaintCommands::PaintCommandInfos paintCommandInfo, PaintCommands::s_commandInfoTable) {
if (paintCommandInfo.isSectionHeader()) {
currentListWidget = new QListWidget();

View File

@ -185,7 +185,7 @@ static void displayCommands()
" pixmap_load filename name_in_script\n"
" image_load filename name_in_script\n");
}
static InteractiveWidget *interactive_widget = 0;
static InteractiveWidget *interactive_widget = nullptr;
static void runInteractive()
{
@ -350,15 +350,15 @@ int main(int argc, char **argv)
#endif
}
}
scaledWidth = width * scalefactor;
scaledHeight = height * scalefactor;
scaledWidth = int(width * scalefactor);
scaledHeight = int(height * scalefactor);
PaintCommands pcmd(QStringList(), 800, 800, imageFormat);
pcmd.setVerboseMode(verboseMode);
pcmd.setType(type);
pcmd.setCheckersBackground(checkers_background);
QWidget *activeWidget = 0;
QWidget *activeWidget = nullptr;
if (interactive) {
runInteractive();
@ -610,7 +610,7 @@ int main(int argc, char **argv)
QPrinter p(highres ? QPrinter::HighResolution : QPrinter::ScreenResolution);
if (printdlg) {
QPrintDialog printDialog(&p, 0);
QPrintDialog printDialog(&p, nullptr);
if (printDialog.exec() != QDialog::Accepted)
break;
} else {

View File

@ -45,31 +45,12 @@
#include <QPaintEngine>
#include <QSignalMapper>
#include <QAction>
#include <QDebug>
#include <qmath.h>
const int CP_RADIUS = 10;
class StupidWorkaround : public QObject
{
Q_OBJECT
public:
StupidWorkaround(QWidget *widget, int *value)
: QObject(widget), w(widget), mode(value)
{
}
public slots:
void setViewMode(int m) {
*mode = m;
w->update();
}
private:
QWidget *w;
int *mode;
};
template <class T>
class OnScreenWidget : public T
{
@ -81,7 +62,7 @@ public:
DifferenceView
};
OnScreenWidget(const QString &file, QWidget *parent = 0)
OnScreenWidget(const QString &file, QWidget *parent = nullptr)
: T(parent),
m_filename(file),
m_view_mode(RenderView)
@ -108,33 +89,20 @@ public:
} else {
T::setWindowTitle("Rendering: '" + file + "'. Shortcuts: 1=render, 2=baseline, 3=difference");
StupidWorkaround *workaround = new StupidWorkaround(this, &m_view_mode);
QSignalMapper *mapper = new QSignalMapper(this);
T::connect(mapper, SIGNAL(mapped(int)), workaround, SLOT(setViewMode(int)));
T::connect(mapper, SIGNAL(mapped(QString)), this, SLOT(setWindowTitle(QString)));
QAction *renderViewAction = new QAction("Render View", this);
renderViewAction->setShortcut(Qt::Key_1);
T::connect(renderViewAction, SIGNAL(triggered()), mapper, SLOT(map()));
mapper->setMapping(renderViewAction, RenderView);
mapper->setMapping(renderViewAction, "Render View: " + file);
T::connect(renderViewAction, &QAction::triggered, [&] { setMode(RenderView); });
T::addAction(renderViewAction);
QAction *baselineAction = new QAction("Baseline", this);
baselineAction->setShortcut(Qt::Key_2);
T::connect(baselineAction, SIGNAL(triggered()), mapper, SLOT(map()));
mapper->setMapping(baselineAction, BaselineView);
mapper->setMapping(baselineAction, "Baseline View: " + file);
T::connect(baselineAction, &QAction::triggered, [&] { setMode(BaselineView); });
T::addAction(baselineAction);
QAction *differenceAction = new QAction("Differenfe View", this);
QAction *differenceAction = new QAction("Difference View", this);
differenceAction->setShortcut(Qt::Key_3);
T::connect(differenceAction, SIGNAL(triggered()), mapper, SLOT(map()));
mapper->setMapping(differenceAction, DifferenceView);
mapper->setMapping(differenceAction, "Difference View" + file);
T::connect(differenceAction, &QAction::triggered, [&] { setMode(DifferenceView); });
T::addAction(differenceAction);
}
}
@ -148,6 +116,18 @@ public:
settings.sync();
}
void setMode(ViewMode mode) {
m_view_mode = mode;
QString title;
switch (m_view_mode) {
case RenderView: title = "Render"; break;
case BaselineView: title = "Baseline"; break;
case DifferenceView: title = "Difference"; break;
}
T::setWindowTitle(title + " View: " + m_filename);
T::update();
}
void setVerboseMode(bool v) { m_verboseMode = v; }
void setCheckersBackground(bool b) { m_checkersBackground = b; }
void setType(DeviceType t) { m_deviceType = t; }
@ -205,7 +185,7 @@ public:
pt.begin(this);
pt.setRenderHint(QPainter::Antialiasing);
pt.setFont(this->font());
pt.resetMatrix();
pt.resetTransform();
pt.setPen(QColor(127, 127, 127, 191));
pt.setBrush(QColor(191, 191, 255, 63));
for (int i=0; i<m_controlPoints.size(); ++i) {
@ -239,7 +219,7 @@ public:
p.drawPixmap(0, 0, m_baseline);
p.setPen(QColor::fromRgb(0, 0, 0, 0.1));
p.setPen(QColor::fromRgbF(0, 0, 0, 0.1));
p.setFont(QFont("Arial", 128));
p.rotate(45);
p.drawText(100, 0, "BASELINE");
@ -251,7 +231,7 @@ public:
img.fill(0);
QPainter p(&img);
p.drawPixmap(0, 0, m_render_view);
p.drawImage(0, 0, m_image);
p.setCompositionMode(QPainter::RasterOp_SourceXorDestination);
p.drawPixmap(0, 0, m_baseline);

View File

@ -108,6 +108,7 @@ void ShortcutTester::setupLayout()
Qt::ControlModifier + Qt::Key_5, Qt::AltModifier + Qt::Key_5,
Qt::ControlModifier + Qt::Key_Plus,
Qt::ControlModifier + Qt::ShiftModifier + Qt::Key_Plus,
Qt::ControlModifier + Qt::ShiftModifier + Qt::Key_Equal,
Qt::ControlModifier + Qt::Key_Y, Qt::ShiftModifier + Qt::Key_Comma,
Qt::ControlModifier + Qt::Key_Comma, Qt::ControlModifier + Qt::Key_Slash,
Qt::ControlModifier + Qt::Key_Backslash
@ -121,6 +122,8 @@ void ShortcutTester::setupLayout()
const int keys3[] = {
Qt::MetaModifier + Qt::ShiftModifier + Qt::Key_A,
Qt::MetaModifier + Qt::Key_A,
Qt::MetaModifier + Qt::Key_Q,
Qt::MetaModifier + Qt::ShiftModifier + Qt::Key_5,
Qt::ControlModifier + Qt::Key_BracketRight,
Qt::ShiftModifier + Qt::Key_F3,