Merge "Merge remote-tracking branch 'origin/stable' into dev" into refs/staging/dev
This commit is contained in:
commit
7ac97d7efb
7
dist/changes-5.2.0
vendored
7
dist/changes-5.2.0
vendored
@ -768,3 +768,10 @@ X11
|
|||||||
* [QTBUG-34392][MSVS] Fixed /SAFESEH:NO with VS2010+.
|
* [QTBUG-34392][MSVS] Fixed /SAFESEH:NO with VS2010+.
|
||||||
* [QTBUG-34357][MSVS] Fixed breakage with multiple VS versions in PATH.
|
* [QTBUG-34357][MSVS] Fixed breakage with multiple VS versions in PATH.
|
||||||
* [MSVS] Fixed sub-project dependency generation.
|
* [MSVS] Fixed sub-project dependency generation.
|
||||||
|
|
||||||
|
- moc
|
||||||
|
* Porting moc to QCommandLineParser has changed one specific option in its
|
||||||
|
command line handling: using the -f option without argument
|
||||||
|
is not supported anymore (it wasn't necessary, since including the header
|
||||||
|
file is the default behavior).
|
||||||
|
|
||||||
|
@ -7,8 +7,6 @@ SOURCES = main.cpp \
|
|||||||
widgetgallery.cpp
|
widgetgallery.cpp
|
||||||
RESOURCES = styles.qrc
|
RESOURCES = styles.qrc
|
||||||
|
|
||||||
REQUIRES += "contains(styles, windows)"
|
|
||||||
|
|
||||||
# install
|
# install
|
||||||
target.path = $$[QT_INSTALL_EXAMPLES]/widgets/widgets/styles
|
target.path = $$[QT_INSTALL_EXAMPLES]/widgets/widgets/styles
|
||||||
INSTALLS += target
|
INSTALLS += target
|
||||||
|
@ -16,6 +16,7 @@ SUBDIRS = analogclock \
|
|||||||
shapedclock \
|
shapedclock \
|
||||||
sliders \
|
sliders \
|
||||||
spinboxes \
|
spinboxes \
|
||||||
|
styles \
|
||||||
stylesheet \
|
stylesheet \
|
||||||
tablet \
|
tablet \
|
||||||
tetrix \
|
tetrix \
|
||||||
@ -23,5 +24,3 @@ SUBDIRS = analogclock \
|
|||||||
validators \
|
validators \
|
||||||
wiggly \
|
wiggly \
|
||||||
windowflags
|
windowflags
|
||||||
|
|
||||||
contains(styles, windows): SUBDIRS += styles
|
|
||||||
|
@ -45,7 +45,8 @@ QMAKE_CXXFLAGS_SHLIB = $$QMAKE_CFLAGS_SHLIB
|
|||||||
QMAKE_CXXFLAGS_STATIC_LIB = $$QMAKE_CFLAGS_STATIC_LIB
|
QMAKE_CXXFLAGS_STATIC_LIB = $$QMAKE_CFLAGS_STATIC_LIB
|
||||||
QMAKE_CXXFLAGS_YACC = $$QMAKE_CFLAGS_YACC
|
QMAKE_CXXFLAGS_YACC = $$QMAKE_CFLAGS_YACC
|
||||||
QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD
|
QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD
|
||||||
QMAKE_CXXFLAGS_EXCEPTIONS_OFF = -fno-exceptions
|
# Disabling exceptions disabled - workaround for QTBUG-36577
|
||||||
|
#QMAKE_CXXFLAGS_EXCEPTIONS_OFF = -fno-exceptions
|
||||||
QMAKE_CXXFLAGS_CXX11 = -std=c++0x
|
QMAKE_CXXFLAGS_CXX11 = -std=c++0x
|
||||||
|
|
||||||
QMAKE_INCDIR =
|
QMAKE_INCDIR =
|
||||||
|
@ -870,7 +870,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
#define Q_FOREACH(variable, container) \
|
#define Q_FOREACH(variable, container) \
|
||||||
for (QForeachContainer<__typeof__(container)> _container_(container); \
|
for (QForeachContainer<__typeof__((container))> _container_((container)); \
|
||||||
!_container_.brk && _container_.i != _container_.e; \
|
!_container_.brk && _container_.i != _container_.e; \
|
||||||
__extension__ ({ ++_container_.brk; ++_container_.i; })) \
|
__extension__ ({ ++_container_.brk; ++_container_.i; })) \
|
||||||
for (variable = *_container_.i;; __extension__ ({--_container_.brk; break;}))
|
for (variable = *_container_.i;; __extension__ ({--_container_.brk; break;}))
|
||||||
|
@ -383,7 +383,7 @@ QDebugStateSaver::QDebugStateSaver(QDebug &dbg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Destroyes a QDebugStateSaver instance, which restores the settings
|
Destroys a QDebugStateSaver instance, which restores the settings
|
||||||
used when the QDebugStateSaver instance was created.
|
used when the QDebugStateSaver instance was created.
|
||||||
|
|
||||||
\sa QDebug::setAutoInsertSpaces(), QDebug::autoInsertSpaces()
|
\sa QDebug::setAutoInsertSpaces(), QDebug::autoInsertSpaces()
|
||||||
|
@ -1944,8 +1944,9 @@ QString QDir::homePath()
|
|||||||
On Unix/Linux systems this is the path in the \c TMPDIR environment
|
On Unix/Linux systems this is the path in the \c TMPDIR environment
|
||||||
variable or \c{/tmp} if \c TMPDIR is not defined. On Windows this is
|
variable or \c{/tmp} if \c TMPDIR is not defined. On Windows this is
|
||||||
usually the path in the \c TEMP or \c TMP environment
|
usually the path in the \c TEMP or \c TMP environment
|
||||||
variable. Whether a directory separator is added to the end or
|
variable.
|
||||||
not, depends on the operating system.
|
The path returned by this method doesn't end with a directory separator
|
||||||
|
unless it is the root directory (of a drive).
|
||||||
|
|
||||||
\sa temp(), currentPath(), homePath(), rootPath()
|
\sa temp(), currentPath(), homePath(), rootPath()
|
||||||
*/
|
*/
|
||||||
|
@ -721,13 +721,13 @@ QString QFileSystemEngine::tempPath()
|
|||||||
|
|
||||||
if (temp.isEmpty()) {
|
if (temp.isEmpty()) {
|
||||||
qWarning("Neither the TEMP nor the TMPDIR environment variable is set, falling back to /tmp.");
|
qWarning("Neither the TEMP nor the TMPDIR environment variable is set, falling back to /tmp.");
|
||||||
temp = QLatin1String("/tmp/");
|
temp = QLatin1String("/tmp");
|
||||||
}
|
}
|
||||||
return QDir::cleanPath(temp);
|
return QDir::cleanPath(temp);
|
||||||
#else
|
#else
|
||||||
QString temp = QFile::decodeName(qgetenv("TMPDIR"));
|
QString temp = QFile::decodeName(qgetenv("TMPDIR"));
|
||||||
if (temp.isEmpty())
|
if (temp.isEmpty())
|
||||||
temp = QLatin1String("/tmp/");
|
temp = QLatin1String("/tmp");
|
||||||
return QDir::cleanPath(temp);
|
return QDir::cleanPath(temp);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -205,6 +205,8 @@ QString QStandardPaths::writableLocation(StandardLocation type)
|
|||||||
// value can start with $HOME
|
// value can start with $HOME
|
||||||
if (value.startsWith(QLatin1String("$HOME")))
|
if (value.startsWith(QLatin1String("$HOME")))
|
||||||
value = QDir::homePath() + value.mid(5);
|
value = QDir::homePath() + value.mid(5);
|
||||||
|
if (value.length() > 1 && value.endsWith(QLatin1Char('/')))
|
||||||
|
value.chop(1);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -257,10 +259,17 @@ static QStringList xdgDataDirs()
|
|||||||
dirs.append(QString::fromLatin1("/usr/local/share"));
|
dirs.append(QString::fromLatin1("/usr/local/share"));
|
||||||
dirs.append(QString::fromLatin1("/usr/share"));
|
dirs.append(QString::fromLatin1("/usr/share"));
|
||||||
} else {
|
} else {
|
||||||
dirs = xdgDataDirsEnv.split(QLatin1Char(':'));
|
dirs = xdgDataDirsEnv.split(QLatin1Char(':'), QString::SkipEmptyParts);
|
||||||
// Normalize paths
|
|
||||||
for (int i = 0; i < dirs.count(); i++)
|
// Normalize paths, skip relative paths
|
||||||
dirs[i] = QDir::cleanPath(dirs.at(i));
|
QMutableListIterator<QString> it(dirs);
|
||||||
|
while (it.hasNext()) {
|
||||||
|
const QString dir = it.next();
|
||||||
|
if (!dir.startsWith(QLatin1Char('/')))
|
||||||
|
it.remove();
|
||||||
|
else
|
||||||
|
it.setValue(QDir::cleanPath(dir));
|
||||||
|
}
|
||||||
|
|
||||||
// Remove duplicates from the list, there's no use for duplicated
|
// Remove duplicates from the list, there's no use for duplicated
|
||||||
// paths in XDG_DATA_DIRS - if it's not found in the given
|
// paths in XDG_DATA_DIRS - if it's not found in the given
|
||||||
|
@ -414,10 +414,16 @@ static inline QString fileScheme()
|
|||||||
return QStringLiteral("file");
|
return QStringLiteral("file");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef Q_COMPILER_CLASS_ENUM
|
||||||
|
# define colon_uchar : uchar
|
||||||
|
#else
|
||||||
|
# define colon_uchar
|
||||||
|
#endif
|
||||||
|
|
||||||
class QUrlPrivate
|
class QUrlPrivate
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
enum Section {
|
enum Section colon_uchar {
|
||||||
Scheme = 0x01,
|
Scheme = 0x01,
|
||||||
UserName = 0x02,
|
UserName = 0x02,
|
||||||
Password = 0x04,
|
Password = 0x04,
|
||||||
@ -432,6 +438,10 @@ public:
|
|||||||
FullUrl = 0xff
|
FullUrl = 0xff
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum Flags colon_uchar {
|
||||||
|
IsLocalFile = 0x01
|
||||||
|
};
|
||||||
|
|
||||||
enum ErrorCode {
|
enum ErrorCode {
|
||||||
// the high byte of the error code matches the Section
|
// the high byte of the error code matches the Section
|
||||||
// the first item in each value must be the generic "Invalid xxx Error"
|
// the first item in each value must be the generic "Invalid xxx Error"
|
||||||
@ -519,6 +529,8 @@ public:
|
|||||||
inline bool hasQuery() const { return sectionIsPresent & Query; }
|
inline bool hasQuery() const { return sectionIsPresent & Query; }
|
||||||
inline bool hasFragment() const { return sectionIsPresent & Fragment; }
|
inline bool hasFragment() const { return sectionIsPresent & Fragment; }
|
||||||
|
|
||||||
|
inline bool isLocalFile() const { return flags & IsLocalFile; }
|
||||||
|
|
||||||
QString mergePaths(const QString &relativePath) const;
|
QString mergePaths(const QString &relativePath) const;
|
||||||
|
|
||||||
QAtomicInt ref;
|
QAtomicInt ref;
|
||||||
@ -539,12 +551,18 @@ public:
|
|||||||
// - Path (there's no path delimiter, so we optimize its use out of existence)
|
// - Path (there's no path delimiter, so we optimize its use out of existence)
|
||||||
// Schemes are never supposed to be empty, but we keep the flag anyway
|
// Schemes are never supposed to be empty, but we keep the flag anyway
|
||||||
uchar sectionIsPresent;
|
uchar sectionIsPresent;
|
||||||
|
uchar flags;
|
||||||
|
|
||||||
|
// 32-bit: 2 bytes tail padding available
|
||||||
|
// 64-bit: 6 bytes tail padding available
|
||||||
};
|
};
|
||||||
|
#undef colon_uchar
|
||||||
|
|
||||||
inline QUrlPrivate::QUrlPrivate()
|
inline QUrlPrivate::QUrlPrivate()
|
||||||
: ref(1), port(-1),
|
: ref(1), port(-1),
|
||||||
error(0),
|
error(0),
|
||||||
sectionIsPresent(0)
|
sectionIsPresent(0),
|
||||||
|
flags(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -558,7 +576,8 @@ inline QUrlPrivate::QUrlPrivate(const QUrlPrivate ©)
|
|||||||
query(copy.query),
|
query(copy.query),
|
||||||
fragment(copy.fragment),
|
fragment(copy.fragment),
|
||||||
error(copy.cloneError()),
|
error(copy.cloneError()),
|
||||||
sectionIsPresent(copy.sectionIsPresent)
|
sectionIsPresent(copy.sectionIsPresent),
|
||||||
|
flags(copy.flags)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -956,6 +975,12 @@ inline bool QUrlPrivate::setScheme(const QString &value, int len, bool doSetErro
|
|||||||
schemeData[i] = c + 0x20;
|
schemeData[i] = c + 0x20;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// did we set to the file protocol?
|
||||||
|
if (scheme == fileScheme())
|
||||||
|
flags |= IsLocalFile;
|
||||||
|
else
|
||||||
|
flags &= ~IsLocalFile;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1312,6 +1337,7 @@ inline void QUrlPrivate::parse(const QString &url, QUrl::ParsingMode parsingMode
|
|||||||
// / other path types here
|
// / other path types here
|
||||||
|
|
||||||
sectionIsPresent = 0;
|
sectionIsPresent = 0;
|
||||||
|
flags = 0;
|
||||||
clearError();
|
clearError();
|
||||||
|
|
||||||
// find the important delimiters
|
// find the important delimiters
|
||||||
@ -1867,6 +1893,7 @@ void QUrl::setScheme(const QString &scheme)
|
|||||||
if (scheme.isEmpty()) {
|
if (scheme.isEmpty()) {
|
||||||
// schemes are not allowed to be empty
|
// schemes are not allowed to be empty
|
||||||
d->sectionIsPresent &= ~QUrlPrivate::Scheme;
|
d->sectionIsPresent &= ~QUrlPrivate::Scheme;
|
||||||
|
d->flags &= ~QUrlPrivate::IsLocalFile;
|
||||||
d->scheme.clear();
|
d->scheme.clear();
|
||||||
} else {
|
} else {
|
||||||
d->setScheme(scheme, scheme.length(), /* do set error */ true);
|
d->setScheme(scheme, scheme.length(), /* do set error */ true);
|
||||||
@ -3104,6 +3131,7 @@ QUrl QUrl::resolved(const QUrl &relative) const
|
|||||||
t.d->sectionIsPresent |= QUrlPrivate::Scheme;
|
t.d->sectionIsPresent |= QUrlPrivate::Scheme;
|
||||||
else
|
else
|
||||||
t.d->sectionIsPresent &= ~QUrlPrivate::Scheme;
|
t.d->sectionIsPresent &= ~QUrlPrivate::Scheme;
|
||||||
|
t.d->flags |= d->flags & QUrlPrivate::IsLocalFile;
|
||||||
}
|
}
|
||||||
t.d->fragment = relative.d->fragment;
|
t.d->fragment = relative.d->fragment;
|
||||||
if (relative.d->hasFragment())
|
if (relative.d->hasFragment())
|
||||||
@ -3177,7 +3205,6 @@ QString QUrl::toString(FormattingOptions options) const
|
|||||||
// - there's no query or fragment to return
|
// - there's no query or fragment to return
|
||||||
// that is, either they aren't present, or we're removing them
|
// that is, either they aren't present, or we're removing them
|
||||||
// - it's a local file
|
// - it's a local file
|
||||||
// (test done last since it's the most expensive)
|
|
||||||
if (options.testFlag(QUrl::PreferLocalFile) && !options.testFlag(QUrl::RemovePath)
|
if (options.testFlag(QUrl::PreferLocalFile) && !options.testFlag(QUrl::RemovePath)
|
||||||
&& (!d->hasQuery() || options.testFlag(QUrl::RemoveQuery))
|
&& (!d->hasQuery() || options.testFlag(QUrl::RemoveQuery))
|
||||||
&& (!d->hasFragment() || options.testFlag(QUrl::RemoveFragment))
|
&& (!d->hasFragment() || options.testFlag(QUrl::RemoveFragment))
|
||||||
@ -3201,6 +3228,7 @@ QString QUrl::toString(FormattingOptions options) const
|
|||||||
url += QLatin1String("//");
|
url += QLatin1String("//");
|
||||||
d->appendAuthority(url, options, QUrlPrivate::FullUrl);
|
d->appendAuthority(url, options, QUrlPrivate::FullUrl);
|
||||||
} else if (isLocalFile() && pathIsAbsolute) {
|
} else if (isLocalFile() && pathIsAbsolute) {
|
||||||
|
// Comply with the XDG file URI spec, which requires triple slashes.
|
||||||
url += QLatin1String("//");
|
url += QLatin1String("//");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3755,11 +3783,7 @@ QString QUrl::toLocalFile() const
|
|||||||
*/
|
*/
|
||||||
bool QUrl::isLocalFile() const
|
bool QUrl::isLocalFile() const
|
||||||
{
|
{
|
||||||
if (!d) return false;
|
return d && d->isLocalFile();
|
||||||
|
|
||||||
if (d->scheme != fileScheme())
|
|
||||||
return false; // not file
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -2603,7 +2603,7 @@ QStringList QUrl::idnWhitelist()
|
|||||||
Note that if you call this function, you need to do so \e before
|
Note that if you call this function, you need to do so \e before
|
||||||
you start any threads that might access idnWhitelist().
|
you start any threads that might access idnWhitelist().
|
||||||
|
|
||||||
Qt has comes a default list that contains the Internet top-level domains
|
Qt comes with a default list that contains the Internet top-level domains
|
||||||
that have published support for Internationalized Domain Names (IDNs)
|
that have published support for Internationalized Domain Names (IDNs)
|
||||||
and rules to guarantee that no deception can happen between similarly-looking
|
and rules to guarantee that no deception can happen between similarly-looking
|
||||||
characters (such as the Latin lowercase letter \c 'a' and the Cyrillic
|
characters (such as the Latin lowercase letter \c 'a' and the Cyrillic
|
||||||
|
@ -3663,9 +3663,15 @@ void QMetaObject::activate(QObject *sender, int signalOffset, int local_signal_i
|
|||||||
const int method_relative = c->method_relative;
|
const int method_relative = c->method_relative;
|
||||||
if (c->isSlotObject) {
|
if (c->isSlotObject) {
|
||||||
c->slotObj->ref();
|
c->slotObj->ref();
|
||||||
const QScopedPointer<QtPrivate::QSlotObjectBase, QSlotObjectBaseDeleter> obj(c->slotObj);
|
QScopedPointer<QtPrivate::QSlotObjectBase, QSlotObjectBaseDeleter> obj(c->slotObj);
|
||||||
locker.unlock();
|
locker.unlock();
|
||||||
obj->call(receiver, argv ? argv : empty_argv);
|
obj->call(receiver, argv ? argv : empty_argv);
|
||||||
|
|
||||||
|
// Make sure the slot object gets destroyed before the mutex is locked again, as the
|
||||||
|
// destructor of the slot object might also lock a mutex from the signalSlotLock() mutex pool,
|
||||||
|
// and that would deadlock if the pool happens to return the same mutex.
|
||||||
|
obj.reset();
|
||||||
|
|
||||||
locker.relock();
|
locker.relock();
|
||||||
} else if (callFunction && c->method_offset <= receiver->metaObject()->methodOffset()) {
|
} else if (callFunction && c->method_offset <= receiver->metaObject()->methodOffset()) {
|
||||||
//we compare the vtable to make sure we are not in the destructor of the object.
|
//we compare the vtable to make sure we are not in the destructor of the object.
|
||||||
|
@ -1894,7 +1894,7 @@ Image_Converter qimage_converter_map[QImage::NImageFormats][QImage::NImageFormat
|
|||||||
0,
|
0,
|
||||||
convert_RGBA_to_RGB,
|
convert_RGBA_to_RGB,
|
||||||
convert_RGBA_to_ARGB,
|
convert_RGBA_to_ARGB,
|
||||||
convert_RGBA_to_ARGB_PM,
|
convert_RGBA_to_ARGB,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
@ -1110,6 +1110,17 @@ QOpenGLTexture *QOpenGLTexturePrivate::createTextureView(QOpenGLTexture::Target
|
|||||||
would be to transform your texture coordinates.
|
would be to transform your texture coordinates.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\enum QOpenGLTexture::Filter
|
||||||
|
This enum defines the filtering parameters for a QOpenGLTexture object.
|
||||||
|
\value Nearest Equivalent to GL_NEAREST
|
||||||
|
\value Linear Equivalent to GL_LINEAR
|
||||||
|
\value NearestMipMapNearest Equivalent to GL_NEAREST_MIPMAP_NEAREST
|
||||||
|
\value NearestMipMapLinear Equivalent to GL_NEAREST_MIPMAP_LINEAR
|
||||||
|
\value LinearMipMapNearest Equivalent to GL_LINEAR_MIPMAP_NEAREST
|
||||||
|
\value LinearMipMapLinear Equivalent to GL_LINEAR_MIPMAP_LINEAR
|
||||||
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\enum QOpenGLTexture::Target
|
\enum QOpenGLTexture::Target
|
||||||
This enum defines the texture target of a QOpenGLTexture object.
|
This enum defines the texture target of a QOpenGLTexture object.
|
||||||
@ -1164,7 +1175,7 @@ QOpenGLTexture *QOpenGLTexturePrivate::createTextureView(QOpenGLTexture::Target
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\enum TextureUnitReset
|
\enum QOpenGLTexture::TextureUnitReset
|
||||||
This enum defines options ot control texture unit activation.
|
This enum defines options ot control texture unit activation.
|
||||||
|
|
||||||
\value ResetTextureUnit The previous active texture unit will be reset
|
\value ResetTextureUnit The previous active texture unit will be reset
|
||||||
@ -1320,7 +1331,7 @@ QOpenGLTexture *QOpenGLTexturePrivate::createTextureView(QOpenGLTexture::Target
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\enum PixelType
|
\enum QOpenGLTexture::PixelType
|
||||||
This enum defines the possible pixel data types for a pixel transfer operation
|
This enum defines the possible pixel data types for a pixel transfer operation
|
||||||
|
|
||||||
\value NoPixelType Equivalent to GL_NONE
|
\value NoPixelType Equivalent to GL_NONE
|
||||||
@ -1394,7 +1405,7 @@ QOpenGLTexture *QOpenGLTexturePrivate::createTextureView(QOpenGLTexture::Target
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\enum WrapMode
|
\enum QOpenGLTexture::WrapMode
|
||||||
This enum defines the possible texture coordinate wrapping modes.
|
This enum defines the possible texture coordinate wrapping modes.
|
||||||
|
|
||||||
\value Repeat Texture coordinate is repeated. Equivalent to GL_REPEAT
|
\value Repeat Texture coordinate is repeated. Equivalent to GL_REPEAT
|
||||||
@ -1405,7 +1416,7 @@ QOpenGLTexture *QOpenGLTexturePrivate::createTextureView(QOpenGLTexture::Target
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\enum CoordinateDirection
|
\enum QOpenGLTexture::CoordinateDirection
|
||||||
This enum defines the possible texture coordinate directions
|
This enum defines the possible texture coordinate directions
|
||||||
|
|
||||||
\value DirectionS The horizontal direction. Equivalent to GL_TEXTURE_WRAP_S
|
\value DirectionS The horizontal direction. Equivalent to GL_TEXTURE_WRAP_S
|
||||||
|
@ -5841,7 +5841,7 @@ inline void qt_bitmapblit_template(QRasterBuffer *rasterBuffer,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qt_gradient_quint32(int count, const QSpan *spans, void *userData)
|
static void qt_gradient_argb32(int count, const QSpan *spans, void *userData)
|
||||||
{
|
{
|
||||||
QSpanData *data = reinterpret_cast<QSpanData *>(userData);
|
QSpanData *data = reinterpret_cast<QSpanData *>(userData);
|
||||||
|
|
||||||
@ -6298,7 +6298,7 @@ DrawHelper qDrawHelper[QImage::NImageFormats] =
|
|||||||
// Format_RGB32,
|
// Format_RGB32,
|
||||||
{
|
{
|
||||||
blend_color_argb,
|
blend_color_argb,
|
||||||
qt_gradient_quint32,
|
qt_gradient_argb32,
|
||||||
qt_bitmapblit_quint32,
|
qt_bitmapblit_quint32,
|
||||||
qt_alphamapblit_quint32,
|
qt_alphamapblit_quint32,
|
||||||
qt_alphargbblit_quint32,
|
qt_alphargbblit_quint32,
|
||||||
@ -6307,7 +6307,7 @@ DrawHelper qDrawHelper[QImage::NImageFormats] =
|
|||||||
// Format_ARGB32,
|
// Format_ARGB32,
|
||||||
{
|
{
|
||||||
blend_color_generic,
|
blend_color_generic,
|
||||||
qt_gradient_quint32,
|
qt_gradient_argb32,
|
||||||
qt_bitmapblit_quint32,
|
qt_bitmapblit_quint32,
|
||||||
qt_alphamapblit_quint32,
|
qt_alphamapblit_quint32,
|
||||||
qt_alphargbblit_quint32,
|
qt_alphargbblit_quint32,
|
||||||
@ -6316,7 +6316,7 @@ DrawHelper qDrawHelper[QImage::NImageFormats] =
|
|||||||
// Format_ARGB32_Premultiplied
|
// Format_ARGB32_Premultiplied
|
||||||
{
|
{
|
||||||
blend_color_argb,
|
blend_color_argb,
|
||||||
qt_gradient_quint32,
|
qt_gradient_argb32,
|
||||||
qt_bitmapblit_quint32,
|
qt_bitmapblit_quint32,
|
||||||
qt_alphamapblit_quint32,
|
qt_alphamapblit_quint32,
|
||||||
qt_alphargbblit_quint32,
|
qt_alphargbblit_quint32,
|
||||||
@ -6382,7 +6382,7 @@ DrawHelper qDrawHelper[QImage::NImageFormats] =
|
|||||||
// Format_RGBX8888
|
// Format_RGBX8888
|
||||||
{
|
{
|
||||||
blend_color_generic,
|
blend_color_generic,
|
||||||
qt_gradient_quint32,
|
blend_src_generic,
|
||||||
qt_bitmapblit_quint32,
|
qt_bitmapblit_quint32,
|
||||||
#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
|
#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
|
||||||
qt_alphamapblit_quint32,
|
qt_alphamapblit_quint32,
|
||||||
@ -6396,7 +6396,7 @@ DrawHelper qDrawHelper[QImage::NImageFormats] =
|
|||||||
// Format_RGBA8888
|
// Format_RGBA8888
|
||||||
{
|
{
|
||||||
blend_color_generic,
|
blend_color_generic,
|
||||||
qt_gradient_quint32,
|
blend_src_generic,
|
||||||
qt_bitmapblit_quint32,
|
qt_bitmapblit_quint32,
|
||||||
#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
|
#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
|
||||||
qt_alphamapblit_quint32,
|
qt_alphamapblit_quint32,
|
||||||
@ -6410,7 +6410,7 @@ DrawHelper qDrawHelper[QImage::NImageFormats] =
|
|||||||
// Format_RGB8888_Premultiplied
|
// Format_RGB8888_Premultiplied
|
||||||
{
|
{
|
||||||
blend_color_generic,
|
blend_color_generic,
|
||||||
qt_gradient_quint32,
|
blend_src_generic,
|
||||||
qt_bitmapblit_quint32,
|
qt_bitmapblit_quint32,
|
||||||
#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
|
#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
|
||||||
qt_alphamapblit_quint32,
|
qt_alphamapblit_quint32,
|
||||||
|
@ -919,12 +919,9 @@ void QTextEngine::shapeText(int item) const
|
|||||||
QFontEngine *fontEngine = this->fontEngine(si, &si.ascent, &si.descent, &si.leading);
|
QFontEngine *fontEngine = this->fontEngine(si, &si.ascent, &si.descent, &si.leading);
|
||||||
|
|
||||||
// split up the item into parts that come from different font engines
|
// split up the item into parts that come from different font engines
|
||||||
|
// k * 3 entries, array[k] == index in string, array[k + 1] == index in glyphs, array[k + 2] == engine index
|
||||||
QVector<uint> itemBoundaries;
|
QVector<uint> itemBoundaries;
|
||||||
itemBoundaries.reserve(16);
|
itemBoundaries.reserve(24);
|
||||||
// k * 2 entries, array[k] == index in string, array[k + 1] == index in glyphs
|
|
||||||
itemBoundaries.append(0);
|
|
||||||
itemBoundaries.append(0);
|
|
||||||
|
|
||||||
if (fontEngine->type() == QFontEngine::Multi) {
|
if (fontEngine->type() == QFontEngine::Multi) {
|
||||||
// ask the font engine to find out which glyphs (as an index in the specific font)
|
// ask the font engine to find out which glyphs (as an index in the specific font)
|
||||||
// to use for the text in one item.
|
// to use for the text in one item.
|
||||||
@ -935,22 +932,31 @@ void QTextEngine::shapeText(int item) const
|
|||||||
if (!fontEngine->stringToCMap(reinterpret_cast<const QChar *>(string), itemLength, &initialGlyphs, &nGlyphs, shaperFlags))
|
if (!fontEngine->stringToCMap(reinterpret_cast<const QChar *>(string), itemLength, &initialGlyphs, &nGlyphs, shaperFlags))
|
||||||
Q_UNREACHABLE();
|
Q_UNREACHABLE();
|
||||||
|
|
||||||
uint lastEngine = 0;
|
uint lastEngine = ~0u;
|
||||||
for (int i = 0, glyph_pos = 0; i < itemLength; ++i, ++glyph_pos) {
|
for (int i = 0, glyph_pos = 0; i < itemLength; ++i, ++glyph_pos) {
|
||||||
const uint engineIdx = initialGlyphs.glyphs[glyph_pos] >> 24;
|
const uint engineIdx = initialGlyphs.glyphs[glyph_pos] >> 24;
|
||||||
if (lastEngine != engineIdx && glyph_pos > 0) {
|
if (lastEngine != engineIdx) {
|
||||||
itemBoundaries.append(i);
|
itemBoundaries.append(i);
|
||||||
itemBoundaries.append(glyph_pos);
|
itemBoundaries.append(glyph_pos);
|
||||||
|
itemBoundaries.append(engineIdx);
|
||||||
|
|
||||||
QFontEngine *actualFontEngine = static_cast<QFontEngineMulti *>(fontEngine)->engine(engineIdx);
|
if (engineIdx != 0) {
|
||||||
si.ascent = qMax(actualFontEngine->ascent(), si.ascent);
|
QFontEngine *actualFontEngine = static_cast<QFontEngineMulti *>(fontEngine)->engine(engineIdx);
|
||||||
si.descent = qMax(actualFontEngine->descent(), si.descent);
|
si.ascent = qMax(actualFontEngine->ascent(), si.ascent);
|
||||||
si.leading = qMax(actualFontEngine->leading(), si.leading);
|
si.descent = qMax(actualFontEngine->descent(), si.descent);
|
||||||
|
si.leading = qMax(actualFontEngine->leading(), si.leading);
|
||||||
|
}
|
||||||
|
|
||||||
|
lastEngine = engineIdx;
|
||||||
}
|
}
|
||||||
lastEngine = engineIdx;
|
|
||||||
if (QChar::isHighSurrogate(string[i]) && i + 1 < itemLength && QChar::isLowSurrogate(string[i + 1]))
|
if (QChar::isHighSurrogate(string[i]) && i + 1 < itemLength && QChar::isLowSurrogate(string[i + 1]))
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
itemBoundaries.append(0);
|
||||||
|
itemBoundaries.append(0);
|
||||||
|
itemBoundaries.append(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool kerningEnabled;
|
bool kerningEnabled;
|
||||||
@ -1027,16 +1033,6 @@ void QTextEngine::shapeText(int item) const
|
|||||||
si.width += glyphs.advances[i] * !glyphs.attributes[i].dontPrint;
|
si.width += glyphs.advances[i] * !glyphs.attributes[i].dontPrint;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void moveGlyphData(const QGlyphLayout &destination, const QGlyphLayout &source, int num)
|
|
||||||
{
|
|
||||||
if (num > 0 && destination.glyphs != source.glyphs) {
|
|
||||||
memmove(destination.glyphs, source.glyphs, num * sizeof(glyph_t));
|
|
||||||
memmove(destination.attributes, source.attributes, num * sizeof(QGlyphAttributes));
|
|
||||||
memmove(destination.advances, source.advances, num * sizeof(QFixed));
|
|
||||||
memmove(destination.offsets, source.offsets, num * sizeof(QFixedPoint));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef QT_ENABLE_HARFBUZZ_NG
|
#ifdef QT_ENABLE_HARFBUZZ_NG
|
||||||
|
|
||||||
QT_BEGIN_INCLUDE_NAMESPACE
|
QT_BEGIN_INCLUDE_NAMESPACE
|
||||||
@ -1063,20 +1059,15 @@ int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si, const ushort *st
|
|||||||
uint glyphs_shaped = 0;
|
uint glyphs_shaped = 0;
|
||||||
int remaining_glyphs = itemLength;
|
int remaining_glyphs = itemLength;
|
||||||
|
|
||||||
for (int k = 0; k < itemBoundaries.size(); k += 2) { // for the +2, see the comment at the definition of itemBoundaries
|
for (int k = 0; k < itemBoundaries.size(); k += 3) {
|
||||||
uint item_pos = itemBoundaries[k];
|
uint item_pos = itemBoundaries[k];
|
||||||
uint item_length = itemLength;
|
uint item_length = (k + 4 < itemBoundaries.size() ? itemBoundaries[k + 3] : itemLength) - item_pos;
|
||||||
uint item_glyph_pos = itemBoundaries[k + 1];
|
uint item_glyph_pos = itemBoundaries[k + 1];
|
||||||
if (k + 3 < itemBoundaries.size())
|
uint engineIdx = itemBoundaries[k + 2];
|
||||||
item_length = itemBoundaries[k + 2];
|
|
||||||
item_length -= item_pos;
|
|
||||||
|
|
||||||
QFontEngine *actualFontEngine = fontEngine;
|
QFontEngine *actualFontEngine = fontEngine;
|
||||||
uint engineIdx = 0;
|
if (fontEngine->type() == QFontEngine::Multi)
|
||||||
if (fontEngine->type() == QFontEngine::Multi) {
|
|
||||||
engineIdx = availableGlyphs(&si).glyphs[glyphs_shaped] >> 24;
|
|
||||||
actualFontEngine = static_cast<QFontEngineMulti *>(fontEngine)->engine(engineIdx);
|
actualFontEngine = static_cast<QFontEngineMulti *>(fontEngine)->engine(engineIdx);
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// prepare buffer
|
// prepare buffer
|
||||||
@ -1093,18 +1084,6 @@ int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si, const ushort *st
|
|||||||
buffer_flags |= HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES;
|
buffer_flags |= HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES;
|
||||||
hb_buffer_set_flags(buffer, hb_buffer_flags_t(buffer_flags));
|
hb_buffer_set_flags(buffer, hb_buffer_flags_t(buffer_flags));
|
||||||
|
|
||||||
const uint num_codes = hb_buffer_get_length(buffer);
|
|
||||||
{
|
|
||||||
// adjust clusters
|
|
||||||
hb_glyph_info_t *infos = hb_buffer_get_glyph_infos(buffer, 0);
|
|
||||||
const ushort *uc = string + item_pos;
|
|
||||||
for (uint i = 0, code_pos = 0; i < item_length; ++i, ++code_pos) {
|
|
||||||
if (QChar::isHighSurrogate(uc[i]) && i + 1 < item_length && QChar::isLowSurrogate(uc[i + 1]))
|
|
||||||
++i;
|
|
||||||
infos[code_pos].cluster = code_pos + item_glyph_pos;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// shape
|
// shape
|
||||||
bool shapedOk = false;
|
bool shapedOk = false;
|
||||||
@ -1127,8 +1106,7 @@ int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si, const ushort *st
|
|||||||
if (si.analysis.bidiLevel % 2)
|
if (si.analysis.bidiLevel % 2)
|
||||||
hb_buffer_reverse(buffer);
|
hb_buffer_reverse(buffer);
|
||||||
|
|
||||||
|
remaining_glyphs -= item_glyph_pos;
|
||||||
remaining_glyphs -= num_codes;
|
|
||||||
|
|
||||||
// ensure we have enough space for shaped glyphs and metrics
|
// ensure we have enough space for shaped glyphs and metrics
|
||||||
const uint num_glyphs = hb_buffer_get_length(buffer);
|
const uint num_glyphs = hb_buffer_get_length(buffer);
|
||||||
@ -1139,43 +1117,33 @@ int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si, const ushort *st
|
|||||||
|
|
||||||
// fetch the shaped glyphs and metrics
|
// fetch the shaped glyphs and metrics
|
||||||
QGlyphLayout g = availableGlyphs(&si).mid(glyphs_shaped, num_glyphs);
|
QGlyphLayout g = availableGlyphs(&si).mid(glyphs_shaped, num_glyphs);
|
||||||
if (num_glyphs > num_codes)
|
|
||||||
moveGlyphData(g.mid(num_glyphs), g.mid(num_codes), remaining_glyphs);
|
|
||||||
ushort *log_clusters = logClusters(&si) + item_pos;
|
ushort *log_clusters = logClusters(&si) + item_pos;
|
||||||
|
|
||||||
hb_glyph_info_t *infos = hb_buffer_get_glyph_infos(buffer, 0);
|
hb_glyph_info_t *infos = hb_buffer_get_glyph_infos(buffer, 0);
|
||||||
hb_glyph_position_t *positions = hb_buffer_get_glyph_positions(buffer, 0);
|
hb_glyph_position_t *positions = hb_buffer_get_glyph_positions(buffer, 0);
|
||||||
uint last_cluster = -1;
|
uint str_pos = 0;
|
||||||
|
uint last_cluster = ~0u;
|
||||||
|
uint last_glyph_pos = glyphs_shaped;
|
||||||
for (uint i = 0; i < num_glyphs; ++i) {
|
for (uint i = 0; i < num_glyphs; ++i) {
|
||||||
g.glyphs[i] = infos[i].codepoint;
|
g.glyphs[i] = infos[i].codepoint;
|
||||||
log_clusters[i] = infos[i].cluster;
|
|
||||||
|
|
||||||
g.advances[i] = QFixed::fromFixed(positions[i].x_advance);
|
g.advances[i] = QFixed::fromFixed(positions[i].x_advance);
|
||||||
g.offsets[i].x = QFixed::fromFixed(positions[i].x_offset);
|
g.offsets[i].x = QFixed::fromFixed(positions[i].x_offset);
|
||||||
g.offsets[i].y = QFixed::fromFixed(positions[i].y_offset);
|
g.offsets[i].y = QFixed::fromFixed(positions[i].y_offset);
|
||||||
|
|
||||||
if (infos[i].cluster != last_cluster) {
|
uint cluster = infos[i].cluster;
|
||||||
last_cluster = infos[i].cluster;
|
if (last_cluster != cluster) {
|
||||||
|
// fix up clusters so that the cluster indices will be monotonic
|
||||||
|
// and thus we never return out-of-order indices
|
||||||
|
while (last_cluster++ < cluster && str_pos < item_length)
|
||||||
|
log_clusters[str_pos++] = last_glyph_pos;
|
||||||
|
last_glyph_pos = i + glyphs_shaped;
|
||||||
|
last_cluster = cluster;
|
||||||
g.attributes[i].clusterStart = true;
|
g.attributes[i].clusterStart = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
while (str_pos < item_length)
|
||||||
{
|
log_clusters[str_pos++] = last_glyph_pos;
|
||||||
// adjust clusters
|
|
||||||
uint glyph_pos = 0;
|
|
||||||
for (uint i = 0; i < item_length; ++i) {
|
|
||||||
if (i + item_pos != infos[glyph_pos].cluster) {
|
|
||||||
for (uint j = glyph_pos + 1; j < num_glyphs; ++j) {
|
|
||||||
if (i + item_pos <= infos[j].cluster) {
|
|
||||||
if (i + item_pos == infos[j].cluster)
|
|
||||||
glyph_pos = j;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log_clusters[i] = glyph_pos + item_glyph_pos;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (engineIdx != 0) {
|
if (engineIdx != 0) {
|
||||||
for (quint32 i = 0; i < num_glyphs; ++i)
|
for (quint32 i = 0; i < num_glyphs; ++i)
|
||||||
@ -1211,6 +1179,12 @@ Q_STATIC_ASSERT(sizeof(HB_GlyphAttributes) == sizeof(QGlyphAttributes));
|
|||||||
Q_STATIC_ASSERT(sizeof(HB_Fixed) == sizeof(QFixed));
|
Q_STATIC_ASSERT(sizeof(HB_Fixed) == sizeof(QFixed));
|
||||||
Q_STATIC_ASSERT(sizeof(HB_FixedPoint) == sizeof(QFixedPoint));
|
Q_STATIC_ASSERT(sizeof(HB_FixedPoint) == sizeof(QFixedPoint));
|
||||||
|
|
||||||
|
static inline void moveGlyphData(const QGlyphLayout &destination, const QGlyphLayout &source, int num)
|
||||||
|
{
|
||||||
|
if (num > 0 && destination.glyphs != source.glyphs)
|
||||||
|
memmove(destination.glyphs, source.glyphs, num * sizeof(glyph_t));
|
||||||
|
}
|
||||||
|
|
||||||
int QTextEngine::shapeTextWithHarfbuzz(const QScriptItem &si, const ushort *string, int itemLength, QFontEngine *fontEngine, const QVector<uint> &itemBoundaries, bool kerningEnabled) const
|
int QTextEngine::shapeTextWithHarfbuzz(const QScriptItem &si, const ushort *string, int itemLength, QFontEngine *fontEngine, const QVector<uint> &itemBoundaries, bool kerningEnabled) const
|
||||||
{
|
{
|
||||||
HB_ShaperItem entire_shaper_item;
|
HB_ShaperItem entire_shaper_item;
|
||||||
@ -1239,14 +1213,12 @@ int QTextEngine::shapeTextWithHarfbuzz(const QScriptItem &si, const ushort *stri
|
|||||||
int remaining_glyphs = entire_shaper_item.num_glyphs;
|
int remaining_glyphs = entire_shaper_item.num_glyphs;
|
||||||
int glyph_pos = 0;
|
int glyph_pos = 0;
|
||||||
// for each item shape using harfbuzz and store the results in our layoutData's glyphs array.
|
// for each item shape using harfbuzz and store the results in our layoutData's glyphs array.
|
||||||
for (int k = 0; k < itemBoundaries.size(); k += 2) { // for the +2, see the comment at the definition of itemBoundaries
|
for (int k = 0; k < itemBoundaries.size(); k += 3) {
|
||||||
|
|
||||||
HB_ShaperItem shaper_item = entire_shaper_item;
|
HB_ShaperItem shaper_item = entire_shaper_item;
|
||||||
|
|
||||||
shaper_item.item.pos = itemBoundaries[k];
|
shaper_item.item.pos = itemBoundaries[k];
|
||||||
if (k < itemBoundaries.size() - 3) {
|
if (k + 4 < itemBoundaries.size()) {
|
||||||
shaper_item.item.length = itemBoundaries[k + 2] - shaper_item.item.pos;
|
shaper_item.item.length = itemBoundaries[k + 3] - shaper_item.item.pos;
|
||||||
shaper_item.num_glyphs = itemBoundaries[k + 3] - itemBoundaries[k + 1];
|
shaper_item.num_glyphs = itemBoundaries[k + 4] - itemBoundaries[k + 1];
|
||||||
} else { // last combo in the list, avoid out of bounds access.
|
} else { // last combo in the list, avoid out of bounds access.
|
||||||
shaper_item.item.length -= shaper_item.item.pos - entire_shaper_item.item.pos;
|
shaper_item.item.length -= shaper_item.item.pos - entire_shaper_item.item.pos;
|
||||||
shaper_item.num_glyphs -= itemBoundaries[k + 1];
|
shaper_item.num_glyphs -= itemBoundaries[k + 1];
|
||||||
@ -1255,10 +1227,9 @@ int QTextEngine::shapeTextWithHarfbuzz(const QScriptItem &si, const ushort *stri
|
|||||||
if (shaper_item.num_glyphs < shaper_item.item.length)
|
if (shaper_item.num_glyphs < shaper_item.item.length)
|
||||||
shaper_item.num_glyphs = shaper_item.item.length;
|
shaper_item.num_glyphs = shaper_item.item.length;
|
||||||
|
|
||||||
|
uint engineIdx = itemBoundaries[k + 2];
|
||||||
QFontEngine *actualFontEngine = fontEngine;
|
QFontEngine *actualFontEngine = fontEngine;
|
||||||
uint engineIdx = 0;
|
|
||||||
if (fontEngine->type() == QFontEngine::Multi) {
|
if (fontEngine->type() == QFontEngine::Multi) {
|
||||||
engineIdx = uint(availableGlyphs(&si).glyphs[glyph_pos] >> 24);
|
|
||||||
actualFontEngine = static_cast<QFontEngineMulti *>(fontEngine)->engine(engineIdx);
|
actualFontEngine = static_cast<QFontEngineMulti *>(fontEngine)->engine(engineIdx);
|
||||||
|
|
||||||
if ((si.analysis.bidiLevel % 2) == 0)
|
if ((si.analysis.bidiLevel % 2) == 0)
|
||||||
@ -1275,7 +1246,7 @@ int QTextEngine::shapeTextWithHarfbuzz(const QScriptItem &si, const ushort *stri
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
const QGlyphLayout g = availableGlyphs(&si).mid(glyph_pos);
|
const QGlyphLayout g = availableGlyphs(&si).mid(glyph_pos);
|
||||||
if (shaper_item.num_glyphs > shaper_item.item.length)
|
if (fontEngine->type() == QFontEngine::Multi && shaper_item.num_glyphs > shaper_item.item.length)
|
||||||
moveGlyphData(g.mid(shaper_item.num_glyphs), g.mid(shaper_item.initialGlyphCount), remaining_glyphs);
|
moveGlyphData(g.mid(shaper_item.num_glyphs), g.mid(shaper_item.initialGlyphCount), remaining_glyphs);
|
||||||
|
|
||||||
shaper_item.glyphs = reinterpret_cast<HB_Glyph *>(g.glyphs);
|
shaper_item.glyphs = reinterpret_cast<HB_Glyph *>(g.glyphs);
|
||||||
@ -1292,7 +1263,8 @@ int QTextEngine::shapeTextWithHarfbuzz(const QScriptItem &si, const ushort *stri
|
|||||||
} while (!qShapeItem(&shaper_item)); // this does the actual shaping via harfbuzz.
|
} while (!qShapeItem(&shaper_item)); // this does the actual shaping via harfbuzz.
|
||||||
|
|
||||||
QGlyphLayout g = availableGlyphs(&si).mid(glyph_pos, shaper_item.num_glyphs);
|
QGlyphLayout g = availableGlyphs(&si).mid(glyph_pos, shaper_item.num_glyphs);
|
||||||
moveGlyphData(g.mid(shaper_item.num_glyphs), g.mid(shaper_item.initialGlyphCount), remaining_glyphs);
|
if (fontEngine->type() == QFontEngine::Multi)
|
||||||
|
moveGlyphData(g.mid(shaper_item.num_glyphs), g.mid(shaper_item.initialGlyphCount), remaining_glyphs);
|
||||||
|
|
||||||
for (quint32 i = 0; i < shaper_item.item.length; ++i)
|
for (quint32 i = 0; i < shaper_item.item.length; ++i)
|
||||||
shaper_item.log_clusters[i] += glyph_pos;
|
shaper_item.log_clusters[i] += glyph_pos;
|
||||||
|
@ -341,8 +341,9 @@ static QByteArray _q_SubjectInfoToString(QSslCertificate::SubjectInfo info)
|
|||||||
\fn QString QSslCertificate::issuerInfo(SubjectInfo subject) const
|
\fn QString QSslCertificate::issuerInfo(SubjectInfo subject) const
|
||||||
|
|
||||||
Returns the issuer information for the \a subject from the
|
Returns the issuer information for the \a subject from the
|
||||||
certificate, or an empty string if there is no information for
|
certificate, or an empty list if there is no information for
|
||||||
\a subject in the certificate.
|
\a subject in the certificate. There can be more than one entry
|
||||||
|
of each type.
|
||||||
|
|
||||||
\sa subjectInfo()
|
\sa subjectInfo()
|
||||||
*/
|
*/
|
||||||
@ -359,8 +360,8 @@ QStringList QSslCertificate::issuerInfo(SubjectInfo info) const
|
|||||||
|
|
||||||
/*!
|
/*!
|
||||||
Returns the issuer information for \a attribute from the certificate,
|
Returns the issuer information for \a attribute from the certificate,
|
||||||
or an empty string if there is no information for \a attribute in the
|
or an empty list if there is no information for \a attribute in the
|
||||||
certificate.
|
certificate. There can be more than one entry for an attribute.
|
||||||
|
|
||||||
\sa subjectInfo()
|
\sa subjectInfo()
|
||||||
*/
|
*/
|
||||||
@ -379,8 +380,9 @@ QStringList QSslCertificate::issuerInfo(const QByteArray &attribute) const
|
|||||||
|
|
||||||
\fn QString QSslCertificate::subjectInfo(SubjectInfo subject) const
|
\fn QString QSslCertificate::subjectInfo(SubjectInfo subject) const
|
||||||
|
|
||||||
Returns the information for the \a subject, or an empty string if
|
Returns the information for the \a subject, or an empty list if
|
||||||
there is no information for \a subject in the certificate.
|
there is no information for \a subject in the certificate. There
|
||||||
|
can be more than one entry of each type.
|
||||||
|
|
||||||
\sa issuerInfo()
|
\sa issuerInfo()
|
||||||
*/
|
*/
|
||||||
@ -396,8 +398,9 @@ QStringList QSslCertificate::subjectInfo(SubjectInfo info) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Returns the subject information for \a attribute, or an empty string if
|
Returns the subject information for \a attribute, or an empty list if
|
||||||
there is no information for \a attribute in the certificate.
|
there is no information for \a attribute in the certificate. There
|
||||||
|
can be more than one entry for an attribute.
|
||||||
|
|
||||||
\sa issuerInfo()
|
\sa issuerInfo()
|
||||||
*/
|
*/
|
||||||
|
@ -40,6 +40,9 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include "qgraphicsshadereffect_p.h"
|
#include "qgraphicsshadereffect_p.h"
|
||||||
|
|
||||||
|
#ifndef QT_NO_GRAPHICSEFFECT
|
||||||
|
|
||||||
#include "qglshaderprogram.h"
|
#include "qglshaderprogram.h"
|
||||||
#include "gl2paintengineex/qglcustomshaderstage_p.h"
|
#include "gl2paintengineex/qglcustomshaderstage_p.h"
|
||||||
#define QGL_HAVE_CUSTOM_SHADERS 1
|
#define QGL_HAVE_CUSTOM_SHADERS 1
|
||||||
@ -311,3 +314,5 @@ void QGraphicsShaderEffect::setUniforms(QGLShaderProgram *program)
|
|||||||
}
|
}
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
#endif // QT_NO_GRAPHICSEFFECT
|
||||||
|
@ -54,6 +54,9 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#include <QtWidgets/qgraphicseffect.h>
|
#include <QtWidgets/qgraphicseffect.h>
|
||||||
|
|
||||||
|
#ifndef QT_NO_GRAPHICSEFFECT
|
||||||
|
|
||||||
#include <QtOpenGL/qtopenglglobal.h>
|
#include <QtOpenGL/qtopenglglobal.h>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
@ -87,4 +90,6 @@ private:
|
|||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
#endif // QT_NO_GRAPHICSEFFECT
|
||||||
|
|
||||||
#endif // QGRAPHICSSHADEREFFECT_P_H
|
#endif // QGRAPHICSSHADEREFFECT_P_H
|
||||||
|
@ -1391,13 +1391,6 @@ bool AtSpiAdaptor::accessibleInterface(QAccessibleInterface *interface, const QS
|
|||||||
if (interface->tableInterface()) {
|
if (interface->tableInterface()) {
|
||||||
setSpiStateBit(&spiState, ATSPI_STATE_MANAGES_DESCENDANTS);
|
setSpiStateBit(&spiState, ATSPI_STATE_MANAGES_DESCENDANTS);
|
||||||
}
|
}
|
||||||
// FIXME: figure out if this is a top level window and set its active state accordingly
|
|
||||||
// if (interface->object() && interface->object()->isWidgetType()) {
|
|
||||||
// QWidget *w = qobject_cast<QWidget*>(interface->object());
|
|
||||||
// if (w->topLevelWidget() && w->isActiveWindow()) {
|
|
||||||
// setSpiStateBit(&spiState, ATSPI_STATE_ACTIVE);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
QAccessible::Role role = interface->role();
|
QAccessible::Role role = interface->role();
|
||||||
if (role == QAccessible::TreeItem ||
|
if (role == QAccessible::TreeItem ||
|
||||||
role == QAccessible::ListItem) {
|
role == QAccessible::ListItem) {
|
||||||
|
@ -61,6 +61,8 @@ quint64 spiStatesFromQState(QAccessible::State state)
|
|||||||
{
|
{
|
||||||
quint64 spiState = 0;
|
quint64 spiState = 0;
|
||||||
|
|
||||||
|
if (state.active)
|
||||||
|
setSpiStateBit(&spiState, ATSPI_STATE_ACTIVE);
|
||||||
if (state.editable)
|
if (state.editable)
|
||||||
setSpiStateBit(&spiState, ATSPI_STATE_EDITABLE);
|
setSpiStateBit(&spiState, ATSPI_STATE_EDITABLE);
|
||||||
if (!state.disabled) {
|
if (!state.disabled) {
|
||||||
|
@ -1069,7 +1069,6 @@ QString QAccessibleTableCell::text(QAccessible::Text t) const
|
|||||||
QAbstractItemModel *model = view->model();
|
QAbstractItemModel *model = view->model();
|
||||||
QString value;
|
QString value;
|
||||||
switch (t) {
|
switch (t) {
|
||||||
case QAccessible::Value:
|
|
||||||
case QAccessible::Name:
|
case QAccessible::Name:
|
||||||
value = model->data(m_index, Qt::AccessibleTextRole).toString();
|
value = model->data(m_index, Qt::AccessibleTextRole).toString();
|
||||||
if (value.isEmpty())
|
if (value.isEmpty())
|
||||||
@ -1161,7 +1160,6 @@ QString QAccessibleTableHeaderCell::text(QAccessible::Text t) const
|
|||||||
QAbstractItemModel *model = view->model();
|
QAbstractItemModel *model = view->model();
|
||||||
QString value;
|
QString value;
|
||||||
switch (t) {
|
switch (t) {
|
||||||
case QAccessible::Value:
|
|
||||||
case QAccessible::Name:
|
case QAccessible::Name:
|
||||||
value = model->headerData(index, orientation, Qt::AccessibleTextRole).toString();
|
value = model->headerData(index, orientation, Qt::AccessibleTextRole).toString();
|
||||||
if (value.isEmpty())
|
if (value.isEmpty())
|
||||||
|
@ -631,7 +631,7 @@ QDockWidget *QAccessibleDockWidget::dockWidget() const
|
|||||||
|
|
||||||
QString QAccessibleDockWidget::text(QAccessible::Text t) const
|
QString QAccessibleDockWidget::text(QAccessible::Text t) const
|
||||||
{
|
{
|
||||||
if (t == QAccessible::Name || t == QAccessible::Value) {
|
if (t == QAccessible::Name) {
|
||||||
return qt_accStripAmp(dockWidget()->windowTitle());
|
return qt_accStripAmp(dockWidget()->windowTitle());
|
||||||
}
|
}
|
||||||
return QString();
|
return QString();
|
||||||
|
@ -507,8 +507,10 @@ QString QAccessibleGroupBox::text(QAccessible::Text t) const
|
|||||||
switch (t) {
|
switch (t) {
|
||||||
case QAccessible::Name:
|
case QAccessible::Name:
|
||||||
txt = qt_accStripAmp(groupBox()->title());
|
txt = qt_accStripAmp(groupBox()->title());
|
||||||
|
break;
|
||||||
case QAccessible::Description:
|
case QAccessible::Description:
|
||||||
txt = qt_accStripAmp(groupBox()->title());
|
txt = qt_accStripAmp(groupBox()->toolTip());
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -48,8 +48,6 @@
|
|||||||
#include <QPoint>
|
#include <QPoint>
|
||||||
#include <qpa/qwindowsysteminterface.h>
|
#include <qpa/qwindowsysteminterface.h>
|
||||||
|
|
||||||
#include <Qt>
|
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <tslib.h>
|
#include <tslib.h>
|
||||||
|
|
||||||
@ -65,21 +63,21 @@ QTsLibMouseHandler::QTsLibMouseHandler(const QString &key,
|
|||||||
setObjectName(QLatin1String("TSLib Mouse Handler"));
|
setObjectName(QLatin1String("TSLib Mouse Handler"));
|
||||||
|
|
||||||
QByteArray device = qgetenv("TSLIB_TSDEVICE");
|
QByteArray device = qgetenv("TSLIB_TSDEVICE");
|
||||||
if (device.isEmpty())
|
|
||||||
device = QByteArrayLiteral("/dev/input/event1");
|
|
||||||
|
|
||||||
if (specification.startsWith("/dev/"))
|
if (specification.startsWith("/dev/"))
|
||||||
device = specification.toLocal8Bit();
|
device = specification.toLocal8Bit();
|
||||||
|
|
||||||
|
if (device.isEmpty())
|
||||||
|
device = QByteArrayLiteral("/dev/input/event1");
|
||||||
|
|
||||||
m_dev = ts_open(device.constData(), 1);
|
m_dev = ts_open(device.constData(), 1);
|
||||||
if (!m_dev) {
|
if (!m_dev) {
|
||||||
qErrnoWarning(errno, "ts_open() failed");
|
qErrnoWarning(errno, "ts_open() failed");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ts_config(m_dev)) {
|
if (ts_config(m_dev))
|
||||||
perror("Error configuring\n");
|
perror("Error configuring\n");
|
||||||
}
|
|
||||||
|
|
||||||
m_rawMode = !key.compare(QLatin1String("TslibRaw"), Qt::CaseInsensitive);
|
m_rawMode = !key.compare(QLatin1String("TslibRaw"), Qt::CaseInsensitive);
|
||||||
|
|
||||||
@ -89,7 +87,6 @@ QTsLibMouseHandler::QTsLibMouseHandler(const QString &key,
|
|||||||
connect(m_notify, SIGNAL(activated(int)), this, SLOT(readMouseData()));
|
connect(m_notify, SIGNAL(activated(int)), this, SLOT(readMouseData()));
|
||||||
} else {
|
} else {
|
||||||
qWarning("Cannot open mouse input device '%s': %s", device.constData(), strerror(errno));
|
qWarning("Cannot open mouse input device '%s': %s", device.constData(), strerror(errno));
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,12 +100,10 @@ QTsLibMouseHandler::~QTsLibMouseHandler()
|
|||||||
|
|
||||||
static bool get_sample(struct tsdev *dev, struct ts_sample *sample, bool rawMode)
|
static bool get_sample(struct tsdev *dev, struct ts_sample *sample, bool rawMode)
|
||||||
{
|
{
|
||||||
if (rawMode) {
|
if (rawMode)
|
||||||
return (ts_read_raw(dev, sample, 1) == 1);
|
return (ts_read_raw(dev, sample, 1) == 1);
|
||||||
} else {
|
else
|
||||||
int ret = ts_read(dev, sample, 1);
|
return (ts_read(dev, sample, 1) == 1);
|
||||||
return ( ret == 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -347,7 +347,7 @@ ushort TableGenerator::keysymToUtf8(quint32 sym)
|
|||||||
qDebug() << QString("keysym - 0x%1 : utf8 - %2").arg(QString::number(sym, 16))
|
qDebug() << QString("keysym - 0x%1 : utf8 - %2").arg(QString::number(sym, 16))
|
||||||
.arg(codec->toUnicode(chars));
|
.arg(codec->toUnicode(chars));
|
||||||
#endif
|
#endif
|
||||||
return QString::fromLocal8Bit(chars).at(0).unicode();
|
return QString::fromUtf8(chars).at(0).unicode();
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int fromBase8(const char *s, const char *end)
|
static inline int fromBase8(const char *s, const char *end)
|
||||||
|
@ -335,6 +335,8 @@ bool QLinuxFbScreen::initialize()
|
|||||||
QRegularExpressionMatch match;
|
QRegularExpressionMatch match;
|
||||||
if (arg == QLatin1String("nographicsmodeswitch"))
|
if (arg == QLatin1String("nographicsmodeswitch"))
|
||||||
doSwitchToGraphicsMode = false;
|
doSwitchToGraphicsMode = false;
|
||||||
|
else if (arg.contains(mmSizeRx, &match))
|
||||||
|
userMmSize = QSize(match.captured(1).toInt(), match.captured(2).toInt());
|
||||||
else if (arg.contains(sizeRx, &match))
|
else if (arg.contains(sizeRx, &match))
|
||||||
userGeometry.setSize(QSize(match.captured(1).toInt(), match.captured(2).toInt()));
|
userGeometry.setSize(QSize(match.captured(1).toInt(), match.captured(2).toInt()));
|
||||||
else if (arg.contains(offsetRx, &match))
|
else if (arg.contains(offsetRx, &match))
|
||||||
@ -343,8 +345,6 @@ bool QLinuxFbScreen::initialize()
|
|||||||
ttyDevice = match.captured(1);
|
ttyDevice = match.captured(1);
|
||||||
else if (arg.contains(fbRx, &match))
|
else if (arg.contains(fbRx, &match))
|
||||||
fbDevice = match.captured(1);
|
fbDevice = match.captured(1);
|
||||||
else if (arg.contains(mmSizeRx, &match))
|
|
||||||
userMmSize = QSize(match.captured(1).toInt(), match.captured(2).toInt());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fbDevice.isEmpty()) {
|
if (fbDevice.isEmpty()) {
|
||||||
|
@ -1012,6 +1012,8 @@ HRESULT STDMETHODCALLTYPE QWindowsMsaaAccessible::get_accState(VARIANT varID, VA
|
|||||||
st |= STATE_SYSTEM_SIZEABLE;
|
st |= STATE_SYSTEM_SIZEABLE;
|
||||||
if (state.traversed)
|
if (state.traversed)
|
||||||
st |= STATE_SYSTEM_TRAVERSED;
|
st |= STATE_SYSTEM_TRAVERSED;
|
||||||
|
if (state.disabled)
|
||||||
|
st |= STATE_SYSTEM_UNAVAILABLE;
|
||||||
|
|
||||||
(*pvarState).vt = VT_I4;
|
(*pvarState).vt = VT_I4;
|
||||||
(*pvarState).lVal = st;
|
(*pvarState).lVal = st;
|
||||||
|
@ -1993,13 +1993,17 @@ static void draw_text_item_win(const QPointF &pos, const QTextItemInt &ti, HDC h
|
|||||||
void QWin32PrintEnginePrivate::updateCustomPaperSize()
|
void QWin32PrintEnginePrivate::updateCustomPaperSize()
|
||||||
{
|
{
|
||||||
const uint paperSize = devMode->dmPaperSize;
|
const uint paperSize = devMode->dmPaperSize;
|
||||||
|
const double multiplier = qt_multiplierForUnit(QPrinter::Millimeter, resolution);
|
||||||
has_custom_paper_size = false;
|
has_custom_paper_size = false;
|
||||||
if (paperSize > 0 && mapDevmodePaperSize(paperSize) == QPrinter::Custom) {
|
if (paperSize == DMPAPER_USER) {
|
||||||
|
has_custom_paper_size = true;
|
||||||
|
paper_size = QSizeF((devMode->dmPaperWidth / 10.0) * multiplier, (devMode->dmPaperLength / 10.0) * multiplier);
|
||||||
|
} else if (mapDevmodePaperSize(paperSize) == QPrinter::Custom) {
|
||||||
has_custom_paper_size = true;
|
has_custom_paper_size = true;
|
||||||
const QList<QPair<QSizeF, int> > paperSizes = printerPaperSizes(name);
|
const QList<QPair<QSizeF, int> > paperSizes = printerPaperSizes(name);
|
||||||
for (int i=0; i<paperSizes.size(); i++) {
|
for (int i=0; i<paperSizes.size(); i++) {
|
||||||
if ((uint)paperSizes.at(i).second == paperSize) {
|
if ((uint)paperSizes.at(i).second == paperSize) {
|
||||||
paper_size = paperSizes.at(i).first;
|
paper_size = paperSizes.at(i).first * multiplier;
|
||||||
has_custom_paper_size = false;
|
has_custom_paper_size = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -258,7 +258,7 @@ int runMoc(int argc, char **argv)
|
|||||||
parser.addOption(pathPrefixOption);
|
parser.addOption(pathPrefixOption);
|
||||||
|
|
||||||
QCommandLineOption forceIncludeOption(QStringLiteral("f"));
|
QCommandLineOption forceIncludeOption(QStringLiteral("f"));
|
||||||
forceIncludeOption.setDescription(QStringLiteral("Force #include [optional <file>] (overwrite default)."));
|
forceIncludeOption.setDescription(QStringLiteral("Force #include <file> (overwrite default)."));
|
||||||
forceIncludeOption.setValueName(QStringLiteral("file"));
|
forceIncludeOption.setValueName(QStringLiteral("file"));
|
||||||
parser.addOption(forceIncludeOption);
|
parser.addOption(forceIncludeOption);
|
||||||
|
|
||||||
|
@ -246,16 +246,15 @@ QMultiMap<QString,QString> outFileNames;
|
|||||||
*/
|
*/
|
||||||
void Generator::writeOutFileNames()
|
void Generator::writeOutFileNames()
|
||||||
{
|
{
|
||||||
QFile* files = new QFile("/Users/msmith/depot/qt5/qtdoc/outputlist.txt");
|
QFile files("outputlist.txt");
|
||||||
files->open(QFile::WriteOnly);
|
if (!files.open(QFile::WriteOnly))
|
||||||
QTextStream* filesout = new QTextStream(files);
|
return;
|
||||||
|
QTextStream filesout(&files);
|
||||||
QMultiMap<QString,QString>::ConstIterator i = outFileNames.begin();
|
QMultiMap<QString,QString>::ConstIterator i = outFileNames.begin();
|
||||||
while (i != outFileNames.end()) {
|
while (i != outFileNames.end()) {
|
||||||
(*filesout) << i.key() << "\n";
|
filesout << i.key() << "\n";
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
filesout->flush();
|
|
||||||
files->close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -425,10 +425,9 @@ QString QAccessibleWidget::text(QAccessible::Text t) const
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case QAccessible::Description:
|
case QAccessible::Description:
|
||||||
if (!widget()->accessibleDescription().isEmpty())
|
str = widget()->accessibleDescription();
|
||||||
str = widget()->accessibleDescription();
|
|
||||||
#ifndef QT_NO_TOOLTIP
|
#ifndef QT_NO_TOOLTIP
|
||||||
else
|
if (str.isEmpty())
|
||||||
str = widget()->toolTip();
|
str = widget()->toolTip();
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
@ -627,7 +627,8 @@ void QFileDialogPrivate::helperPrepareShow(QPlatformDialogHelper *)
|
|||||||
options->setInitialDirectory(directory.exists() ?
|
options->setInitialDirectory(directory.exists() ?
|
||||||
QUrl::fromLocalFile(directory.absolutePath()) :
|
QUrl::fromLocalFile(directory.absolutePath()) :
|
||||||
QUrl());
|
QUrl());
|
||||||
options->setInitiallySelectedNameFilter(q->selectedNameFilter());
|
if (options->initiallySelectedNameFilter().isEmpty())
|
||||||
|
options->setInitiallySelectedNameFilter(q->selectedNameFilter());
|
||||||
if (options->initiallySelectedFiles().isEmpty())
|
if (options->initiallySelectedFiles().isEmpty())
|
||||||
options->setInitiallySelectedFiles(userSelectedFiles());
|
options->setInitiallySelectedFiles(userSelectedFiles());
|
||||||
}
|
}
|
||||||
@ -1450,6 +1451,7 @@ QStringList QFileDialog::nameFilters() const
|
|||||||
void QFileDialog::selectNameFilter(const QString &filter)
|
void QFileDialog::selectNameFilter(const QString &filter)
|
||||||
{
|
{
|
||||||
Q_D(QFileDialog);
|
Q_D(QFileDialog);
|
||||||
|
d->options->setInitiallySelectedNameFilter(filter);
|
||||||
if (!d->usingWidgets()) {
|
if (!d->usingWidgets()) {
|
||||||
d->selectNameFilter_sys(filter);
|
d->selectNameFilter_sys(filter);
|
||||||
return;
|
return;
|
||||||
|
@ -2515,7 +2515,9 @@ void QTableWidget::removeColumn(int column)
|
|||||||
|
|
||||||
/*!
|
/*!
|
||||||
Removes all items in the view.
|
Removes all items in the view.
|
||||||
This will also remove all selections.
|
This will also remove all selections and headers.
|
||||||
|
If you don't want to remove the headers, use
|
||||||
|
QTableWidget::clearContents().
|
||||||
The table dimensions stay the same.
|
The table dimensions stay the same.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -755,8 +755,8 @@ Qt::Alignment QTextEdit::alignment() const
|
|||||||
|
|
||||||
\note The editor \e{does not take ownership of the document} unless it
|
\note The editor \e{does not take ownership of the document} unless it
|
||||||
is the document's parent object. The parent object of the provided document
|
is the document's parent object. The parent object of the provided document
|
||||||
remains the owner of the object. The editor does not delete any previously
|
remains the owner of the object. If the previously assigned document is a
|
||||||
assigned document, even if it is a child of the editor.
|
child of the editor then it will be deleted.
|
||||||
*/
|
*/
|
||||||
void QTextEdit::setDocument(QTextDocument *document)
|
void QTextEdit::setDocument(QTextDocument *document)
|
||||||
{
|
{
|
||||||
|
@ -778,15 +778,16 @@ void QToolButtonPrivate::popupTimerDone()
|
|||||||
actualMenu->d_func()->causedPopup.action = defaultAction;
|
actualMenu->d_func()->causedPopup.action = defaultAction;
|
||||||
actionsCopy = q->actions(); //(the list of action may be modified in slots)
|
actionsCopy = q->actions(); //(the list of action may be modified in slots)
|
||||||
actualMenu->exec(p);
|
actualMenu->exec(p);
|
||||||
|
|
||||||
|
if (!that)
|
||||||
|
return;
|
||||||
|
|
||||||
QObject::disconnect(actualMenu, SIGNAL(aboutToHide()), q, SLOT(_q_updateButtonDown()));
|
QObject::disconnect(actualMenu, SIGNAL(aboutToHide()), q, SLOT(_q_updateButtonDown()));
|
||||||
if (mustDeleteActualMenu)
|
if (mustDeleteActualMenu)
|
||||||
delete actualMenu;
|
delete actualMenu;
|
||||||
else
|
else
|
||||||
QObject::disconnect(actualMenu, SIGNAL(triggered(QAction*)), q, SLOT(_q_menuTriggered(QAction*)));
|
QObject::disconnect(actualMenu, SIGNAL(triggered(QAction*)), q, SLOT(_q_menuTriggered(QAction*)));
|
||||||
|
|
||||||
if (!that)
|
|
||||||
return;
|
|
||||||
|
|
||||||
actionsCopy.clear();
|
actionsCopy.clear();
|
||||||
|
|
||||||
if (repeat)
|
if (repeat)
|
||||||
|
@ -101,6 +101,13 @@ void tst_QGlobal::for_each()
|
|||||||
QCOMPARE(i, counter++);
|
QCOMPARE(i, counter++);
|
||||||
}
|
}
|
||||||
QCOMPARE(counter, list.count());
|
QCOMPARE(counter, list.count());
|
||||||
|
|
||||||
|
// check whether we can pass a constructor as container argument
|
||||||
|
counter = 0;
|
||||||
|
foreach (int i, QList<int>(list)) {
|
||||||
|
QCOMPARE(i, counter++);
|
||||||
|
}
|
||||||
|
QCOMPARE(counter, list.count());
|
||||||
}
|
}
|
||||||
|
|
||||||
void tst_QGlobal::qassert()
|
void tst_QGlobal::qassert()
|
||||||
|
@ -77,6 +77,7 @@ private slots:
|
|||||||
void testAllWritableLocations_data();
|
void testAllWritableLocations_data();
|
||||||
void testAllWritableLocations();
|
void testAllWritableLocations();
|
||||||
void testCleanPath();
|
void testCleanPath();
|
||||||
|
void testXdgPathCleanup();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
#ifdef Q_XDG_PLATFORM
|
#ifdef Q_XDG_PLATFORM
|
||||||
@ -477,6 +478,8 @@ void tst_qstandardpaths::testAllWritableLocations()
|
|||||||
QString loc = QStandardPaths::writableLocation(location);
|
QString loc = QStandardPaths::writableLocation(location);
|
||||||
if (loc.size() > 1) // workaround for unlikely case of locations that return '/'
|
if (loc.size() > 1) // workaround for unlikely case of locations that return '/'
|
||||||
QCOMPARE(loc.endsWith(QLatin1Char('/')), false);
|
QCOMPARE(loc.endsWith(QLatin1Char('/')), false);
|
||||||
|
QVERIFY(loc.contains(QLatin1Char('/')));
|
||||||
|
QVERIFY(!loc.contains(QLatin1Char('\\')));
|
||||||
}
|
}
|
||||||
|
|
||||||
void tst_qstandardpaths::testCleanPath()
|
void tst_qstandardpaths::testCleanPath()
|
||||||
@ -491,6 +494,19 @@ void tst_qstandardpaths::testCleanPath()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_qstandardpaths::testXdgPathCleanup()
|
||||||
|
{
|
||||||
|
#ifdef Q_XDG_PLATFORM
|
||||||
|
setCustomLocations();
|
||||||
|
const QString uncleanGlobalAppDir = "/./" + QFile::encodeName(m_globalAppDir);
|
||||||
|
qputenv("XDG_DATA_DIRS", QFile::encodeName(uncleanGlobalAppDir) + "::relative/path");
|
||||||
|
const QStringList appsDirs = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation);
|
||||||
|
QVERIFY(!appsDirs.contains("/applications"));
|
||||||
|
QVERIFY(!appsDirs.contains(uncleanGlobalAppDir + "/applications"));
|
||||||
|
QVERIFY(!appsDirs.contains("relative/path/applications"));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
QTEST_MAIN(tst_qstandardpaths)
|
QTEST_MAIN(tst_qstandardpaths)
|
||||||
|
|
||||||
#include "tst_qstandardpaths.moc"
|
#include "tst_qstandardpaths.moc"
|
||||||
|
@ -147,6 +147,7 @@ private slots:
|
|||||||
void connectFunctorOverloads();
|
void connectFunctorOverloads();
|
||||||
void connectFunctorQueued();
|
void connectFunctorQueued();
|
||||||
void connectFunctorWithContext();
|
void connectFunctorWithContext();
|
||||||
|
void connectFunctorDeadlock();
|
||||||
void connectStaticSlotWithObject();
|
void connectStaticSlotWithObject();
|
||||||
void disconnectDoesNotLeakFunctor();
|
void disconnectDoesNotLeakFunctor();
|
||||||
void contextDoesNotLeakFunctor();
|
void contextDoesNotLeakFunctor();
|
||||||
@ -5740,6 +5741,47 @@ void tst_QObject::connectFunctorWithContext()
|
|||||||
context->deleteLater();
|
context->deleteLater();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class MyFunctor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit MyFunctor(QObject *objectToDisconnect)
|
||||||
|
: m_objectToDisconnect(objectToDisconnect)
|
||||||
|
{}
|
||||||
|
|
||||||
|
~MyFunctor() {
|
||||||
|
// Do operations that will lock the internal signalSlotLock mutex on many QObjects.
|
||||||
|
// The more QObjects, the higher the chance that the signalSlotLock mutex used
|
||||||
|
// is already in use. If the number of objects is higher than the number of mutexes in
|
||||||
|
// the pool (currently 131), the deadlock should always trigger. Use an even higher number
|
||||||
|
// to be on the safe side.
|
||||||
|
const int objectCount = 1024;
|
||||||
|
SenderObject lotsOfObjects[objectCount];
|
||||||
|
for (int i = 0; i < objectCount; ++i) {
|
||||||
|
QObject::connect(&lotsOfObjects[i], &SenderObject::signal1,
|
||||||
|
&lotsOfObjects[i], &SenderObject::aPublicSlot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void operator()() {
|
||||||
|
// This will cause the slot object associated with this functor to be destroyed after
|
||||||
|
// this function returns. That in turn will destroy this functor.
|
||||||
|
// If our dtor runs with the signalSlotLock held, the bunch of connect()
|
||||||
|
// performed there will deadlock trying to lock that lock again.
|
||||||
|
m_objectToDisconnect->disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
QObject *m_objectToDisconnect;
|
||||||
|
};
|
||||||
|
|
||||||
|
void tst_QObject::connectFunctorDeadlock()
|
||||||
|
{
|
||||||
|
SenderObject sender;
|
||||||
|
MyFunctor functor(&sender);
|
||||||
|
QObject::connect(&sender, &SenderObject::signal1, functor);
|
||||||
|
sender.emitSignal1();
|
||||||
|
}
|
||||||
|
|
||||||
static int s_static_slot_checker = 1;
|
static int s_static_slot_checker = 1;
|
||||||
|
|
||||||
class StaticSlotChecker : public QObject
|
class StaticSlotChecker : public QObject
|
||||||
|
@ -202,6 +202,9 @@ private slots:
|
|||||||
void linearGradientSymmetry();
|
void linearGradientSymmetry();
|
||||||
void gradientInterpolation();
|
void gradientInterpolation();
|
||||||
|
|
||||||
|
void gradientPixelFormat_data();
|
||||||
|
void gradientPixelFormat();
|
||||||
|
|
||||||
void fpe_pixmapTransform();
|
void fpe_pixmapTransform();
|
||||||
void fpe_zeroLengthLines();
|
void fpe_zeroLengthLines();
|
||||||
void fpe_divByZero();
|
void fpe_divByZero();
|
||||||
@ -3727,6 +3730,49 @@ void tst_QPainter::linearGradientSymmetry()
|
|||||||
QCOMPARE(a, b);
|
QCOMPARE(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QPainter::gradientPixelFormat_data()
|
||||||
|
{
|
||||||
|
QTest::addColumn<QImage::Format>("format");
|
||||||
|
|
||||||
|
QTest::newRow("argb32") << QImage::Format_ARGB32;
|
||||||
|
QTest::newRow("rgb32") << QImage::Format_RGB32;
|
||||||
|
QTest::newRow("rgb888") << QImage::Format_RGB888;
|
||||||
|
QTest::newRow("rgbx8888") << QImage::Format_RGBX8888;
|
||||||
|
QTest::newRow("rgba8888") << QImage::Format_RGBA8888;
|
||||||
|
QTest::newRow("rgba8888_pm") << QImage::Format_RGBA8888_Premultiplied;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_QPainter::gradientPixelFormat()
|
||||||
|
{
|
||||||
|
QFETCH(QImage::Format, format);
|
||||||
|
|
||||||
|
QImage a(8, 64, QImage::Format_ARGB32_Premultiplied);
|
||||||
|
QImage b(8, 64, format);
|
||||||
|
|
||||||
|
|
||||||
|
QGradientStops stops;
|
||||||
|
stops << qMakePair(qreal(0.0), QColor(Qt::blue));
|
||||||
|
stops << qMakePair(qreal(0.3), QColor(Qt::red));
|
||||||
|
stops << qMakePair(qreal(0.6), QColor(Qt::green));
|
||||||
|
stops << qMakePair(qreal(1.0), QColor(Qt::black));
|
||||||
|
|
||||||
|
a.fill(0);
|
||||||
|
b.fill(0);
|
||||||
|
|
||||||
|
QLinearGradient gradient(QRectF(b.rect()).topLeft(), QRectF(b.rect()).bottomLeft());
|
||||||
|
gradient.setStops(stops);
|
||||||
|
|
||||||
|
QPainter pa(&a);
|
||||||
|
pa.fillRect(a.rect(), gradient);
|
||||||
|
pa.end();
|
||||||
|
|
||||||
|
QPainter pb(&b);
|
||||||
|
pb.fillRect(b.rect(), gradient);
|
||||||
|
pb.end();
|
||||||
|
|
||||||
|
QCOMPARE(a, b.convertToFormat(QImage::Format_ARGB32_Premultiplied));
|
||||||
|
}
|
||||||
|
|
||||||
void tst_QPainter::gradientInterpolation()
|
void tst_QPainter::gradientInterpolation()
|
||||||
{
|
{
|
||||||
QImage image(256, 8, QImage::Format_ARGB32_Premultiplied);
|
QImage image(256, 8, QImage::Format_ARGB32_Premultiplied);
|
||||||
|
@ -160,7 +160,6 @@ void tst_QHttpNetworkConnection::head_data()
|
|||||||
QTest::addColumn<int>("contentLength");
|
QTest::addColumn<int>("contentLength");
|
||||||
|
|
||||||
QTest::newRow("success-internal") << "http://" << QtNetworkSettings::serverName() << "/qtest/rfc3252.txt" << ushort(80) << false << 200 << "OK" << 25962;
|
QTest::newRow("success-internal") << "http://" << QtNetworkSettings::serverName() << "/qtest/rfc3252.txt" << ushort(80) << false << 200 << "OK" << 25962;
|
||||||
QTest::newRow("success-external") << "http://" << "www.ietf.org" << "/rfc/rfc3252.txt" << ushort(80) << false << 200 << "OK" << 25962;
|
|
||||||
|
|
||||||
QTest::newRow("failure-path") << "http://" << QtNetworkSettings::serverName() << "/t" << ushort(80) << false << 404 << "Not Found" << -1;
|
QTest::newRow("failure-path") << "http://" << QtNetworkSettings::serverName() << "/t" << ushort(80) << false << 404 << "Not Found" << -1;
|
||||||
QTest::newRow("failure-protocol") << "" << QtNetworkSettings::serverName() << "/qtest/rfc3252.txt" << ushort(80) << false << 400 << "Bad Request" << -1;
|
QTest::newRow("failure-protocol") << "" << QtNetworkSettings::serverName() << "/qtest/rfc3252.txt" << ushort(80) << false << 400 << "Bad Request" << -1;
|
||||||
@ -217,7 +216,6 @@ void tst_QHttpNetworkConnection::get_data()
|
|||||||
QTest::addColumn<int>("downloadSize");
|
QTest::addColumn<int>("downloadSize");
|
||||||
|
|
||||||
QTest::newRow("success-internal") << "http://" << QtNetworkSettings::serverName() << "/qtest/rfc3252.txt" << ushort(80) << false << 200 << "OK" << 25962 << 25962;
|
QTest::newRow("success-internal") << "http://" << QtNetworkSettings::serverName() << "/qtest/rfc3252.txt" << ushort(80) << false << 200 << "OK" << 25962 << 25962;
|
||||||
QTest::newRow("success-external") << "http://" << "www.ietf.org" << "/rfc/rfc3252.txt" << ushort(80) << false << 200 << "OK" << 25962 << 25962;
|
|
||||||
|
|
||||||
QTest::newRow("failure-path") << "http://" << QtNetworkSettings::serverName() << "/t" << ushort(80) << false << 404 << "Not Found" << -1 << -1;
|
QTest::newRow("failure-path") << "http://" << QtNetworkSettings::serverName() << "/t" << ushort(80) << false << 404 << "Not Found" << -1 << -1;
|
||||||
QTest::newRow("failure-protocol") << "" << QtNetworkSettings::serverName() << "/qtest/rfc3252.txt" << ushort(80) << false << 400 << "Bad Request" << -1 << -1;
|
QTest::newRow("failure-protocol") << "" << QtNetworkSettings::serverName() << "/qtest/rfc3252.txt" << ushort(80) << false << 400 << "Bad Request" << -1 << -1;
|
||||||
|
@ -63,6 +63,7 @@ private slots:
|
|||||||
void collapseTextOnPriority();
|
void collapseTextOnPriority();
|
||||||
void task230994_iconSize();
|
void task230994_iconSize();
|
||||||
void task176137_autoRepeatOfAction();
|
void task176137_autoRepeatOfAction();
|
||||||
|
void qtbug_26956_popupTimerDone();
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
void sendMouseClick();
|
void sendMouseClick();
|
||||||
@ -223,5 +224,14 @@ void tst_QToolButton::sendMouseClick()
|
|||||||
QTest::mouseClick(w, Qt::LeftButton, 0, QPoint(7,7));
|
QTest::mouseClick(w, Qt::LeftButton, 0, QPoint(7,7));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QToolButton::qtbug_26956_popupTimerDone()
|
||||||
|
{
|
||||||
|
QToolButton *tb = new QToolButton;
|
||||||
|
tb->setMenu(new QMenu(tb));
|
||||||
|
tb->menu()->addAction("Qt");
|
||||||
|
tb->deleteLater();
|
||||||
|
tb->showMenu();
|
||||||
|
}
|
||||||
|
|
||||||
QTEST_MAIN(tst_QToolButton)
|
QTEST_MAIN(tst_QToolButton)
|
||||||
#include "tst_qtoolbutton.moc"
|
#include "tst_qtoolbutton.moc"
|
||||||
|
Loading…
Reference in New Issue
Block a user