summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomasz Olszak <olszak.tomasz@gmail.com>2014-01-15 09:58:45 +0100
committerTomasz Olszak <olszak.tomasz@gmail.com>2014-01-15 10:30:36 +0100
commitd33692c281e53f620a03a17b8444a3646535de9c (patch)
tree06ab43d1a71df8f4dc949bbb3ba380ef4e4ef561
parent810c13259aa8f4f0d9a4d3ed1e57e15e59737914 (diff)
parent6233f006df24495587fbb784c33478f034ac2df0 (diff)
downloadqtbase-d33692c281e53f620a03a17b8444a3646535de9c.tar.gz
qtbase-d33692c281e53f620a03a17b8444a3646535de9c.tar.bz2
qtbase-d33692c281e53f620a03a17b8444a3646535de9c.zip
Merge remote-tracking branch 'origin/stable' into wip/tizen
Change-Id: If27e14120e775ea4fcd93ffd015063230ea8a184
-rwxr-xr-xconfig.tests/unix/arch.test20
-rwxr-xr-xconfigure4
-rw-r--r--doc/global/qt-cpp-defines.qdocconf1
-rw-r--r--mkspecs/features/simd.prf12
-rw-r--r--qmake/generators/win32/msbuild_objectmodel.cpp7
-rw-r--r--qmake/generators/win32/msvc_objectmodel.cpp7
-rw-r--r--src/3rdparty/zlib/zconf.h1
-rw-r--r--src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java24
-rw-r--r--src/corelib/corelib.pro14
-rw-r--r--src/corelib/global/qglobal.h24
-rw-r--r--src/corelib/global/qlogging.cpp2
-rw-r--r--src/corelib/global/qtypeinfo.h2
-rw-r--r--src/corelib/io/qfile.cpp5
-rw-r--r--src/corelib/io/qfilesystemwatcher.cpp1
-rw-r--r--src/corelib/plugin/qlibrary.cpp3
-rw-r--r--src/corelib/tools/qdatetime.cpp14
-rw-r--r--src/corelib/tools/qlocale_win.cpp3
-rw-r--r--src/corelib/tools/qstring.cpp35
-rw-r--r--src/corelib/tools/qstring_mips_dsp_asm.S449
-rw-r--r--src/corelib/tools/tools.pri4
-rw-r--r--src/gui/image/image.pri2
-rw-r--r--src/gui/image/qimage.cpp6
-rw-r--r--src/gui/image/qimage_mips_dspr2.cpp (renamed from src/widgets/widgets/qcocoatoolbardelegate_mac_p.h)46
-rw-r--r--src/gui/image/qimage_mips_dspr2_asm.S207
-rw-r--r--src/gui/kernel/qguiapplication.cpp2
-rw-r--r--src/gui/kernel/qguiapplication_p.h3
-rw-r--r--src/gui/kernel/qwindowsysteminterface_p.h4
-rw-r--r--src/gui/opengl/qtriangulator.cpp9
-rw-r--r--src/gui/painting/qdrawhelper.cpp17
-rw-r--r--src/gui/painting/qdrawhelper_mips_dsp.cpp97
-rw-r--r--src/gui/painting/qdrawhelper_mips_dsp_asm.S478
-rw-r--r--src/gui/painting/qdrawhelper_mips_dsp_p.h45
-rw-r--r--src/gui/painting/qdrawhelper_mips_dspr2_asm.S550
-rw-r--r--src/gui/painting/qpdf.cpp6
-rw-r--r--src/gui/painting/qpdf_p.h1
-rw-r--r--src/gui/painting/qpdfwriter.cpp2
-rw-r--r--src/gui/painting/qt_mips_asm_dsp_p.h166
-rw-r--r--src/platformsupport/eglconvenience/qeglplatformcontext.cpp4
-rw-r--r--src/platformsupport/eglconvenience/qeglplatformcontext_p.h1
-rw-r--r--src/platformsupport/input/evdevtouch/qevdevtouch_p.h7
-rw-r--r--src/plugins/bearer/connman/qconnmanengine.cpp40
-rw-r--r--src/plugins/bearer/connman/qconnmanengine.h2
-rw-r--r--src/plugins/bearer/connman/qconnmanservice_linux.cpp16
-rw-r--r--src/plugins/bearer/connman/qconnmanservice_linux_p.h5
-rw-r--r--src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp6
-rw-r--r--src/plugins/platforms/cocoa/qcocoabackingstore.mm3
-rw-r--r--src/plugins/platforms/cocoa/qcocoanativeinterface.h3
-rw-r--r--src/plugins/platforms/cocoa/qcocoanativeinterface.mm17
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.h6
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm41
-rw-r--r--src/plugins/platforms/cocoa/qnsview.mm6
-rw-r--r--src/plugins/platforms/kms/qkmscursor.h5
-rw-r--r--src/plugins/platforms/kms/qkmsdevice.h3
-rw-r--r--src/plugins/platforms/windows/qwindowsdialoghelpers.cpp6
-rw-r--r--src/plugins/platforms/windows/qwindowsscreen.cpp2
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp6
-rw-r--r--src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp7
-rw-r--r--src/testlib/qbenchmarkperfevents.cpp20
-rw-r--r--src/testlib/qplaintestlogger.cpp10
-rw-r--r--src/tools/qdoc/config.cpp51
-rw-r--r--src/tools/qdoc/qdoc.pro6
-rw-r--r--src/widgets/itemviews/qlistview.cpp5
-rw-r--r--src/widgets/kernel/qwidget.cpp95
-rw-r--r--src/widgets/kernel/qwidget_p.h3
-rw-r--r--src/widgets/kernel/qwidget_qpa.cpp7
-rw-r--r--src/widgets/kernel/qwidgetbackingstore.cpp9
-rw-r--r--src/widgets/styles/qcommonstyle.cpp5
-rw-r--r--src/widgets/styles/qmacstyle_mac.mm79
-rw-r--r--src/widgets/widgets/qcocoatoolbardelegate_mac.mm151
-rw-r--r--src/widgets/widgets/qmainwindowlayout_mac.mm292
-rw-r--r--src/widgets/widgets/qtoolbar.cpp74
-rw-r--r--src/widgets/widgets/qtoolbar_p.h4
-rw-r--r--src/widgets/widgets/qtoolbarlayout.cpp23
-rw-r--r--src/widgets/widgets/widgets.pri9
-rw-r--r--src/xml/sax/qxml.cpp85
-rw-r--r--tests/auto/corelib/io/largefile/tst_largefile.cpp6
-rw-r--r--tests/auto/corelib/tools/qdate/tst_qdate.cpp7
-rw-r--r--tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp51
-rw-r--r--tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp19
-rw-r--r--tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp5
-rw-r--r--tests/auto/widgets/widgets/qscrollbar/tst_qscrollbar.cpp93
81 files changed, 2640 insertions, 928 deletions
diff --git a/config.tests/unix/arch.test b/config.tests/unix/arch.test
index 529ed5e547..7b1c01ce28 100755
--- a/config.tests/unix/arch.test
+++ b/config.tests/unix/arch.test
@@ -19,6 +19,24 @@ fi
LFLAGS="$SYSROOT_FLAG"
CXXFLAGS="$SYSROOT_FLAG"
+while [ "$#" -gt 0 ]; do
+ PARAM=$1
+ case $PARAM in
+ -L*|-l*)
+ LFLAGS="$LFLAGS $PARAM"
+ ;;
+ -I*)
+ INC=`echo $PARAM | sed -e 's/^-I//'`
+ INCLUDEPATH="$INCLUDEPATH $INC"
+ ;;
+ -D*)
+ CXXFLAGS="$CXXFLAGS $PARAM"
+ ;;
+ *) ;;
+ esac
+ shift
+done
+
# debuggery
[ "$VERBOSE" = "yes" ] && echo "Determining architecture... ($*)"
@@ -26,7 +44,7 @@ CXXFLAGS="$SYSROOT_FLAG"
test -d "$OUTDIR/config.tests/arch" || mkdir -p "$OUTDIR/config.tests/arch"
cd "$OUTDIR/config.tests/arch"
[ -f Makefile ] && $MAKE distclean >/dev/null 2>&1
-OUTDIR=$OUTDIR "$OUTDIR/bin/qmake" -nocache -spec "$QMKSPEC" "QT_BUILD_TREE=$OUTDIR" "LIBS+=$LFLAGS" "QMAKE_CXXFLAGS+=$CXXFLAGS" "CONFIG-=app_bundle" "$SRCDIR/config.tests/arch/arch$PROSUFFIX.pro" >/dev/null 2>&1 || echo "qmake is broken" >&2
+OUTDIR=$OUTDIR "$OUTDIR/bin/qmake" -nocache -spec "$QMKSPEC" "QT_BUILD_TREE=$OUTDIR" "LIBS+=$LFLAGS" "QMAKE_CXXFLAGS+=$CXXFLAGS" "INCLUDEPATH+=$INCLUDEPATH" "CONFIG-=app_bundle" "$SRCDIR/config.tests/arch/arch$PROSUFFIX.pro" >/dev/null 2>&1 || echo "qmake is broken" >&2
ARCH=""
diff --git a/configure b/configure
index b16b79fa81..aaa59bdf17 100755
--- a/configure
+++ b/configure
@@ -4153,7 +4153,7 @@ compileTest()
# Use config.tests/arch/arch.pro to have the compiler tell us what the target architecture is
OUTFILE=$outpath/arch.result
-"$unixtests/arch.test" "$XQMAKESPEC" $OPT_VERBOSE "$relpath" "$outpath" "$OUTFILE" "target"
+"$unixtests/arch.test" "$XQMAKESPEC" $OPT_VERBOSE "$relpath" "$outpath" "$OUTFILE" "target" $I_FLAGS $D_FLAGS $L_FLAGS
if [ $? -eq 0 ]; then
eval `cat "$OUTFILE"`
else
@@ -4166,7 +4166,7 @@ rm -f "$OUTFILE" 2>/dev/null
if [ "$QMAKESPEC" != "$XQMAKESPEC" ]; then
# Do the same test again, using the host compiler
- SYSROOT_FLAG= "$unixtests/arch.test" "$QMAKESPEC" $OPT_VERBOSE "$relpath" "$outpath" "$OUTFILE" "host"
+ SYSROOT_FLAG= "$unixtests/arch.test" "$QMAKESPEC" $OPT_VERBOSE "$relpath" "$outpath" "$OUTFILE" "host" $I_FLAGS $D_FLAGS $L_FLAGS
if [ $? -eq 0 ]; then
eval `cat "$OUTFILE"`
else
diff --git a/doc/global/qt-cpp-defines.qdocconf b/doc/global/qt-cpp-defines.qdocconf
index 528b0cd561..37fa5dbdcf 100644
--- a/doc/global/qt-cpp-defines.qdocconf
+++ b/doc/global/qt-cpp-defines.qdocconf
@@ -30,6 +30,7 @@ Cpp.ignoretokens += \
Q_DECL_DEPRECATED \
Q_DECL_NOEXCEPT \
Q_DECL_NOTHROW \
+ Q_DECL_UNUSED \
Q_DECLARATIVE_EXPORT \
Q_EXPLICIT \
Q_EXPORT \
diff --git a/mkspecs/features/simd.prf b/mkspecs/features/simd.prf
index a98683d929..ad8c545819 100644
--- a/mkspecs/features/simd.prf
+++ b/mkspecs/features/simd.prf
@@ -174,10 +174,19 @@ QT_CPU_FEATURES = $$eval(QT_CPU_FEATURES.$$QT_ARCH)
mips_dsp_assembler.name = assembling[mips_dsp] ${QMAKE_FILE_IN}
silent:mips_dsp_assembler.commands = @echo assembling[mips_dsp] ${QMAKE_FILE_IN} && $$mips_dsp_assembler.commands
QMAKE_EXTRA_COMPILERS += mips_dsp_compiler
+ QMAKE_EXTRA_COMPILERS += mips_dsp_assembler
}
mips_dspr2 {
HEADERS += $$MIPS_DSP_HEADERS
+ mips_dspr2_compiler.commands = $$QMAKE_CXX -c
+ mips_dspr2_compiler.commands += $(CXXFLAGS) $(INCPATH) ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
+ mips_dspr2_compiler.dependency_type = TYPE_C
+ mips_dspr2_compiler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_OBJ)}
+ mips_dspr2_compiler.input = MIPS_DSPR2_SOURCES
+ mips_dspr2_compiler.variable_out = OBJECTS
+ mips_dspr2_compiler.name = compiling[mips_dspr2] ${QMAKE_FILE_IN}
+ silent:mips_dspr2_compiler.commands = @echo compiling[mips_dspr2] ${QMAKE_FILE_IN} && $$mips_dspr2_compiler.commands
mips_dspr2_assembler.commands = $$QMAKE_CC -c
mips_dspr2_assembler.commands += $(CFLAGS) $(INCPATH) ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
mips_dspr2_assembler.dependency_type = TYPE_C
@@ -186,6 +195,7 @@ QT_CPU_FEATURES = $$eval(QT_CPU_FEATURES.$$QT_ARCH)
mips_dspr2_assembler.variable_out = OBJECTS
mips_dspr2_assembler.name = assembling[mips_dspr2] ${QMAKE_FILE_IN}
silent:mips_dspr2_assembler.commands = @echo assembling[mips_dspr2] ${QMAKE_FILE_IN} && $$mips_dspr2_assembler.commands
+ QMAKE_EXTRA_COMPILERS += mips_dspr2_compiler
QMAKE_EXTRA_COMPILERS += mips_dspr2_assembler
}
} else:win32-msvc*|winrt {
@@ -297,7 +307,7 @@ QT_CPU_FEATURES = $$eval(QT_CPU_FEATURES.$$QT_ARCH)
$$AVX_SOURCES $$AVX2_SOURCES \
$$NEON_SOURCES $$NEON_ASM \
$$IWMMXT_SOURCES \
- $$MIPS_DSP_SOURCES $$MIPS_DSP_ASM $$MIPS_DSPR2_ASM
+ $$MIPS_DSP_SOURCES $$MIPS_DSPR2_SOURCES $$MIPS_DSP_ASM $$MIPS_DSPR2_ASM
# Headers are already done in the above sections.
}
diff --git a/qmake/generators/win32/msbuild_objectmodel.cpp b/qmake/generators/win32/msbuild_objectmodel.cpp
index f5a6e15a7b..d1420e95f6 100644
--- a/qmake/generators/win32/msbuild_objectmodel.cpp
+++ b/qmake/generators/win32/msbuild_objectmodel.cpp
@@ -44,6 +44,7 @@
#include "msvc_objectmodel.h"
#include "msvc_vcproj.h"
#include "msvc_vcxproj.h"
+#include <qscopedpointer.h>
#include <qstringlist.h>
#include <qfileinfo.h>
@@ -1756,11 +1757,11 @@ void VCXProjectWriter::addFilters(VCProject &project, XmlOutput &xmlFilter, cons
// outputs a given filter for all existing configurations of a project
void VCXProjectWriter::outputFilter(VCProject &project, XmlOutput &xml, XmlOutput &xmlFilter, const QString &filtername)
{
- XNode *root;
+ QScopedPointer<XNode> root;
if (project.SingleProjects.at(0).flat_files)
- root = new XFlatNode;
+ root.reset(new XFlatNode);
else
- root = new XTreeNode;
+ root.reset(new XTreeNode);
for (int i = 0; i < project.SingleProjects.count(); ++i) {
VCFilter filter;
diff --git a/qmake/generators/win32/msvc_objectmodel.cpp b/qmake/generators/win32/msvc_objectmodel.cpp
index 019bb2504d..8159cf58e2 100644
--- a/qmake/generators/win32/msvc_objectmodel.cpp
+++ b/qmake/generators/win32/msvc_objectmodel.cpp
@@ -42,6 +42,7 @@
#include "msvc_objectmodel.h"
#include "msvc_vcproj.h"
#include "msvc_vcxproj.h"
+#include <qscopedpointer.h>
#include <qstringlist.h>
#include <qfileinfo.h>
@@ -2854,11 +2855,11 @@ void VCProjectWriter::write(XmlOutput &xml, VCFilter &tool)
// outputs a given filter for all existing configurations of a project
void VCProjectWriter::outputFilter(VCProject &project, XmlOutput &xml, const QString &filtername)
{
- Node *root;
+ QScopedPointer<Node> root;
if (project.SingleProjects.at(0).flat_files)
- root = new FlatNode;
+ root.reset(new FlatNode);
else
- root = new TreeNode;
+ root.reset(new TreeNode);
QString name, extfilter, guid;
triState parse = unset;
diff --git a/src/3rdparty/zlib/zconf.h b/src/3rdparty/zlib/zconf.h
index dc52489bc2..d01f20bc07 100644
--- a/src/3rdparty/zlib/zconf.h
+++ b/src/3rdparty/zlib/zconf.h
@@ -107,6 +107,7 @@
# define zcfree z_zcfree
# define zlibCompileFlags z_zlibCompileFlags
# define zlibVersion z_zlibVersion
+# define z_errmsg z_z_errmsg
/* all zlib typedefs in zlib.h and zconf.h */
# define Byte z_Byte
diff --git a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java
index 6762717d91..b2f92c04e9 100644
--- a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java
+++ b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java
@@ -34,6 +34,7 @@ import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.DataOutputStream;
import java.io.DataInputStream;
+import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
@@ -816,6 +817,21 @@ public class QtActivity extends Activity
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
+
+ try {
+ m_activityInfo = getPackageManager().getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);
+ for (Field f : Class.forName("android.R$style").getDeclaredFields()) {
+ if (f.getInt(null) == m_activityInfo.getThemeResource()) {
+ QT_ANDROID_THEMES = new String[] {f.getName()};
+ QT_ANDROID_DEFAULT_THEME = f.getName();
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ finish();
+ return;
+ }
+
try {
setTheme(Class.forName("android.R$style").getDeclaredField(QT_ANDROID_DEFAULT_THEME).getInt(null));
} catch (Exception e) {
@@ -840,14 +856,6 @@ public class QtActivity extends Activity
ENVIRONMENT_VARIABLES += "\tQT_ANDROID_THEME=" + QT_ANDROID_DEFAULT_THEME
+ "/\tQT_ANDROID_THEME_DISPLAY_DPI=" + getResources().getDisplayMetrics().densityDpi + "\t";
- try {
- m_activityInfo = getPackageManager().getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);
- } catch (NameNotFoundException e) {
- e.printStackTrace();
- finish();
- return;
- }
-
if (null == getLastNonConfigurationInstance()) {
// if splash screen is defined, then show it
if (m_activityInfo.metaData.containsKey("android.app.splash_screen") )
diff --git a/src/corelib/corelib.pro b/src/corelib/corelib.pro
index b513149e7c..df28183fdc 100644
--- a/src/corelib/corelib.pro
+++ b/src/corelib/corelib.pro
@@ -111,3 +111,17 @@ ctest_qt5_module_files.files += $$ctest_macros_file.output $$cmake_extras_mkspec
ctest_qt5_module_files.path = $$[QT_INSTALL_LIBS]/cmake/Qt5Core
INSTALLS += ctest_qt5_module_files cmake_qt5_umbrella_module_files
+
+mips_dsp:*-g++* {
+ HEADERS += $$MIPS_DSP_HEADERS
+
+ mips_dsp_corelib_assembler.commands = $$QMAKE_CXX -c
+ mips_dsp_corelib_assembler.commands += $(CXXFLAGS) $(INCPATH) -mips32r2 -mdsp ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
+ mips_dsp_corelib_assembler.dependency_type = TYPE_C
+ mips_dsp_corelib_assembler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_OBJ)}
+ mips_dsp_corelib_assembler.input = MIPS_DSP_ASM
+ mips_dsp_corelib_assembler.variable_out = OBJECTS
+ mips_dsp_corelib_assembler.name = assembling[mips_dsp] ${QMAKE_FILE_IN}
+ silent:mips_dsp_corelib_assembler.commands = @echo assembling[mips_dsp] ${QMAKE_FILE_IN} && $$mips_dsp_corelib_assembler.commands
+ QMAKE_EXTRA_COMPILERS += mips_dsp_corelib_assembler
+}
diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h
index 6ec244dbee..d8c987d2e0 100644
--- a/src/corelib/global/qglobal.h
+++ b/src/corelib/global/qglobal.h
@@ -706,13 +706,13 @@ typedef void (*QFunctionPointer)();
# define Q_UNIMPLEMENTED() qWarning("%s:%d: %s: Unimplemented code.", __FILE__, __LINE__, Q_FUNC_INFO)
#endif
-Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(double p1, double p2) Q_REQUIRED_RESULT;
+Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(double p1, double p2) Q_REQUIRED_RESULT Q_DECL_UNUSED;
Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(double p1, double p2)
{
return (qAbs(p1 - p2) * 1000000000000. <= qMin(qAbs(p1), qAbs(p2)));
}
-Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(float p1, float p2) Q_REQUIRED_RESULT;
+Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(float p1, float p2) Q_REQUIRED_RESULT Q_DECL_UNUSED;
Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(float p1, float p2)
{
return (qAbs(p1 - p2) * 100000.f <= qMin(qAbs(p1), qAbs(p2)));
@@ -721,7 +721,7 @@ Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(float p1, float p2)
/*!
\internal
*/
-Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(double d) Q_REQUIRED_RESULT;
+Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(double d) Q_REQUIRED_RESULT Q_DECL_UNUSED;
Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(double d)
{
return qAbs(d) <= 0.000000000001;
@@ -730,7 +730,7 @@ Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(double d)
/*!
\internal
*/
-Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(float f) Q_REQUIRED_RESULT;
+Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(float f) Q_REQUIRED_RESULT Q_DECL_UNUSED;
Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(float f)
{
return qAbs(f) <= 0.00001f;
@@ -741,7 +741,7 @@ Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(float f)
check whether the actual value is 0 or close to 0, but whether
it is binary 0, disregarding sign.
*/
-static inline bool qIsNull(double d) Q_REQUIRED_RESULT;
+static inline bool qIsNull(double d) Q_REQUIRED_RESULT Q_DECL_UNUSED;
static inline bool qIsNull(double d)
{
union U {
@@ -758,7 +758,7 @@ static inline bool qIsNull(double d)
check whether the actual value is 0 or close to 0, but whether
it is binary 0, disregarding sign.
*/
-static inline bool qIsNull(float f) Q_REQUIRED_RESULT;
+static inline bool qIsNull(float f) Q_REQUIRED_RESULT Q_DECL_UNUSED;
static inline bool qIsNull(float f)
{
union U {
@@ -819,18 +819,18 @@ Q_CORE_EXPORT void qFreeAligned(void *ptr);
#endif
#if defined(QT_NO_WARNINGS)
# if defined(Q_CC_MSVC)
-# pragma warning(disable: 4251) /* class 'A' needs to have dll interface for to be used by clients of class 'B'. */
-# pragma warning(disable: 4244) /* 'conversion' conversion from 'type1' to 'type2', possible loss of data */
+# pragma warning(disable: 4251) /* class 'type' needs to have dll-interface to be used by clients of class 'type2' */
+# pragma warning(disable: 4244) /* conversion from 'type1' to 'type2', possible loss of data */
# pragma warning(disable: 4275) /* non - DLL-interface classkey 'identifier' used as base for DLL-interface classkey 'identifier' */
-# pragma warning(disable: 4514) /* unreferenced inline/local function has been removed */
+# pragma warning(disable: 4514) /* unreferenced inline function has been removed */
# pragma warning(disable: 4800) /* 'type' : forcing value to bool 'true' or 'false' (performance warning) */
# pragma warning(disable: 4097) /* typedef-name 'identifier1' used as synonym for class-name 'identifier2' */
# pragma warning(disable: 4706) /* assignment within conditional expression */
-# pragma warning(disable: 4786) /* truncating debug info after 255 characters */
+# pragma warning(disable: 4786) /* 'identifier' : identifier was truncated to 'number' characters in the debug information */
# pragma warning(disable: 4355) /* 'this' : used in base member initializer list */
-# pragma warning(disable: 4231) /* nonstandard extension used : 'extern' before template explicit instantiation */
+# pragma warning(disable: 4231) /* nonstandard extension used : 'identifier' before template explicit instantiation */
# pragma warning(disable: 4710) /* function not inlined */
-# pragma warning(disable: 4530) /* C++ exception handler used, but unwind semantics are not enabled. Specify -GX */
+# pragma warning(disable: 4530) /* C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc */
# elif defined(Q_CC_BOR)
# pragma option -w-inl
# pragma option -w-aus
diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp
index cc20891c76..5b7a674ddb 100644
--- a/src/corelib/global/qlogging.cpp
+++ b/src/corelib/global/qlogging.cpp
@@ -102,7 +102,7 @@ static inline bool hasStdErr()
}
# endif // !Q_OS_WINCE && !Q_OS_WINRT
-bool qWinLogToStderr()
+Q_CORE_EXPORT bool qWinLogToStderr()
{
# if !defined(Q_OS_WINCE) && !defined(Q_OS_WINRT)
static const bool result = hasStdErr();
diff --git a/src/corelib/global/qtypeinfo.h b/src/corelib/global/qtypeinfo.h
index 58736ac2b8..5837c8d94e 100644
--- a/src/corelib/global/qtypeinfo.h
+++ b/src/corelib/global/qtypeinfo.h
@@ -207,7 +207,7 @@ Q_DECLARE_TYPEINFO_BODY(QFlags<T>, Q_PRIMITIVE_TYPE);
#define Q_DECLARE_SHARED_STL(TYPE) \
QT_END_NAMESPACE \
namespace std { \
- template<> inline void swap<QT_PREPEND_NAMESPACE(TYPE)>(QT_PREPEND_NAMESPACE(TYPE) &value1, QT_PREPEND_NAMESPACE(TYPE) &value2) \
+ template<> inline void swap< QT_PREPEND_NAMESPACE(TYPE) >(QT_PREPEND_NAMESPACE(TYPE) &value1, QT_PREPEND_NAMESPACE(TYPE) &value2) \
{ value1.swap(value2); } \
} \
QT_BEGIN_NAMESPACE
diff --git a/src/corelib/io/qfile.cpp b/src/corelib/io/qfile.cpp
index 519ac009aa..82aee331c5 100644
--- a/src/corelib/io/qfile.cpp
+++ b/src/corelib/io/qfile.cpp
@@ -571,6 +571,8 @@ QFile::rename(const QString &newName)
d->setError(QFile::RenameError, tr("Destination file exists"));
return false;
}
+#ifndef QT_NO_TEMPORARYFILE
+ // This #ifndef disables the workaround it encloses. Therefore, this configuration is not recommended.
#ifdef Q_OS_LINUX
// rename() on Linux simply does nothing when renaming "foo" to "Foo" on a case-insensitive
// FS, such as FAT32. Move the file away and rename in 2 steps to work around.
@@ -598,7 +600,8 @@ QFile::rename(const QString &newName)
arg(QDir::toNativeSeparators(tempFile.fileName()), tempFile.errorString()));
}
return false;
-#endif
+#endif // Q_OS_LINUX
+#endif // QT_NO_TEMPORARYFILE
}
unsetError();
close();
diff --git a/src/corelib/io/qfilesystemwatcher.cpp b/src/corelib/io/qfilesystemwatcher.cpp
index 44bbe55719..d1deae2d7b 100644
--- a/src/corelib/io/qfilesystemwatcher.cpp
+++ b/src/corelib/io/qfilesystemwatcher.cpp
@@ -77,6 +77,7 @@ QFileSystemWatcherEngine *QFileSystemWatcherPrivate::createNativeEngine(QObject
#elif defined(Q_OS_FREEBSD) || defined(Q_OS_MAC)
return QKqueueFileSystemWatcherEngine::create(parent);
#else
+ Q_UNUSED(parent);
return 0;
#endif
}
diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp
index 77de4d594e..468f759189 100644
--- a/src/corelib/plugin/qlibrary.cpp
+++ b/src/corelib/plugin/qlibrary.cpp
@@ -256,7 +256,8 @@ static bool findPatternUnloaded(const QString &library, QLibraryPrivate *lib)
*/
bool hasMetaData = false;
long pos = 0;
- const char pattern[] = "QTMETADATA ";
+ char pattern[] = "qTMETADATA ";
+ pattern[0] = 'Q'; // Ensure the pattern "QTMETADATA" is not found in this library should QPluginLoader ever encounter it.
const ulong plen = qstrlen(pattern);
#if defined (Q_OF_ELF) && defined(Q_CC_GNU)
int r = QElfParser().parse(filedata, fdlen, library, lib, &pos, &fdlen);
diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp
index 42721c018f..5438f00c67 100644
--- a/src/corelib/tools/qdatetime.cpp
+++ b/src/corelib/tools/qdatetime.cpp
@@ -1281,6 +1281,11 @@ QDate QDate::fromString(const QString& string, Qt::DateFormat format)
}
#endif // QT_NO_TEXTDATE
case Qt::ISODate: {
+ // Semi-strict parsing, must be long enough and have non-numeric separators
+ if (string.size() < 10 || string.at(4).isDigit() || string.at(7).isDigit()
+ || (string.size() > 10 && string.at(10).isDigit())) {
+ return QDate();
+ }
const int year = string.mid(0, 4).toInt();
if (year <= 0 || year > 9999)
return QDate();
@@ -2764,6 +2769,15 @@ void QDateTimePrivate::refreshDateTime()
return;
}
+#ifndef QT_BOOTSTRAPPED
+ // If not valid time zone then is invalid
+ if (m_spec == Qt::TimeZone && !m_timeZone.isValid()) {
+ clearValidDateTime();
+ m_offsetFromUtc = 0;
+ return;
+ }
+#endif // QT_BOOTSTRAPPED
+
// We have a valid date and time and a Qt::LocalTime or Qt::TimeZone that needs calculating
// LocalTime and TimeZone might fall into "missing" DaylightTime transition hour
// Calling toEpochMSecs will adjust the returned date/time if it does
diff --git a/src/corelib/tools/qlocale_win.cpp b/src/corelib/tools/qlocale_win.cpp
index 3a083582c9..c20827a4ae 100644
--- a/src/corelib/tools/qlocale_win.cpp
+++ b/src/corelib/tools/qlocale_win.cpp
@@ -279,6 +279,9 @@ QVariant QSystemLocalePrivate::dateTimeFormat(QLocale::FormatType type)
QVariant QSystemLocalePrivate::dayName(int day, QLocale::FormatType type)
{
+ if (day < 1 || day > 7)
+ return QString();
+
static const LCTYPE short_day_map[]
= { LOCALE_SABBREVDAYNAME1, LOCALE_SABBREVDAYNAME2,
LOCALE_SABBREVDAYNAME3, LOCALE_SABBREVDAYNAME4, LOCALE_SABBREVDAYNAME5,
diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp
index 3976f2cb6f..d682207314 100644
--- a/src/corelib/tools/qstring.cpp
+++ b/src/corelib/tools/qstring.cpp
@@ -188,9 +188,23 @@ static int ucstricmp(const ushort *a, const ushort *ae, const uchar *b, const uc
return 1;
}
+#if defined(__mips_dsp)
+// From qstring_mips_dsp_asm.S
+extern "C" int qt_ucstrncmp_mips_dsp_asm(const ushort *a,
+ const ushort *b,
+ unsigned len);
+#endif
+
// Unicode case-sensitive compare two same-sized strings
static int ucstrncmp(const QChar *a, const QChar *b, int l)
{
+#if defined(__mips_dsp)
+ if (l >= 8) {
+ return qt_ucstrncmp_mips_dsp_asm(reinterpret_cast<const ushort*>(a),
+ reinterpret_cast<const ushort*>(b),
+ l);
+ }
+#endif // __mips_dsp
while (l-- && *a == *b)
a++,b++;
if (l==-1)
@@ -3937,6 +3951,10 @@ static inline __m128i mergeQuestionMarks(__m128i chunk)
}
#endif
+#if defined(__mips_dsp)
+extern "C" void qt_toLatin1_mips_dsp_asm(uchar *dst, const ushort *src, int length);
+#endif
+
static QByteArray toLatin1_helper(const QChar *data, int length)
{
QByteArray ba;
@@ -3989,10 +4007,14 @@ static QByteArray toLatin1_helper(const QChar *data, int length)
length = length % 8;
}
#endif
+#if defined(__mips_dsp)
+ qt_toLatin1_mips_dsp_asm(dst, src, length);
+#else
while (length--) {
*dst++ = (*src>0xff) ? '?' : (uchar) *src;
++src;
}
+#endif
}
return ba;
}
@@ -4104,6 +4126,12 @@ QVector<uint> QString::toUcs4() const
return v;
}
+#if defined(__mips_dsp)
+// From qstring_mips_dsp_asm.S
+extern "C" void qt_fromlatin1_mips_asm_unroll4 (ushort*, const char*, uint);
+extern "C" void qt_fromlatin1_mips_asm_unroll8 (ushort*, const char*, uint);
+#endif
+
QString::Data *QString::fromLatin1_helper(const char *str, int size)
{
Data *d;
@@ -4144,8 +4172,15 @@ QString::Data *QString::fromLatin1_helper(const char *str, int size)
size = size % 16;
}
#endif
+#if defined(__mips_dsp)
+ if (size > 20)
+ qt_fromlatin1_mips_asm_unroll8(dst, str, size);
+ else
+ qt_fromlatin1_mips_asm_unroll4(dst, str, size);
+#else
while (size--)
*dst++ = (uchar)*str++;
+#endif
}
return d;
}
diff --git a/src/corelib/tools/qstring_mips_dsp_asm.S b/src/corelib/tools/qstring_mips_dsp_asm.S
new file mode 100644
index 0000000000..aee162c290
--- /dev/null
+++ b/src/corelib/tools/qstring_mips_dsp_asm.S
@@ -0,0 +1,449 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "../../gui/painting/qt_mips_asm_dsp_p.h"
+
+.macro EXTRACT_HALVES_x2 src1, src2, hi_1, hi_2
+#if defined(__MIPSEL) && __MIPSEL
+ srl \hi_1, \src1, 16
+ ext \src1, \src1, 0, 16
+ srl \hi_2, \src2, 16
+ ext \src2, \src2, 0, 16
+#else
+ ext \hi_1, \src1, 0, 16
+ srl \src1, \src1, 16
+ ext \hi_2, \src2, 0, 16
+ srl \src2, \src2, 16
+#endif
+.endm
+
+
+LEAF_MIPS_DSP(qt_ucstrncmp_mips_dsp_asm)
+/*
+ * Arguments:
+ * a0 - string_a (uint16_t*)
+ * a1 - string_b (uint16_t*)
+ * a2 - length (uint32_t)
+ *
+ * Register usage:
+ * t0 - batches
+ */
+
+ move v0, zero /* result = 0 */
+ andi t0, a0, 0x3 /* t1 = string_a % 4 */
+ andi t1, a1, 0x3 /* t0 = string_b % 4 */
+ or t2, t0, t1 /* t2 = t0 | t1 */
+
+ beqz t2, 5f /* both aligned */
+ and t2, t0 ,t1
+ beqz t2, 6f /* one aligned */
+ nop
+
+ /*
+ * Both strings are unaligned: read 1 halfword from each,
+ * then fall-off to continue with the both-aligned case.
+ */
+ lhu t0, 0 (a0)
+ lhu t1, 0 (a1)
+ addiu a2, a2, -1 /* len-- */
+ sub v0, t0, t1 /* v0 = t0-t1 */
+ addiu a0, a0, 2 /* string_a++ */
+ bnez v0, 0f /* if (t0-t1): return */
+ addiu a1, a1, 2 /* string_b++ */
+ beqz a2, 0f /* if !len: return */
+ /* next instruction (srl) fills delay branch slot */
+
+5: /* Both string pointers are aligned */
+ srl t0, a2, 3 /* batches = length / 8 */
+ beqz t0, 9f /* if !batches: tail */
+ andi a2, a2, 0x7 /* length = length % 8 */
+
+ SAVE_REGS_ON_STACK 0, s0, s1, s2, s3
+
+1: lw t1, 0 (a0) /* [a0 a1] */
+ lw t3, 4 (a0) /* [a2 a3] */
+ lw t5, 8 (a0) /* [a4 a5] */
+ lw t7, 12 (a0) /* [a6 a7] */
+
+ lw t2, 0 (a1) /* [b0 b1] */
+ lw t4, 4 (a1) /* [b2 b3] */
+ lw t6, 8 (a1) /* [b4 b5] */
+ lw t8, 12 (a1) /* [b6 b7] */
+
+ /*
+ * Subtract elements one by one, if the result is zero
+ * both halves of the registers (shorts) are equal.
+ */
+ subq.ph s0, t1, t2 /* [a0-b0 a1-b1] */
+ subq.ph s1, t3, t4 /* [a2-b2 a3-b3] */
+
+ bnez s0, 1f
+ subq.ph s2, t5, t6 /* [a4-b4 a5-b5] */
+ bnez s1, 2f
+ subq.ph s3, t7, t8 /* [a6-b6 a7-b7] */
+ bnez s2, 3f
+ addiu t0, t0, -1 /* batches-- */
+ bnez s3, 4f
+ addiu a0, a0, 8*2 /* string_a += 8 */
+
+ bnez t0, 1b /* if batches: loop */
+ addiu a1, a1, 8*2 /* string_b += 8 */
+
+ RESTORE_REGS_FROM_STACK 0, s0, s1, s2, s3
+
+ bnez a2, 9f /* if length: tail */
+ nop
+ jr ra
+ nop
+
+
+ 1: /* Check t1 [a0 a1] vs. t2 [b0 b1] */
+ EXTRACT_HALVES_x2 t1, t2, t3, t4 /* a0, b0, a1, b1 */
+ sub v0, t1, t2
+ RESTORE_REGS_FROM_STACK 0, s0, s1, s2, s3
+ bnez v0, 0f /* if (a0-b0): return */
+ nop
+ jr ra
+ sub v0, t3, t4 /* return a1-b1 */
+
+ 2: /* Check t3 [a2 a3] vs. t4 [b2 b3] */
+ EXTRACT_HALVES_x2 t3, t4, t1, t2 /* a2, b2, a3, b3 */
+ sub v0, t3, t4
+ RESTORE_REGS_FROM_STACK 0, s0, s1, s2, s3
+ bnez v0, 0f /* if (a2-b2): return */
+ nop
+ jr ra
+ sub v0, t1, t2 /* return a3-b3 */
+
+ 3: /* Check t5 [a4 a5] vs. t6 [b4 b5] */
+ EXTRACT_HALVES_x2 t5, t6, t1, t2 /* a4, b4, a5, b5 */
+ sub v0, t5, t6
+ RESTORE_REGS_FROM_STACK 0, s0, s1, s2, s3
+ bnez v0, 0f /* if (a4-b4): return */
+ nop
+ jr ra
+ sub v0, t1, t2 /* return a5-b5 */
+
+ 4: /* Check t7 [a6 a7] vs. t8 [b6 b7] */
+ EXTRACT_HALVES_x2 t7, t8, t1, t2 /* a6, b6, a7, b7 */
+ sub v0, t7, t8
+ RESTORE_REGS_FROM_STACK 0, s0, s1, s2, s3
+ bnez v0, 0f /* if (a6-b6): return */
+ nop
+ jr ra
+ sub v0, t1, t2
+
+
+ /* Process remaining tail items. */
+9: lhu t1, 0 (a0) /* a */
+ lhu t2, 0 (a1) /* b */
+ addiu a2, a2, -1 /* length-- */
+ sub v0, t1, t2 /* result = (a - b) */
+
+ bnez v0, 0f /* if (a - b): return */
+ addiu a0, a0, 2 /* string_a++ */
+
+ bnez a2, 9b /* if length: loop */
+ addiu a1, a1, 2 /* string_b++ */
+
+0: jr ra
+ nop
+
+
+ /* One of the inputs is unaligned, do unrolled half-word loads */
+6: srl t0, a2, 3 /* batches = length / 8 */
+ andi a2, a2, 0x7 /* length = length % 8 */
+
+1: lhu t1, 0 (a0)
+ lhu t2, 0 (a1)
+ lhu t3, 2 (a0)
+ lhu t4, 2 (a1)
+ lhu t5, 4 (a0)
+ lhu t6, 4 (a1)
+ lhu t7, 6 (a0)
+ lhu t8, 6 (a1)
+
+ sub v0, t1, t2
+ sub t1, t3, t4
+
+ bnez v0, 0f
+ sub t2, t5, t6
+ bnez t1, 2f
+ sub t3, t7, t8
+ bnez t2, 3f
+ lhu t1, 8 (a0)
+ bnez t3, 4f
+ lhu t2, 8 (a1)
+
+ lhu t3, 10 (a0)
+ lhu t4, 10 (a1)
+ lhu t5, 12 (a0)
+ lhu t6, 12 (a1)
+ lhu t7, 14 (a0)
+ lhu t8, 14 (a1)
+
+ sub v0, t1, t2
+ sub t1, t3, t4
+
+ bnez v0, 0f
+ sub t2, t5, t6
+ bnez t1, 2f
+ sub t3, t7, t8
+ bnez t2, 3f
+ addiu t0, t0, -1 /* batches-- */
+ bnez t3, 4f
+ addiu a0, a0, 8*2 /* string_a += 8 */
+
+ bnez t0, 1b
+ addiu a1, a1, 8*2 /* string_b += 8 */
+
+ bnez a2, 9b /* if length: tail */
+ nop
+
+0: jr ra
+ nop
+2: jr ra
+ move v0, t1
+3: jr ra
+ move v0, t2
+4: jr ra
+ move v0, t3
+
+END(qt_ucstrncmp_mips_dsp_asm)
+
+
+#if defined(__mips_dspr2)
+LEAF_MIPS_DSPR2(qt_fromlatin1_mips_asm_unroll8)
+#else
+LEAF_MIPS_DSP(qt_fromlatin1_mips_asm_unroll8)
+#endif
+
+ andi t0, a1, 0x3
+ beqz t0, 9f /* check that src is aligned */
+ nop
+
+1: lbu t1, 0 (a1)
+ addiu a1, a1, 1
+ addiu a2, a2, -1
+ sh t1, 0 (a0)
+ beqz a2, 0f
+ andi t0, a1, 0x3
+ bnez t0, 1b
+ addiu a0, a0, 2
+
+9: /* source pointer is aligned: do batches of 8 elements */
+ andi t0, a0, 3 /* check if dst is aligned */
+ bnez t0, 6f
+ srl t0, a2, 3 /* batches = len / 8 */
+ andi a2, a2, 0x7 /* tail = len % 8 */
+
+ beqz t0, 8f /* if !batches: tail */
+ nop
+
+1: lw t1, 0 (a1)
+ lw t2, 4 (a1)
+
+ addiu a1, a1, 8*1
+ addiu t0, t0, -1
+
+ preceu.ph.qbl t3, t1
+ preceu.ph.qbr t1, t1
+ preceu.ph.qbl t4, t2
+ preceu.ph.qbr t2, t2
+
+#if defined(__MIPSEL) && __MIPSEL
+ sw t1, 0 (a0)
+ sw t3, 4 (a0)
+ sw t2, 8 (a0)
+ sw t4, 12 (a0)
+#else
+ sw t3, 0 (a0)
+ sw t1, 4 (a0)
+ sw t4, 8 (a0)
+ sw t2, 12 (a0)
+#endif
+
+ bnez t0, 1b
+ addiu a0, a0, 8*2
+
+8: /* process tail items */
+ beqz a2, 0f
+ nop
+
+1: lbu t1, 0 (a1)
+ addiu a2, a2, -1
+ sh t1, 0 (a0)
+ addiu a1, a1, 1
+ bnez a2, 1b
+ addiu a0, a0, 2
+
+0: jr ra
+ nop
+
+6: beqz t0, 8b
+ andi a2, a2, 7
+7: lw t1, 0(a1)
+ lw t2, 4(a1)
+ addiu t0, t0, -1
+ addiu a1, a1, 8
+ andi t3, t1, 0xff
+#if defined(__mips_dspr2)
+ prepend t1, t2, 8
+#else
+ sll t4, t4, 24
+ srl t1, t1, 8
+ or t1, t1, t4
+#endif
+ srl t2, t2, 8
+ preceu.ph.qbr t4, t1
+ preceu.ph.qbl t1, t1
+ preceu.ph.qbr t5, t2
+ srl t2, t2, 16
+ sh t3, 0(a0)
+ sw t4, 2(a0)
+ sw t1, 6(a0)
+ sw t5, 10(a0)
+ sh t2, 14(a0)
+ bnez t0, 7b
+ addiu a0, a0, 16
+ bnez a2, 1b
+ nop
+
+ jr ra
+ nop
+
+END(qt_fromlatin1_mips_asm_unroll8)
+
+
+LEAF_MIPS_DSP(qt_fromlatin1_mips_asm_unroll4)
+/*
+ * Arguments:
+ * a0 - dst (uint16_t*)
+ * a1 - src (const char*)
+ * a2 - len (unsigned int)
+ */
+
+ /*
+ * QString::fromLatin1_helper() already handles the len==0
+ * case: assume that len is never zero.
+ */
+ srl t0, a2, 2
+ beqz t0, 9f
+ andi a2, a2, 0x3
+
+1: lbu t1, 0(a1)
+ lbu t2, 1(a1)
+ lbu t3, 2(a1)
+ lbu t4, 3(a1)
+ sh t1, 0(a0)
+ sh t2, 2(a0)
+ sh t3, 4(a0)
+ sh t4, 6(a0)
+ addiu t0, t0, -1
+ addiu a1, a1, 4
+ bnez t0, 1b
+ addiu a0, a0, 8
+
+8: beqz a2, 0f
+ nop
+
+9: lbu t1, 0(a1)
+ addiu a2, a2, -1
+ addiu a1, a1, 1
+ sh t1, 0(a0)
+ bnez a2, 9b
+ addiu a0, a0, 2
+
+0: jr ra
+ nop
+
+END(qt_fromlatin1_mips_asm_unroll4)
+
+
+LEAF_MIPS_DSP(qt_toLatin1_mips_dsp_asm)
+ /*
+ * a0 - dst
+ * a1 - src
+ * a2 - length
+ */
+
+ addiu t9, zero, 0x3f
+ srl t8, a2, 2
+ beqz t8, 2f
+ andi a2, a2, 3
+1:
+ lhu t0, 0(a1)
+ lhu t1, 2(a1)
+ lhu t2, 4(a1)
+ lhu t3, 6(a1)
+ srl t4, t0, 8
+ srl t5, t1, 8
+ srl t6, t2, 8
+ srl t7, t3, 8
+ movn t0, t9, t4
+ movn t1, t9, t5
+ movn t2, t9, t6
+ movn t3, t9, t7
+ addiu a1, a1, 8
+ addiu t8, t8, -1
+ sb t0, 0(a0)
+ sb t1, 1(a0)
+ sb t2, 2(a0)
+ sb t3, 3(a0)
+ bgtz t8, 1b
+ addiu a0, a0, 4
+2: beqz a2, 4f
+ nop
+3:
+ lhu t0, 0(a1)
+ addiu a1, a1, 2
+ addiu a2, a2, -1
+ srl t1, t0, 8
+ movn t0, t9, t1
+ sb t0, 0(a0)
+ bgtz a2, 3b
+ addiu a0, a0, 1
+4:
+ jr ra
+ nop
+
+END(qt_toLatin1_mips_dsp_asm)
+
diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri
index e4a7b02aee..cac596f0bc 100644
--- a/src/corelib/tools/tools.pri
+++ b/src/corelib/tools/tools.pri
@@ -192,3 +192,7 @@ INCLUDEPATH += ../3rdparty/md5 \
!macx-icc:!vxworks:unix:LIBS_PRIVATE += -lm
TR_EXCLUDE += ../3rdparty/*
+
+# MIPS DSP
+MIPS_DSP_ASM += tools/qstring_mips_dsp_asm.S
+MIPS_DSP_HEADERS += ../gui/painting/qt_mips_asm_dsp_p.h
diff --git a/src/gui/image/image.pri b/src/gui/image/image.pri
index a80ab4a2fe..bf4b5ddf01 100644
--- a/src/gui/image/image.pri
+++ b/src/gui/image/image.pri
@@ -78,3 +78,5 @@ NEON_SOURCES += image/qimage_neon.cpp
SSE2_SOURCES += image/qimage_sse2.cpp
SSSE3_SOURCES += image/qimage_ssse3.cpp
AVX_SOURCES += image/qimage_avx.cpp
+MIPS_DSPR2_SOURCES += image/qimage_mips_dspr2.cpp
+MIPS_DSPR2_ASM += image/qimage_mips_dspr2_asm.S
diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp
index 12ab5eaffa..70fe7b783f 100644
--- a/src/gui/image/qimage.cpp
+++ b/src/gui/image/qimage.cpp
@@ -3960,6 +3960,12 @@ void qInitImageConversions()
return;
}
#endif
+
+#ifdef QT_COMPILER_SUPPORTS_MIPS_DSPR2
+ extern bool convert_ARGB_to_ARGB_PM_inplace_mips_dspr2(QImageData *data, Qt::ImageConversionFlags);
+ inplace_converter_map[QImage::Format_ARGB32][QImage::Format_ARGB32_Premultiplied] = convert_ARGB_to_ARGB_PM_inplace_mips_dspr2;
+ return;
+#endif
}
extern const uchar *qt_pow_rgb_gamma();
diff --git a/src/widgets/widgets/qcocoatoolbardelegate_mac_p.h b/src/gui/image/qimage_mips_dspr2.cpp
index f74f608660..a1c40a16df 100644
--- a/src/widgets/widgets/qcocoatoolbardelegate_mac_p.h
+++ b/src/gui/image/qimage_mips_dspr2.cpp
@@ -1,9 +1,9 @@
/****************************************************************************
**
-** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com
** Contact: http://www.qt-project.org/legal
**
-** This file is part of the QtWidgets module of the Qt Toolkit.
+** This file is part of the QtGui module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
@@ -39,31 +39,31 @@
**
****************************************************************************/
+#include "qimage.h"
+#include <private/qimage_p.h>
+
+QT_BEGIN_NAMESPACE
+
+// Defined in qimage_mips_dspr2_asm.S
//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
+extern "C" void premultiply_argb_inplace_mips_asm(void*, unsigned, unsigned, int);
-#include "qmacdefines_mac.h"
-#import <Cocoa/Cocoa.h>
+bool convert_ARGB_to_ARGB_PM_inplace_mips_dspr2(QImageData *data, Qt::ImageConversionFlags)
+{
+ Q_ASSERT(data->format == QImage::Format_ARGB32);
-QT_BEGIN_NAMESPACE
-class QMainWindowLayout;
-class QToolBar;
-QT_END_NAMESPACE
+ if (!data->width || !data->height)
+ return true;
-@class NSToolbarItem;
+ Q_ASSERT((data->bytes_per_line - (data->width << 2)) >= 0);
-@interface QT_MANGLE_NAMESPACE(QCocoaToolBarDelegate) : NSObject {
- QT_PREPEND_NAMESPACE(QMainWindowLayout) *mainWindowLayout;
- NSToolbarItem *toolbarItem;
+ premultiply_argb_inplace_mips_asm(data->data,
+ data->height,
+ data->width,
+ data->bytes_per_line - (data->width << 2));
+
+ data->format = QImage::Format_ARGB32_Premultiplied;
+ return true;
}
-- (id)initWithMainWindowLayout:(QT_PREPEND_NAMESPACE(QMainWindowLayout) *)layout;
-@end
+QT_END_NAMESPACE
diff --git a/src/gui/image/qimage_mips_dspr2_asm.S b/src/gui/image/qimage_mips_dspr2_asm.S
new file mode 100644
index 0000000000..1f03b72dd4
--- /dev/null
+++ b/src/gui/image/qimage_mips_dspr2_asm.S
@@ -0,0 +1,207 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "../painting/qt_mips_asm_dsp_p.h"
+
+LEAF_MIPS_DSPR2(premultiply_argb_inplace_mips_asm)
+
+ SAVE_REGS_ON_STACK 0, s0, s1, s2, s3
+
+3: srl v1, a2, 3 /* t1 = linelen / 8 */
+ addiu a1, a1, -1 /* numlines-- */
+ beqz v1, 1f /* if (!(linelen / 8)): tail */
+ andi v0, a2, 0x7 /* v0 = linelen % 8 */
+ pref 5, 0 (a0) /* cache-hint: store-streamed */
+
+ /* unrolled loop, handles (v1 = len / 8) batches of 8 pixels */
+2: addiu v1, v1, -1
+ pref 5, 0(a0)
+ pref 5, 32(a0)
+
+ lw t0, 0(a0)
+ lw t1, 4(a0)
+ lw t2, 8(a0)
+ lw t3, 12(a0)
+ srl t4, t0, 24 /* 00|00|00|A1 */
+ replv.ph t5, t4 /* 00|A1|00|A1 */
+ srl t6, t1, 24 /* 00|00|00|A2 */
+ replv.ph t7, t6 /* 00|A2|00|A2 */
+ muleu_s.ph.qbl t8, t0, t5 /* A1*A1|A1*R1 */
+ muleu_s.ph.qbr t0, t0, t5 /* A1*G1|A1*B1 */
+ muleu_s.ph.qbl t9, t1, t7 /* A2*A2|A2*R2 */
+ muleu_s.ph.qbr t1, t1, t7 /* A2*G2|A2*B2 */
+ srl t5, t2, 24 /* 00|00|00|A3 */
+ replv.ph s0, t5 /* 00|A3|00|A3 */
+ srl t7, t3, 24 /* 00|00|00|A4 */
+ replv.ph s1, t7 /* 00|A4|00|A4 */
+ muleu_s.ph.qbl s2, t2, s0 /* A3*A3|A3*R3 */
+ muleu_s.ph.qbr t2, t2, s0 /* A3*G3|A3*B3 */
+ muleu_s.ph.qbl s0, t3, s1 /* A4*A4|A4*R4 */
+ muleu_s.ph.qbr t3, t3, s1 /* A4*G4|A4*B4 */
+ preceu.ph.qbla s1, t8
+ preceu.ph.qbla s3, t0
+ addu.ph t8, t8, s1
+ addu.ph t0, t0, s3
+ preceu.ph.qbla s1, t9
+ preceu.ph.qbla s3, t1
+ addu.ph t9, t9, s1
+ addu.ph t1, t1, s3
+ preceu.ph.qbla s1, s2
+ preceu.ph.qbla s3, t2
+ addu.ph s2, s2, s1
+ addu.ph t2, t2, s3
+ preceu.ph.qbla s1, s0
+ preceu.ph.qbla s3, t3
+ addu.ph s0, s0, s1
+ addu.ph t3, t3, s3
+ shra_r.ph t8, t8, 8 /* xxAA1|xxRR1 */
+ shra_r.ph t0, t0, 8 /* xxBB1|xxGG1 */
+ shra_r.ph t9, t9, 8
+ shra_r.ph t1, t1, 8
+ shra_r.ph s2, s2, 8
+ shra_r.ph t2, t2, 8
+ shra_r.ph s0, s0, 8
+ shra_r.ph t3, t3, 8
+ precr.qb.ph t0, t8, t0
+ precr.qb.ph t1, t9, t1
+ precr.qb.ph t2, s2, t2
+ precr.qb.ph t3, s0, t3
+ append t4, t0, 24
+ append t6, t1, 24
+ append t5, t2, 24
+ append t7, t3, 24
+ sw t4, 0(a0)
+ sw t6, 4(a0)
+ sw t5, 8(a0)
+ sw t7, 12(a0)
+
+ lw t0, 16(a0)
+ lw t1, 20(a0)
+ lw t2, 24(a0)
+ lw t3, 28(a0)
+ srl t4, t0, 24 /* 00|00|00|A1 */
+ replv.ph t5, t4 /* 00|A1|00|A1 */
+ srl t6, t1, 24 /* 00|00|00|A2 */
+ replv.ph t7, t6 /* 00|A2|00|A2 */
+ muleu_s.ph.qbl t8, t0, t5 /* A1*A1|A1*R1 */
+ muleu_s.ph.qbr t0, t0, t5 /* A1*G1|A1*B1 */
+ muleu_s.ph.qbl t9, t1, t7 /* A2*A2|A2*R2 */
+ muleu_s.ph.qbr t1, t1, t7 /* A2*G2|A2*B2 */
+ srl t5, t2, 24 /* 00|00|00|A3 */
+ replv.ph s0, t5 /* 00|A3|00|A3 */
+ srl t7, t3, 24 /* 00|00|00|A4 */
+ replv.ph s1, t7 /* 00|A4|00|A4 */
+ muleu_s.ph.qbl s2, t2, s0 /* A3*A3|A3*R3 */
+ muleu_s.ph.qbr t2, t2, s0 /* A3*G3|A3*B3 */
+ muleu_s.ph.qbl s0, t3, s1 /* A4*A4|A4*R4 */
+ muleu_s.ph.qbr t3, t3, s1 /* A4*G4|A4*B4 */
+ preceu.ph.qbla s1, t8
+ preceu.ph.qbla s3, t0
+ addu.ph t8, t8, s1
+ addu.ph t0, t0, s3
+ preceu.ph.qbla s1, t9
+ preceu.ph.qbla s3, t1
+ addu.ph t9, t9, s1
+ addu.ph t1, t1, s3
+ preceu.ph.qbla s1, s2
+ preceu.ph.qbla s3, t2
+ addu.ph s2, s2, s1
+ addu.ph t2, t2, s3
+ preceu.ph.qbla s1, s0
+ preceu.ph.qbla s3, t3
+ addu.ph s0, s0, s1
+ addu.ph t3, t3, s3
+ shra_r.ph t8, t8, 8 /* xxAA1|xxRR1 */
+ shra_r.ph t0, t0, 8 /* xxBB1|xxGG1 */
+ shra_r.ph t9, t9, 8
+ shra_r.ph t1, t1, 8
+ shra_r.ph s2, s2, 8
+ shra_r.ph t2, t2, 8
+ shra_r.ph s0, s0, 8
+ shra_r.ph t3, t3, 8
+ precr.qb.ph t0, t8, t0
+ precr.qb.ph t1, t9, t1
+ precr.qb.ph t2, s2, t2
+ precr.qb.ph t3, s0, t3
+ append t4, t0, 24
+ append t6, t1, 24
+ append t5, t2, 24
+ append t7, t3, 24
+ sw t4, 16(a0)
+ sw t6, 20(a0)
+ sw t5, 24(a0)
+ sw t7, 28(a0)
+ bgtz v1, 2b /* if (t1): unrolled loop */
+ addiu a0, a0, 32 /* data += 8 */
+
+ beqz v0, 4f /* if (!v0): skip tail loop */
+ nop
+
+ /* tail loop, handles (len < 8), one pixel at a time */
+1: lw t1, 0 (a0)
+ addiu v0, v0, -1 /* len-- */
+ srl t2, t1, 24 /* t2 = alpha */
+ replv.ph t3, t2
+ muleu_s.ph.qbl t4, t1, t3
+ muleu_s.ph.qbr t1, t1, t3
+ preceu.ph.qbla t3, t4
+ preceu.ph.qbla t5, t1
+ addu.ph t4, t4, t3
+ addu.ph t1, t1, t5
+ shra_r.ph t4, t4, 8
+ shra_r.ph t1, t1, 8
+ precr.qb.ph t1, t4, t1
+ append t2, t1, 24
+ sw t2, 0(a0)
+ bgtz v0, 1b
+ addiu a0, a0, 4 /* src++ */
+
+4: bnez a1, 3b /* if (numlines): loop */
+ addu a0, a0, a3 /* src += srclineskip */
+
+0: /* return */
+ RESTORE_REGS_FROM_STACK 0, s0, s1, s2, s3
+
+ jr ra
+ nop
+
+END(premultiply_argb_inplace_mips_asm)
+
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp
index b522d6e9ac..ee4817e4ec 100644
--- a/src/gui/kernel/qguiapplication.cpp
+++ b/src/gui/kernel/qguiapplication.cpp
@@ -1473,10 +1473,12 @@ void QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePriv
QGuiApplicationPrivate::processTabletLeaveProximityEvent(
static_cast<QWindowSystemInterfacePrivate::TabletLeaveProximityEvent *>(e));
break;
+#ifndef QT_NO_GESTURES
case QWindowSystemInterfacePrivate::Gesture:
QGuiApplicationPrivate::processGestureEvent(
static_cast<QWindowSystemInterfacePrivate::GestureEvent *>(e));
break;
+#endif
case QWindowSystemInterfacePrivate::PlatformPanel:
QGuiApplicationPrivate::processPlatformPanelEvent(
static_cast<QWindowSystemInterfacePrivate::PlatformPanelEvent *>(e));
diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h
index 65c6d814e6..218036033e 100644
--- a/src/gui/kernel/qguiapplication_p.h
+++ b/src/gui/kernel/qguiapplication_p.h
@@ -148,7 +148,10 @@ public:
static void processTabletEvent(QWindowSystemInterfacePrivate::TabletEvent *e);
static void processTabletEnterProximityEvent(QWindowSystemInterfacePrivate::TabletEnterProximityEvent *e);
static void processTabletLeaveProximityEvent(QWindowSystemInterfacePrivate::TabletLeaveProximityEvent *e);
+
+#ifndef QT_NO_GESTURES
static void processGestureEvent(QWindowSystemInterfacePrivate::GestureEvent *e);
+#endif
static void processPlatformPanelEvent(QWindowSystemInterfacePrivate::PlatformPanelEvent *e);
#ifndef QT_NO_CONTEXTMENU
diff --git a/src/gui/kernel/qwindowsysteminterface_p.h b/src/gui/kernel/qwindowsysteminterface_p.h
index 8cafb8da5c..42dbe7509e 100644
--- a/src/gui/kernel/qwindowsysteminterface_p.h
+++ b/src/gui/kernel/qwindowsysteminterface_p.h
@@ -91,7 +91,9 @@ public:
PlatformPanel = UserInputEvent | 0x17,
ContextMenu = UserInputEvent | 0x18,
EnterWhatsThisMode = UserInputEvent | 0x19,
+#ifndef QT_NO_GESTURES
Gesture = UserInputEvent | 0x1a,
+#endif
ApplicationStateChanged = 0x19,
FlushEvents = 0x20,
WindowScreenChanged = 0x21
@@ -400,6 +402,7 @@ public:
};
#endif
+#ifndef QT_NO_GESTURES
class GestureEvent : public InputEvent {
public:
GestureEvent(QWindow *window, ulong time, Qt::NativeGestureType type, QPointF pos, QPointF globalPos)
@@ -414,6 +417,7 @@ public:
ulong sequenceId;
quint64 intValue;
};
+#endif
class WindowSystemEventList {
QList<WindowSystemEvent *> impl;
diff --git a/src/gui/opengl/qtriangulator.cpp b/src/gui/opengl/qtriangulator.cpp
index 77da009bf5..839ec9e96f 100644
--- a/src/gui/opengl/qtriangulator.cpp
+++ b/src/gui/opengl/qtriangulator.cpp
@@ -201,10 +201,12 @@ static inline qint64 qCross(const QPodPoint &u, const QPodPoint &v)
return qint64(u.x) * qint64(v.y) - qint64(u.y) * qint64(v.x);
}
+#ifdef Q_TRIANGULATOR_DEBUG
static inline qint64 qDot(const QPodPoint &u, const QPodPoint &v)
{
return qint64(u.x) * qint64(v.x) + qint64(u.y) * qint64(v.y);
}
+#endif
// Return positive value if 'p' is to the right of the line 'v1'->'v2', negative if left of the
// line and zero if exactly on the line.
@@ -249,13 +251,6 @@ static inline QIntersectionPoint qIntersectionPoint(const QPodPoint &point)
return p;
}
-static inline QIntersectionPoint qIntersectionPoint(int x, int y)
-{
- // upperLeft = (x, y), xOffset = 0/1, yOffset = 0/1.
- QIntersectionPoint p = {{x, y}, {0, 1}, {0, 1}};
- return p;
-}
-
static QIntersectionPoint qIntersectionPoint(const QPodPoint &u1, const QPodPoint &u2, const QPodPoint &v1, const QPodPoint &v2)
{
QIntersectionPoint result = {{0, 0}, {0, 0}, {0, 0}};
diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp
index a037545dc2..cc28076b7c 100644
--- a/src/gui/painting/qdrawhelper.cpp
+++ b/src/gui/painting/qdrawhelper.cpp
@@ -1790,7 +1790,7 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper
return buffer;
}
-static const SourceFetchProc sourceFetch[NBlendTypes][QImage::NImageFormats] = {
+static SourceFetchProc sourceFetch[NBlendTypes][QImage::NImageFormats] = {
// Untransformed
{
0, // Invalid
@@ -6402,6 +6402,21 @@ void qInitDrawhelperAsm()
destStoreProc[QImage::Format_ARGB32] = qt_destStoreARGB32_mips_dsp;
+ sourceFetch[BlendUntransformed][QImage::Format_RGB888] = qt_fetchUntransformed_888_mips_dsp;
+ sourceFetch[BlendTiled][QImage::Format_RGB888] = qt_fetchUntransformed_888_mips_dsp;
+
+ sourceFetch[BlendUntransformed][QImage::Format_RGB444] = qt_fetchUntransformed_444_mips_dsp;
+ sourceFetch[BlendTiled][QImage::Format_RGB444] = qt_fetchUntransformed_444_mips_dsp;
+
+ sourceFetch[BlendUntransformed][QImage::Format_ARGB8565_Premultiplied] = qt_fetchUntransformed_argb8565_premultiplied_mips_dsp;
+ sourceFetch[BlendTiled][QImage::Format_ARGB8565_Premultiplied] = qt_fetchUntransformed_argb8565_premultiplied_mips_dsp;
+
+#if defined(QT_COMPILER_SUPPORTS_MIPS_DSPR2)
+ qBlendFunctions[QImage::Format_RGB16][QImage::Format_RGB16] = qt_blend_rgb16_on_rgb16_mips_dspr2;
+#else
+ qBlendFunctions[QImage::Format_RGB16][QImage::Format_RGB16] = qt_blend_rgb16_on_rgb16_mips_dsp;
+#endif // QT_COMPILER_SUPPORTS_MIPS_DSPR2
+
#endif // QT_COMPILER_SUPPORTS_MIPS_DSP
if (functionForModeSolidAsm) {
const int destinationMode = QPainter::CompositionMode_Destination;
diff --git a/src/gui/painting/qdrawhelper_mips_dsp.cpp b/src/gui/painting/qdrawhelper_mips_dsp.cpp
index a9b551c226..2202b78ce8 100644
--- a/src/gui/painting/qdrawhelper_mips_dsp.cpp
+++ b/src/gui/painting/qdrawhelper_mips_dsp.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2012 MIPS Technologies, www.mips.com, author Damir Tatalovic <dtatalovic@mips.com>
+** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com
** Contact: http://www.qt-project.org/legal
**
** This file is part of the QtGui module of the Qt Toolkit.
@@ -110,6 +110,78 @@ void qt_blend_rgb32_on_rgb32_mips_dsp(uchar *destPixels, int dbpl,
}
}
+#if defined QT_COMPILER_SUPPORTS_MIPS_DSPR2
+void qt_blend_rgb16_on_rgb16_mips_dspr2(uchar *destPixels, int dbpl,
+ const uchar *srcPixels, int sbpl,
+ int w, int h,
+ int const_alpha)
+{
+ if (const_alpha == 256) {
+ if (w < 256) {
+ const quint16 *src = (const quint16*) srcPixels;
+ quint16 *dst = (quint16*) destPixels;
+ for (int y = 0; y < h; ++y) {
+ qt_blend_rgb16_on_rgb16_const_alpha_256_mips_dsp_asm(dst, src, w);
+ dst = (quint16*) (((uchar*) dst) + dbpl);
+ src = (quint16*) (((uchar*) src) + sbpl);
+ }
+ }
+ else {
+ int length = w << 1;
+ while (h--) {
+ memcpy(destPixels, srcPixels, length);
+ destPixels += dbpl;
+ srcPixels += sbpl;
+ }
+ }
+ }
+ else if (const_alpha != 0) {
+ const quint16 *src = (const quint16*) srcPixels;
+ quint16 *dst = (quint16*) destPixels;
+ for (int y = 0; y < h; ++y) {
+ qt_blend_rgb16_on_rgb16_mips_dspr2_asm(dst, src, w, const_alpha);
+ dst = (quint16*) (((uchar*) dst) + dbpl);
+ src = (quint16*) (((uchar*) src) + sbpl);
+ }
+ }
+}
+#else
+void qt_blend_rgb16_on_rgb16_mips_dsp(uchar *destPixels, int dbpl,
+ const uchar *srcPixels, int sbpl,
+ int w, int h,
+ int const_alpha)
+{
+ if (const_alpha == 256) {
+ if (w < 256) {
+ const quint16 *src = (const quint16*) srcPixels;
+ quint16 *dst = (quint16*) destPixels;
+ for (int y = 0; y < h; ++y) {
+ qt_blend_rgb16_on_rgb16_const_alpha_256_mips_dsp_asm(dst, src, w);
+ dst = (quint16*) (((uchar*) dst) + dbpl);
+ src = (quint16*) (((uchar*) src) + sbpl);
+ }
+ }
+ else {
+ int length = w << 1;
+ while (h--) {
+ memcpy(destPixels, srcPixels, length);
+ destPixels += dbpl;
+ srcPixels += sbpl;
+ }
+ }
+ }
+ else if (const_alpha != 0) {
+ const quint16 *src = (const quint16*) srcPixels;
+ quint16 *dst = (quint16*) destPixels;
+ for (int y = 0; y < h; ++y) {
+ qt_blend_rgb16_on_rgb16_mips_dsp_asm(dst, src, w, const_alpha);
+ dst = (quint16*) (((uchar*) dst) + dbpl);
+ src = (quint16*) (((uchar*) src) + sbpl);
+ }
+ }
+}
+#endif
+
void comp_func_Source_mips_dsp(uint *dest, const uint *src, int length, uint const_alpha)
{
if (const_alpha == 255) {
@@ -422,5 +494,28 @@ void QT_FASTCALL comp_func_SourceOut_mips_dsp(uint *dest, const uint *src, int l
comp_func_SourceOut_dsp_asm_x2(dest, src, length, const_alpha);
}
+const uint * QT_FASTCALL qt_fetchUntransformed_888_mips_dsp (uint *buffer, const Operator *, const QSpanData *data,
+ int y, int x, int length)
+{
+ uchar *line = (uchar *)data->texture.scanLine(y) + x;
+ fetchUntransformed_888_asm_mips_dsp(buffer, line, length);
+ return buffer;
+}
+
+const uint * QT_FASTCALL qt_fetchUntransformed_444_mips_dsp (uint *buffer, const Operator *, const QSpanData *data,
+ int y, int x, int length)
+{
+ uchar *line = (uchar *)data->texture.scanLine(y) + x;
+ fetchUntransformed_444_asm_mips_dsp(buffer, line, length);
+ return buffer;
+}
+
+const uint * QT_FASTCALL qt_fetchUntransformed_argb8565_premultiplied_mips_dsp (uint *buffer, const Operator *, const QSpanData *data,
+ int y, int x, int length)
+{
+ uchar *line = (uchar *)data->texture.scanLine(y) + x;
+ fetchUntransformed_argb8565_premultiplied_asm_mips_dsp(buffer, line, length);
+ return buffer;
+}
QT_END_NAMESPACE
diff --git a/src/gui/painting/qdrawhelper_mips_dsp_asm.S b/src/gui/painting/qdrawhelper_mips_dsp_asm.S
index 64fc635970..26b48f9d62 100644
--- a/src/gui/painting/qdrawhelper_mips_dsp_asm.S
+++ b/src/gui/painting/qdrawhelper_mips_dsp_asm.S
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2012 MIPS Technologies, www.mips.com, author Damir Tatalovic <dtatalovic@mips.com>
+** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com
** Contact: http://www.qt-project.org/legal
**
** This file is part of the QtGui module of the Qt Toolkit.
@@ -1601,3 +1601,479 @@ LEAF_MIPS_DSP(qt_blend_argb32_on_argb32_const_alpha_256_mips_dsp_asm)
nop
END(qt_blend_argb32_on_argb32_const_alpha_256_mips_dsp_asm)
+
+
+#if defined(__MIPSEL) && __MIPSEL
+# define PACK(r, s, t) packrl.ph r, s, t
+# define SWHI(r, o, b) swl r, o + 1 (b)
+# define SWLO(r, o, b) swr r, o + 0 (b)
+# define LDHI(r, o, b) lwl r, o + 1 (b)
+# define LDLO(r, o, b) lwr r, o + 2 (b)
+#else
+# define PACK(r, s, t) packrl.ph r, t, s
+# define SWHI(r, o, b) swr r, o + 1 (b)
+# define SWLO(r, o, b) swl r, o + 0 (b)
+# define LDHI(r, o, b) lwr r, o + 1 (b)
+# define LDLO(r, o, b) lwl r, o + 2 (b)
+#endif
+
+LEAF_MIPS_DSP(qt_blend_rgb16_on_rgb16_const_alpha_256_mips_dsp_asm)
+/*
+ * a0 - dst (*r5g6b5)
+ * a1 - src (const *r5g6b5)
+ * a2 - len (unsigned int)
+ *
+ * Register usage:
+ * t0-3 - Scratch registers
+ * t4 - Number of iterations to do in unrolled loops
+ * t5-7 - Auxiliary scratch registers.
+ *
+ * Check if base addresses of src/dst are aligned, cases:
+ * a) Both aligned.
+ * b) Both unaligned:
+ * 1. Copy a halfword
+ * 2. Use aligned case.
+ * c) dst aligned, src unaligned:
+ * 1. Read a word from dst, halfword from src.
+ * 2. Continue reading words from both.
+ * d) dst unaligned, src aligned:
+ * 1. Read a word from src, halfword from dst.
+ * 2. Continue reading words from both.
+ */
+
+ beqz a2, 0f /* if (a2:len == 0): return */
+ andi t0, a0, 0x3 /* t0 = a0:dst % 4 */
+ andi t1, a1, 0x3 /* t1 = a1:dst % 4 */
+ or t2, t0, t1 /* t1 = t0 | t1 */
+
+ beqz t2, 4f /* both aligned */
+ nop
+ beqz t0, 3f /* dst aligned, src unaligned */
+ nop
+ beqz t1, 2f /* src aligned, dst unaligned */
+ nop
+
+ /*
+ * Both src/dst are unaligned: read 1 halfword from each,
+ * the fall-off to continue with word-aligned copy.
+ */
+ lhu t0, 0 (a1) /* t0 <- ((uint16_t*) src)[0] */
+ addiu a1, a1, 2 /* src++ */
+ addiu a2, a2,-1 /* len-- */
+ sh t0, 0 (a0) /* t1 -> ((uint16_t*) dst)[0] */
+ addiu a0, a0, 2 /* dst++ */
+
+ /*
+ * Both src/dst pointers are word-aligned, process eight
+ * items at a time in an unrolled loop.
+ */
+4: beqz a2, 0f /* if (len == 0): return */
+ srl t4, a2, 3 /* t4 = len / 8 */
+
+ beqz t4, 5f /* if (t4 == 0): tail */
+ andi a2, a2, 0x07 /* len = len % 8 */
+
+1: lw t0, 0 (a1)
+ lw t1, 4 (a1)
+ lw t2, 8 (a1)
+ lw t3, 12 (a1)
+
+ addiu t4, t4, -1 /* t4-- */
+ addiu a1, a1, 16 /* src += 8 */
+
+ sw t0, 0 (a0)
+ sw t1, 4 (a0)
+ sw t2, 8 (a0)
+ sw t3, 12 (a0)
+
+ bnez t4, 1b
+ addiu a0, a0, 16 /* dst += 8 */
+
+ b 5f
+ nop
+
+
+ /*
+ * dst pointer is unaligned
+ */
+2: beqz a2, 0f /* if (len == 0): return */
+ srl t4, a2, 3 /* t4 = len / 8 */
+ beqz t4, 5f /* if (t4 == 0): tail */
+ andi a2, a2, 0x07 /* len = len % 8 */
+
+1: lw t0, 0 (a1)
+ lw t1, 4 (a1)
+ lw t2, 8 (a1)
+ lw t3, 12 (a1)
+
+ addiu t4, t4, -1 /* t4-- */
+ addiu a1, a1, 16 /* src += 8 */
+
+ SWLO (t0, 0, a0)
+ PACK (t5, t1, t0)
+ PACK (t6, t2, t1)
+ PACK (t7, t3, t2)
+ SWHI (t3, 14, a0)
+ sw t5, 2 (a0)
+ sw t6, 6 (a0)
+ sw t7, 10 (a0)
+
+ bnez t4, 1b
+ addiu a0, a0, 16 /* dst += 8 */
+
+ b 5f
+ nop
+
+ /*
+ * src pointer is unaligned
+ */
+3: beqz a2, 0f /* if (len == 0): return */
+ srl t4, a2, 3 /* t4 = len / 8 */
+ beqz t4, 5f /* if (t4 == 0): tail */
+ andi a2, a2, 0x07 /* len = len % 8 */
+
+1: LDHI (t0, 0, a1)
+ lw t1, 2 (a1)
+ lw t2, 6 (a1)
+ lw t3, 10 (a1)
+ LDLO (t5, 12, a1)
+
+ addiu t4, t4, -1 /* t4-- */
+ addiu a1, a1, 16 /* src += 8 */
+
+ PACK (t0, t1, t0)
+ PACK (t6, t2, t1)
+ PACK (t7, t3, t2)
+ sw t0, 0 (a0)
+ PACK (t0, t5, t3)
+ sw t6, 4 (a0)
+ sw t7, 8 (a0)
+ sw t0, 12 (a0)
+
+ bnez t4, 1b
+ addiu a0, a0, 16 /* dst += 8 */
+
+
+5: /* Process remaining items (a2:len < 4), one at a time */
+ beqz a2, 0f
+ nop
+
+1: lhu t0, 0 (a1) /* t0 <- ((uint16_t*) src)[0] */
+ addiu a2, a2,-1 /* len-- */
+ addiu a1, a1, 2 /* src++ */
+ sh t0, 0 (a0) /* to -> ((uint16_t*) dst)[0] */
+ bnez a2, 1b /* if (len != 0): loop */
+ addiu a0, a0, 2 /* dst++ */
+
+0: jr ra
+ nop
+
+END(qt_blend_rgb16_on_rgb16_const_alpha_256_mips_dsp_asm)
+
+
+#undef LDHI
+#undef LDLO
+#undef PACK
+#undef SWHI
+#undef SWLO
+
+
+LEAF_MIPS_DSP(qt_blend_rgb16_on_rgb16_mips_dsp_asm)
+/*
+ * a0 - dst (*r5g6b5)
+ * a1 - src (const *r5g6b5)
+ * a2 - len (unsigned int) - batch length
+ * a3 - alpha (int)
+ */
+
+ beqz a2, 2f
+ li t9, 255
+ sll t8, a3, 8
+ subu a3, t8, a3
+ srl a3, a3, 8
+ subu t9, t9, a3
+ addiu a3, a3, 1
+ srl t4, a3, 2
+ addiu t9, t9, 1
+ srl t5, t9, 2
+1:
+ lhu t0, 0(a1)
+ lhu t1, 0(a0)
+ addiu a2, a2, -1
+ andi t2, t0, 0x07e0
+ andi t0, t0, 0xf81f
+ mul t2, t2, a3
+ mul t0, t0, t4
+ andi t3, t1, 0x07e0
+ andi t1, t1, 0xf81f
+ mul t3, t3, t9
+ mul t1, t1, t5
+ addiu a1, a1, 2
+ srl t2, t2, 8
+ srl t0, t0, 6
+ andi t2, t2, 0x07e0
+ andi t0, t0, 0xf81f
+ or t0, t0, t2
+ srl t3, t3, 8
+ srl t1, t1, 6
+ andi t3, t3, 0x07e0
+ andi t1, t1, 0xf81f
+ or t1, t1, t3
+ addu t0, t0, t1
+ sh t0, 0(a0)
+ bgtz a2, 1b
+ addiu a0, a0, 2
+2:
+ jr ra
+ nop
+
+END(qt_blend_rgb16_on_rgb16_mips_dsp_asm)
+
+
+LEAF_MIPS_DSP(fetchUntransformed_888_asm_mips_dsp)
+/*
+ * a0 - dst address (address of 32-bit aRGB value)
+ * a1 - src address
+ * a2 - length
+ */
+
+ beqz a2, 4f
+ lui t8, 0xff00
+ andi t0, a2, 0x1
+ beqz t0, 1f
+ nop
+/* case for one pixel */
+ lbu t1, 0(a1)
+ lbu v1, 2(a1)
+ lbu t0, 1(a1)
+ addiu a1, a1, 3
+ addiu a2, a2, -1
+ sll t1, t1, 0x10
+ or v1, v1, t8
+ sll t0, t0, 0x8
+ or v1, v1, t1
+ or v1, v1, t0
+ sw v1, 0(a0)
+ addiu a0, a0, 4
+
+ beqz a2, 4f /* only one pixel is present (length = 1) */
+ nop
+1:
+ andi t0, a1, 0x1
+ beqz t0, 3f
+ nop
+2:
+ lbu t0, 0(a1) /* t0 = | 0 | 0 | 0 | R1 | */
+ lhu t1, 1(a1) /* t1 = | 0 | 0 | B1 | G1 | */
+ addiu a1, a1, 3
+ lhu t2, 0(a1) /* t2 = | 0 | 0 | G2 | R2 | */
+ lbu t3, 2(a1) /* t3 = | 0 | 0 | 0 | B2 | */
+
+ sll t0, t0, 16
+ or t0, t0, t8 /* t0 = | ff | R1 | 0 | 0 | */
+ shll.ph t4, t1, 8 /* t4 = | 0 | 0 | G1 | 0 | */
+ srl t5, t1, 8
+ or t4, t4, t5 /* t4 = | 0 | 0 | G1 | B1 | */
+ or t0, t0, t4 /* t0 = | ff | R1 | G1 | B1 | */
+
+ shll.ph t4, t2, 8 /* t4 = | 0 | 0 | R2 | 0 | */
+ srl t5, t2, 8 /* t5 = | 0 | 0 | 0 | G2 | */
+ or t4, t4, t5
+ sll t4, t4, 8 /* t4 = | 0 | R2 | G2 | 0 | */
+ or t5, t3, t8
+ or t2, t4, t5 /* t2 = | ff | R2 | G2 | B2 | */
+
+ sw t0, 0(a0)
+ addiu a1, a1, 3
+ sw t2, 4(a0)
+ addiu a2, a2, -2
+ bnez a2, 2b
+ addiu a0, a0, 8
+ b 4f
+ nop
+3:
+ lhu t0, 0(a1) /* t0 = | 0 | 0 | G1 | R1 | */
+ lbu t1, 2(a1) /* t1 = | 0 | 0 | 0 | B1 | */
+ addiu a1, a1, 3
+ lbu t2, 0(a1) /* t2 = | 0 | 0 | 0 | R2 | */
+ lhu t3, 1(a1) /* t3 = | 0 | 0 | B2 | G2 | */
+
+ srl t4, t0, 8 /* t4 = | 0 | 0 | 0 | G1 | */
+ shll.ph t5, t0, 8 /* t5 = | 0 | 0 | R1 | 0 | */
+ or t0, t4, t5
+ sll t6, t0, 8 /* t6 = | 0 | R1 | G1 | 0 | */
+ or t4, t1, t8 /* t4 = | ff | 0 | 0 | B1 | */
+ or t0, t6, t4
+
+ sll t2, t2, 16
+ srl t4, t3, 8
+ shll.ph t5, t3, 8
+ or t3, t4, t5
+ or t2, t2, t3
+ or t2, t2, t8
+
+ sw t0, 0(a0)
+ addiu a1, a1, 3
+ sw t2, 4(a0)
+ addiu a2, a2, -2
+ bnez a2, 3b
+ addiu a0, a0, 8
+4:
+ jr ra
+ nop
+
+END(fetchUntransformed_888_asm_mips_dsp)
+
+
+LEAF_MIPS_DSP(fetchUntransformed_444_asm_mips_dsp)
+/*
+ * a0 - dst address (address of 32-bit aRGB value)
+ * a1 - src address
+ * a2 - length
+ */
+
+ lui t8, 0xff00
+ li t4, 0x1
+
+ beqz a2, 5f
+ move v0, a0 /* just return the address of buffer
+ * for storing returning values */
+ andi t0, a2, 0x1
+ beqz t0, 2f /* there is more then one pixel
+ * (check src memory alignment (word)) */
+ nop
+1:
+ lhu v0, 0(a1)
+ addiu a1, a1, 2
+ addiu a2, a2, -1
+ andi t0, v0, 0xf00
+ andi v1, v0, 0xf
+ andi v0, v0, 0xf0
+ sra t3, t0, 0x4
+ sra t1, v0, 0x4
+ sra t0, t0, 0x8
+ sll t2, v1, 0x4
+ or t0, t0, t3
+ or v0, t1, v0
+ lui t1, 0xff00
+ or v1, t2, v1
+ sll t0, t0, 0x10
+ or v1, v1, t1
+ sll v0, v0, 0x8
+ or v1, v1, t0
+ or v0, v1, v0
+ sw v0, 0(a0)
+ addiu a0, a0, 4
+ beqz a2, 5f /* no more pixels for processing */
+ nop
+ beq a2, t4, 4f /* only one more pixel remained */
+ nop
+/* check if src memory address is word aligned */
+2:
+ andi t0, a1, 0x3
+ beqz t0, 3f /* memory is word aligned */
+ andi a3, a2, 0x1 /* set the a3 register as the comparation
+ * for ending the unrolled loop
+ * (1 if odd, 0 if even) */
+ b 1b /* not word aligned,
+ * go another turn with
+ * just one pixel processing */
+ nop
+3:
+ lw t0, 0(a1)
+ addiu a2, a2, -2
+ preceu.ph.qbr t1, t0 /* t1 = | 0 | aR1 | 0 | G1B1 | */
+ preceu.ph.qbl t2, t0 /* t1 = | 0 | aR2 | 0 | G2B2 | */
+ shll.qb t3, t1, 4 /* t3 = | 0 | R1 0 | 0 | B1 0 | */
+ srl t4, t3, 4
+ or t0, t3, t4 /* t0 = | 0 | R1R1 | 0 | B1B1 | */
+ andi t3, t1, 0xf0
+ sll t3, t3, 8
+ srl t4, t3, 4
+ or t1, t3, t4
+ or t0, t0, t1 /* t0 = | 0 | R1R1 | G1G1 | B1B1 | */
+ or t0, t0, t8 /* t0 = | ff | R1R1 | G1G1 | B1B1 | */
+
+ shll.qb t3, t2, 4 /* t3 = | 0 | R1 0 | 0 | B1 0 | */
+ srl t4, t3, 4
+ or t7, t3, t4 /* t0 = | 0 | R1R1 | 0 | B1B1 | */
+ andi t3, t2, 0xf0
+ sll t3, t3, 8
+ srl t4, t3, 4
+ or t1, t3, t4
+ or t2, t7, t1 /* t0 = | 0 | R1R1 | G1G1 | B1B1 | */
+ or t2, t2, t8 /* t0 = | ff | R1R1 | G1G1 | B1B1 | */
+
+ sw t0, 0(a0)
+ addiu a1, a1, 4
+ sw t2, 4(a0)
+ bne a2, a3, 3b
+ addiu a0, a0, 8
+ beqz a2, 5f /* no more pixels for processing */
+ nop
+4:
+/* one more pixel remained (after loop unrolling process finished) */
+ lhu v0, 0(a1)
+ addiu a1, a1, 2
+ addiu a2, a2, -1
+ andi t0, v0, 0xf00
+ andi v1, v0, 0xf
+ andi v0, v0, 0xf0
+ sra t3, t0, 0x4
+ sra t1, v0, 0x4
+ sra t0, t0, 0x8
+ sll t2, v1, 0x4
+ or t0, t0, t3
+ or v0, t1, v0
+ lui t1, 0xff00
+ or v1, t2, v1
+ sll t0, t0, 0x10
+ or v1, v1, t1
+ sll v0, v0, 0x8
+ or v1, v1, t0
+ or v0, v1, v0
+ sw v0, 0(a0)
+ addiu a0, a0, 4
+5:
+ jr ra
+ nop
+
+END(fetchUntransformed_444_asm_mips_dsp)
+
+
+LEAF_MIPS_DSP(fetchUntransformed_argb8565_premultiplied_asm_mips_dsp)
+/*
+ * a0 - dst address
+ * a1 - src address
+ * a2 - length
+ */
+
+ beqz a2, 2f
+ nop
+
+1:
+ ulh t1, 0(a1)
+ lbu t2, 2(a1)
+ addiu a2, a2, -1
+ wsbh t1, t1
+ sll t0, t1, 8 /* t0 = 00000000rrrrrggggggbbbbb00000000 */
+ ins t0, t1, 3, 16 /* t0 = 00000000rrrrrrrrrrggggggbbbbb000 */
+ ins t0, t1, 5, 11 /* t0 = 00000000rrrrrrrrggggggbbbbbbb000 */
+ srl t4, t1, 9 /* t4 = 0000000000000000000000000rrrrrgg */
+ replv.qb t3, t2
+ ins t0, t4, 8, 2 /* t0 = 00000000rrrrrrrrggggggggbbbbb000 */
+ ins t0, t1, 3, 5 /* t0 = 00000000rrrrrrrrggggggggbbbbb000 */
+ srl t4, t1, 2 /* t4 = 000000000000000000rrrrrggggggbbb */
+ ins t0, t4, 0, 3 /* t0 = 00000000rrrrrrrrggggggggbbbbbbbb */
+ ins t0, t2, 24, 8 /* t0 =aaaaaaaarrrrrrrrggggggggbbbbbbbb */
+ cmpu.lt.qb t3, t0
+ pick.qb t0, t3, t0
+ addiu a1, a1, 3
+ sw t0, 0(a0)
+ bgtz a2, 1b
+ addiu a0, a0, 4
+2:
+ jr ra
+ nop
+
+END(fetchUntransformed_argb8565_premultiplied_asm_mips_dsp)
diff --git a/src/gui/painting/qdrawhelper_mips_dsp_p.h b/src/gui/painting/qdrawhelper_mips_dsp_p.h
index 2df7d4920a..3dceb7793d 100644
--- a/src/gui/painting/qdrawhelper_mips_dsp_p.h
+++ b/src/gui/painting/qdrawhelper_mips_dsp_p.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2012 MIPS Technologies, www.mips.com, author Damir Tatalovic <dtatalovic@mips.com>
+** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com
** Contact: http://www.qt-project.org/legal
**
** This file is part of the QtGui module of the Qt Toolkit.
@@ -101,19 +101,34 @@ extern "C" void qt_blend_argb32_on_argb32_mips_dsp_asm_x2(uint *dest, const uint
extern "C" void qt_blend_argb32_on_argb32_const_alpha_256_mips_dsp_asm(uint *dest, const uint *src, int length);
+extern "C" void qt_blend_rgb16_on_rgb16_const_alpha_256_mips_dsp_asm(quint16 *dest, const quint16 *src, int length);
+
+extern "C" void qt_blend_rgb16_on_rgb16_mips_dsp_asm(quint16 *dest, const quint16 *src, int length, uint const_alpha);
+
extern "C" uint * destfetchARGB32_asm_mips_dsp(uint *buffer, const uint *data, int length);
extern "C" uint * qt_destStoreARGB32_asm_mips_dsp(uint *buffer, const uint *data, int length);
+extern "C" uint * fetchUntransformed_888_asm_mips_dsp(uint *buffer, const uchar *line, int length);
+
+extern "C" uint * fetchUntransformed_444_asm_mips_dsp(uint *buffer, const uchar *line, int length);
+
+extern "C" uint * fetchUntransformed_argb8565_premultiplied_asm_mips_dsp(uint *buffer, const uchar *line, int length);
+
void qt_blend_argb32_on_argb32_mips_dsp(uchar *destPixels, int dbpl,
const uchar *srcPixels, int sbpl,
int w, int h,
int const_alpha);
void qt_blend_rgb32_on_rgb32_mips_dsp(uchar *destPixels, int dbpl,
- const uchar *srcPixels, int sbpl,
- int w, int h,
- int const_alpha);
+ const uchar *srcPixels, int sbpl,
+ int w, int h,
+ int const_alpha);
+
+void qt_blend_rgb16_on_rgb16_mips_dsp(uchar *destPixels, int dbpl,
+ const uchar *srcPixels, int sbpl,
+ int w, int h,
+ int const_alpha);
void comp_func_Source_mips_dsp(uint *dest, const uint *src, int length, uint const_alpha);
@@ -164,6 +179,21 @@ void QT_FASTCALL comp_func_SourceOut_mips_dsp(uint *dest, const uint *src, int l
void QT_FASTCALL comp_func_XOR_mips_dsp(uint *dest, const uint *src, int length, uint const_alpha);
+const uint * QT_FASTCALL qt_fetchUntransformed_888_mips_dsp (uint *buffer,
+ const Operator *,
+ const QSpanData *data,
+ int y, int x, int length);
+
+const uint * QT_FASTCALL qt_fetchUntransformed_444_mips_dsp (uint *buffer,
+ const Operator *,
+ const QSpanData *data,
+ int y, int x, int length);
+
+const uint * QT_FASTCALL qt_fetchUntransformed_argb8565_premultiplied_mips_dsp (uint *buffer,
+ const Operator *,
+ const QSpanData *data,
+ int y, int x, int length);
+
#endif // QT_COMPILER_SUPPORTS_MIPS_DSP
@@ -171,6 +201,13 @@ void QT_FASTCALL comp_func_XOR_mips_dsp(uint *dest, const uint *src, int length,
extern "C" void qConvertRgb16To32_asm_mips_dspr2(quint32 *dest, const quint16 *src, int length);
+extern "C" void qt_blend_rgb16_on_rgb16_mips_dspr2_asm(quint16 *dest, const quint16 *src, int length, uint const_alpha);
+
+void qt_blend_rgb16_on_rgb16_mips_dspr2(uchar *destPixels, int dbpl,
+ const uchar *srcPixels, int sbpl,
+ int w, int h,
+ int const_alpha);
+
#endif // QT_COMPILER_SUPPORTS_MIPS_DSPR2
QT_END_NAMESPACE
diff --git a/src/gui/painting/qdrawhelper_mips_dspr2_asm.S b/src/gui/painting/qdrawhelper_mips_dspr2_asm.S
index ec220732be..c7a603eebe 100644
--- a/src/gui/painting/qdrawhelper_mips_dspr2_asm.S
+++ b/src/gui/painting/qdrawhelper_mips_dspr2_asm.S
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2012 MIPS Technologies, www.mips.com, author Damir Tatalovic <dtatalovic@mips.com>
+** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com
** Contact: http://www.qt-project.org/legal
**
** This file is part of the QtGui module of the Qt Toolkit.
@@ -122,3 +122,551 @@ LEAF_MIPS_DSPR2(qConvertRgb16To32_asm_mips_dspr2)
nop
END(qConvertRgb16To32_asm_mips_dspr2)
+
+
+#if defined(__MIPSEL) && __MIPSEL
+# define PACK(r, s, t) packrl.ph r, s, t
+# define LDHI(r, o, b) lwl r, o + 1 (b)
+# define LDLO(r, o, b) lwr r, o + 2 (b)
+#else
+# define PACK(r, s, t) packrl.ph r, t, s
+# define LDHI(r, o, b) lwr r, o + 1 (b)
+# define LDLO(r, o, b) lwl r, o + 2 (b)
+#endif
+
+
+LEAF_MIPS_DSPR2(qt_blend_rgb16_on_rgb16_mips_dspr2_asm)
+/*
++ * a0 - dst (*r5g6b5)
+ * a1 - src (const *r5g6b5)
+ * a2 - len (unsigned int) - batch length
+ * a3 - alpha (int)
+ *
+ * Register usage:
+ * t0-3 - Scratch registers
+ * t4 - Number of iterations to do in unrolled loops
+ * t5 - Inverse alpha
+ * t6 - Alpha >> 2
+ * t7 - Inverse alpha >> 2
+ * t8 - magic1 (0x07e007e0)
+ * t9 - magic2 (0xf81ff81f)
+ *
+ * NOTE:
+ * Cannot use DSP instructions for the multiplication of two
+ * 16-bit values: overflow would be always rounded or saturated.
+ */
+
+ beqz a2, 0f
+ andi t0, a0, 0x3
+ andi t1, a1, 0x3
+ /* Adjust alpha value, and calculate inverse alpha value */
+ li t5, 255
+ or t2, t0, t1 /* t0 = (dst & 0x3) | (src & 0x3) */
+ sll t8, a3, 8
+ subu a3, t8, a3
+ li t8, 0x07e007e0 /* magic1 */
+ srl a3, a3, 8 /* alpha >>= 8 */
+ li t9, 0xf81ff81f /* magic2 */
+ subu t5, t5, a3 /* ialpha = 255 - alpha */
+ addiu a3, a3, 1 /* alpha++ */
+ addiu t5, t5, 1 /* ialpha++ */
+ srl t6, a3, 2 /* ashift = alpha >> 2 */
+
+ beqz t2, 4f /* both aligned */
+ srl t7, t5, 2 /* iashift = ialpha >> 2 */
+
+ beqz t1, 2f /* src aligned, dst unaligned */
+ nop
+
+ beqz t0, 3f /* dst aligned, src unaligned */
+ nop
+
+ /*
+ * Both src/dst are unaligned: read 1 halfword from each, then
+ * fall-off to continue with word-aligned operation.
+ */
+ lhu t1, 0 (a1)
+ lhu t0, 0 (a0)
+ addiu a2, a2, -1 /* len-- */
+ andi t2, t1, 0x07e0
+ andi t1, t1, 0xf81f
+ mul t2, t2, a3
+ mul t1, t1, t6
+ andi t3, t0, 0x07e0
+ andi t0, t0, 0xf81f
+ mul t3, t3, t5
+ mul t0, t0, t7
+ addiu a1, a1, 2 /* src++ */
+ srl t2, t2, 8
+ srl t1, t1, 6
+ andi t2, t2, 0x07e0
+ andi t1, t1, 0xf81f
+ or t1, t1, t2
+ srl t3, t3, 8
+ srl t0, t0, 6
+ andi t3, t3, 0x07e0
+ andi t0, t0, 0xf81f
+ or t0, t0, t3
+ addu t0, t0, t1 /* src * alpha + dst * ialpha */
+ sh t0, 0 (a0)
+ addiu a0, a0, 2 /* dst++ */
+
+ /*
+ * Both src/dst pointers are word-aligned, process eight
+ * items at a time in an unrolled loop.
+ */
+4: beqz a2, 0f
+ srl t4, a2, 3 /* t4 = len / 8 */
+ beqz t4, 5f
+ andi a2, a2, 0x7 /* len = len % 8 */
+ SAVE_REGS_ON_STACK 12, s0, s1, s2, s3, s4, v0, v1
+
+1: lw t1, 0 (a1) /* [s0, s1] */
+ lw v1, 4 (a1) /* [s2, s3] */
+ lw s1, 8 (a1) /* [s4, s5] */
+ lw s3, 12 (a1) /* [s6, s7] */
+
+ lw t0, 0 (a0) /* [d0, d1] */
+ lw v0, 4 (a0) /* [d2, d3] */
+ lw s0, 8 (a0) /* [d4, d5] */
+ lw s2, 12 (a0) /* [d6, d7] */
+
+ pref 4, 16 (a1)
+ pref 5, 16 (a0)
+
+ and t2, t1, t8
+ ext t3, t2, 0, 16
+ srl t2, t2, 16
+ mul t3, t3, a3
+ mul t2, t2, a3
+ and t1, t1, t9
+ ext s4, t1, 0, 16
+ mul s4, s4, t6
+ srl t1, t1, 16
+ mul t1, t1, t6
+ srl t3, t3, 8
+ srl t2, t2, 8
+ append t2, t3, 16
+ and t2, t2, t8
+ srl s4, s4, 6
+ and t3, v1, t8
+ srl t1, t1, 6
+ append t1, s4, 16
+ and t1, t1, t9
+ or t1, t1, t2
+ ext t2, t3, 0, 16
+ srl t3, t3, 16
+ mul t2, t2, a3
+ mul t3, t3, a3
+ and v1, v1, t9
+ ext s4, v1, 0, 16
+ mul s4, s4, t6
+ srl v1, v1, 16
+ mul v1, v1, t6
+ srl t2, t2, 8
+ srl t3, t3, 8
+ append t3, t2, 16
+ and t3, t3, t8
+ srl s4, s4, 6
+ and t2, s1, t8
+ srl v1, v1, 6
+ append v1, s4, 16
+ and v1, v1, t9
+ or v1, v1, t3
+ ext t3, t2, 0, 16
+ srl t2, t2, 16
+ mul t3, t3, a3
+ mul t2, t2, a3
+ and s1, s1, t9
+ ext s4, s1, 0, 16
+ mul s4, s4, t6
+ srl s1, s1, 16
+ mul s1, s1, t6
+ srl t3, t3, 8
+ srl t2, t2, 8
+ append t2, t3, 16
+ and t2, t2, t8
+ srl s4, s4, 6
+ and t3, s3, t8
+ srl s1, s1, 6
+ append s1, s4, 16
+ and s1, s1, t9
+ or s1, s1, t2
+ ext t2, t3, 0, 16
+ srl t3, t3, 16
+ mul t2, t2, a3
+ mul t3, t3, a3
+ and s3, s3, t9
+ ext s4, s3, 0, 16
+ mul s4, s4, t6
+ srl s3, s3, 16
+ mul s3, s3, t6
+ srl t2, t2, 8
+ srl t3, t3, 8
+ append t3, t2, 16
+ and t3, t3, t8
+ srl s4, s4, 6
+ and t2, t0, t8
+ srl s3, s3, 6
+ append s3, s4, 16
+ and s3, s3, t9
+ or s3, s3, t3
+ ext t3, t2, 0, 16
+ srl t2, t2, 16
+ mul t3, t3, t5
+ mul t2, t2, t5
+ and t0, t0, t9
+ ext s4, t0, 0, 16
+ mul s4, s4, t7
+ srl t0, t0, 16
+ mul t0, t0, t7
+ srl t3, t3, 8
+ srl t2, t2, 8
+ append t2, t3, 16
+ and t2, t2, t8
+ srl s4, s4, 6
+ and t3, v0, t8
+ srl t0, t0, 6
+ append t0, s4, 16
+ and t0, t0, t9
+ or t0, t0, t2
+ ext t2, t3, 0, 16
+ srl t3, t3, 16
+ mul t2, t2, t5
+ mul t3, t3, t5
+ and v0, v0, t9
+ ext s4, v0, 0, 16
+ mul s4, s4, t7
+ srl v0, v0, 16
+ mul v0, v0, t7
+ srl t2, t2, 8
+ srl t3, t3, 8
+ append t3, t2, 16
+ and t3, t3, t8
+ srl s4, s4, 6
+ and t2, s0, t8
+ srl v0, v0, 6
+ append v0, s4, 16
+ and v0, v0, t9
+ or v0, v0, t3
+ ext t3, t2, 0, 16
+ srl t2, t2, 16
+ mul t3, t3, t5
+ mul t2, t2, t5
+ and s0, s0, t9
+ ext s4, s0, 0, 16
+ mul s4, s4, t7
+ srl s0, s0, 16
+ mul s0, s0, t7
+ srl t3, t3, 8
+ srl t2, t2, 8
+ append t2, t3, 16
+ and t2, t2, t8
+ srl s4, s4, 6
+ and t3, s2, t8
+ srl s0, s0, 6
+ append s0, s4, 16
+ and s0, s0, t9
+ or s0, s0, t2
+ ext t2, t3, 0, 16
+ srl t3, t3, 16
+ mul t2, t2, t5
+ mul t3, t3, t5
+ and s2, s2, t9
+ ext s4, s2, 0, 16
+ mul s4, s4, t7
+ srl s2, s2, 16
+ mul s2, s2, t7
+ srl t2, t2, 8
+ srl t3, t3, 8
+ append t3, t2, 16
+ and t3, t3, t8
+ srl s4, s4, 6
+ addu.ph t0, t0, t1
+ srl s2, s2, 6
+ append s2, s4, 16
+ and s2, s2, t9
+ or s2, s2, t3
+ addu.ph v0, v0, v1 /* v0 = [S2 + D2, S3 + D3] */
+ addu.ph s0, s0, s1 /* s0 = [S4 + D4, S5 + D5] */
+ addu.ph s2, s2, s3 /* s2 = [S6 + D6, S7 + D7] */
+
+ sw t0, 0 (a0) /* [SS0, SS1] */
+ sw v0, 4 (a0) /* [SS2, SS3] */
+ sw s0, 8 (a0) /* [SS4, SS5] */
+ sw s2, 12 (a0) /* [SS6, SS7] */
+
+ addiu t4, t4, -1 /* t4-- */
+ addiu a1, a1, 16 /* src += 8 */
+
+ bnez t4, 1b
+ addiu a0, a0, 16 /* dst += 8 */
+
+ RESTORE_REGS_FROM_STACK 12, s0, s1, s2, s3, s4, v0, v1
+ b 5f
+ nop
+
+
+ /* dst unaligned: do one item and fall down to the src unaligned case */
+2: lhu t1, 0 (a1)
+ lhu t0, 0 (a0)
+ addiu a2, a2, -1 /* len-- */
+ andi t2, t1, 0x07e0
+ andi t1, t1, 0xf81f
+ mul t2, t2, a3
+ mul t1, t1, t6
+ andi t3, t0, 0x07e0
+ andi t0, t0, 0xf81f
+ mul t3, t3, t5
+ mul t0, t0, t7
+ addiu a1, a1, 2 /* src++ */
+ srl t2, t2, 8
+ srl t1, t1, 6
+ andi t2, t2, 0x07e0
+ andi t1, t1, 0xf81f
+ or t1, t1, t2
+ srl t3, t3, 8
+ srl t0, t0, 6
+ andi t3, t3, 0x07e0
+ andi t0, t0, 0xf81f
+ or t0, t0, t3
+ addu t0, t0, t1 /* src * alpha + dst * ialpha */
+ sh t0, 0 (a0)
+ addiu a0, a0, 2 /* dst++ */
+
+ /* src unaligned */
+3: beqz a2, 0f
+ srl t4, a2, 3 /* t4 = len / 8 */
+ beqz t4, 5f
+ andi a2, a2, 0x7 /* len = len % 8 */
+ SAVE_REGS_ON_STACK 12, s0, s1, s2, s3, s4, v0, v1
+
+1: lw t0, 0 (a0) /* [d0, d1] */
+ lw v0, 4 (a0) /* [d2, d3] */
+ lw s0, 8 (a0) /* [d4, d5] */
+ lw s2, 12 (a0) /* [d6, d7] */
+
+ LDHI (t1, 0, a1) /* [s0, __] */
+ lw v1, 2 (a1) /* [s1, s2] */
+ lw s1, 6 (a1) /* [s3, s4] */
+ lw s3, 10 (a1) /* [s5, s6] */
+ LDLO (s4, 12, a1) /* [__, s7] */
+
+ pref 4, 14 (a1)
+ pref 5, 16 (a0)
+
+ PACK (t1, v1, t1) /* [s0, s1] */
+ PACK (v1, s1, v1) /* [s2, s3] */
+ PACK (s1, s3, s1) /* [s4, s5] */
+ PACK (s3, s4, s3) /* [s6, s7] */
+
+ and t2, t1, t8
+ ext t3, t2, 0, 16
+ srl t2, t2, 16
+ mul t3, t3, a3
+ mul t2, t2, a3
+ and t1, t1, t9
+ ext s4, t1, 0, 16
+ mul s4, s4, t6
+ srl t1, t1, 16
+ mul t1, t1, t6
+ srl t3, t3, 8
+ srl t2, t2, 8
+ append t2, t3, 16
+ and t2, t2, t8
+ srl s4, s4, 6
+ and t3, v1, t8
+ srl t1, t1, 6
+ append t1, s4, 16
+ and t1, t1, t9
+ or t1, t1, t2
+ ext t2, t3, 0, 16
+ srl t3, t3, 16
+ mul t2, t2, a3
+ mul t3, t3, a3
+ and v1, v1, t9
+ ext s4, v1, 0, 16
+ mul s4, s4, t6
+ srl v1, v1, 16
+ mul v1, v1, t6
+ srl t2, t2, 8
+ srl t3, t3, 8
+ append t3, t2, 16
+ and t3, t3, t8
+ srl s4, s4, 6
+ and t2, s1, t8
+ srl v1, v1, 6
+ append v1, s4, 16
+ and v1, v1, t9
+ or v1, v1, t3
+ ext t3, t2, 0, 16
+ srl t2, t2, 16
+ mul t3, t3, a3
+ mul t2, t2, a3
+ and s1, s1, t9
+ ext s4, s1, 0, 16
+ mul s4, s4, t6
+ srl s1, s1, 16
+ mul s1, s1, t6
+ srl t3, t3, 8
+ srl t2, t2, 8
+ append t2, t3, 16
+ and t2, t2, t8
+ srl s4, s4, 6
+ and t3, s3, t8
+ srl s1, s1, 6
+ append s1, s4, 16
+ and s1, s1, t9
+ or s1, s1, t2
+ ext t2, t3, 0, 16
+ srl t3, t3, 16
+ mul t2, t2, a3
+ mul t3, t3, a3
+ and s3, s3, t9
+ ext s4, s3, 0, 16
+ mul s4, s4, t6
+ srl s3, s3, 16
+ mul s3, s3, t6
+ srl t2, t2, 8
+ srl t3, t3, 8
+ append t3, t2, 16
+ and t3, t3, t8
+ srl s4, s4, 6
+ and t2, t0, t8
+ srl s3, s3, 6
+ append s3, s4, 16
+ and s3, s3, t9
+ or s3, s3, t3
+ ext t3, t2, 0, 16
+ srl t2, t2, 16
+ mul t3, t3, t5
+ mul t2, t2, t5
+ and t0, t0, t9
+ ext s4, t0, 0, 16
+ mul s4, s4, t7
+ srl t0, t0, 16
+ mul t0, t0, t7
+ srl t3, t3, 8
+ srl t2, t2, 8
+ append t2, t3, 16
+ and t2, t2, t8
+ srl s4, s4, 6
+ and t3, v0, t8
+ srl t0, t0, 6
+ append t0, s4, 16
+ and t0, t0, t9
+ or t0, t0, t2
+ ext t2, t3, 0, 16
+ srl t3, t3, 16
+ mul t2, t2, t5
+ mul t3, t3, t5
+ and v0, v0, t9
+ ext s4, v0, 0, 16
+ mul s4, s4, t7
+ srl v0, v0, 16
+ mul v0, v0, t7
+ srl t2, t2, 8
+ srl t3, t3, 8
+ append t3, t2, 16
+ and t3, t3, t8
+ srl s4, s4, 6
+ and t2, s0, t8
+ srl v0, v0, 6
+ append v0, s4, 16
+ and v0, v0, t9
+ or v0, v0, t3
+ ext t3, t2, 0, 16
+ srl t2, t2, 16
+ mul t3, t3, t5
+ mul t2, t2, t5
+ and s0, s0, t9
+ ext s4, s0, 0, 16
+ mul s4, s4, t7
+ srl s0, s0, 16
+ mul s0, s0, t7
+ srl t3, t3, 8
+ srl t2, t2, 8
+ append t2, t3, 16
+ and t2, t2, t8
+ srl s4, s4, 6
+ and t3, s2, t8
+ srl s0, s0, 6
+ append s0, s4, 16
+ and s0, s0, t9
+ or s0, s0, t2
+ ext t2, t3, 0, 16
+ srl t3, t3, 16
+ mul t2, t2, t5
+ mul t3, t3, t5
+ and s2, s2, t9
+ ext s4, s2, 0, 16
+ mul s4, s4, t7
+ srl s2, s2, 16
+ mul s2, s2, t7
+ srl t2, t2, 8
+ srl t3, t3, 8
+ append t3, t2, 16
+ and t3, t3, t8
+ srl s4, s4, 6
+ addu.ph t0, t0, t1
+ srl s2, s2, 6
+ append s2, s4, 16
+ and s2, s2, t9
+ or s2, s2, t3
+ addu.ph v0, v0, v1 /* v0 = [S2 + D2, S3 + D3] */
+ addu.ph s0, s0, s1 /* s0 = [S4 + D4, S5 + D5] */
+ addu.ph s2, s2, s3 /* s2 = [S6 + D6, S7 + D7] */
+
+ sw t0, 0 (a0) /* [SS0, SS1] */
+ sw v0, 4 (a0) /* [SS2, SS3] */
+ sw s0, 8 (a0) /* [SS4, SS5] */
+ sw s2, 12 (a0) /* [SS6, SS7] */
+
+ addiu t4, t4, -1 /* t4-- */
+ addiu a1, a1, 16 /* src += 8 */
+
+ bnez t4, 1b
+ addiu a0, a0, 16 /* dst += 8 */
+
+ RESTORE_REGS_FROM_STACK 12, s0, s1, s2, s3, s4, v0, v1
+
+5: /* Process remaining items (len < 8), one at a time */
+ beqz a2, 0f
+ nop
+
+1: lhu t1, 0 (a1)
+ lhu t0, 0 (a0)
+ addiu a1, a1, 2 /* src++ */
+ andi t2, t1, 0x07e0
+ andi t1, t1, 0xf81f
+ mul t2, t2, a3
+ mul t1, t1, t6
+ andi t3, t0, 0x07e0
+ andi t0, t0, 0xf81f
+ mul t3, t3, t5
+ mul t0, t0, t7
+ addiu a2, a2, -1 /* len-- */
+ srl t2, t2, 8
+ srl t1, t1, 6
+ andi t2, t2, 0x07e0
+ andi t1, t1, 0xf81f
+ or t1, t1, t2
+ srl t3, t3, 8
+ srl t0, t0, 6
+ andi t3, t3, 0x07e0
+ andi t0, t0, 0xf81f
+ or t0, t0, t3
+
+ addu t0, t0, t1 /* src*alpha + dst*ialpha */
+ sh t0, 0 (a0)
+ bnez a2, 1b
+ addiu a0, a0, 2 /* dst++ */
+
+0: jr ra
+ nop
+
+END(qt_blend_rgb16_on_rgb16_mips_dspr2_asm)
+
+#undef PACK
+#undef LDHI
+#undef LDLO
diff --git a/src/gui/painting/qpdf.cpp b/src/gui/painting/qpdf.cpp
index c05f47c59d..147fa3f561 100644
--- a/src/gui/painting/qpdf.cpp
+++ b/src/gui/painting/qpdf.cpp
@@ -1486,7 +1486,6 @@ QPdfEnginePrivate::QPdfEnginePrivate()
leftMargin(10), topMargin(10), rightMargin(10), bottomMargin(10) // ~3.5 mm
{
resolution = 1200;
- postscript = false;
currentObject = 1;
currentPage = 0;
stroker.stream = 0;
@@ -1520,7 +1519,6 @@ bool QPdfEngine::begin(QPaintDevice *pdev)
d->ownsDevice = true;
}
- d->postscript = false;
d->currentObject = 1;
d->currentPage = new QPdfPage;
@@ -2506,8 +2504,8 @@ void QPdfEnginePrivate::drawTextItem(const QPointF &p, const QTextItemInt &ti)
QFontEngine::FaceId face_id = fe->faceId();
bool noEmbed = false;
if (face_id.filename.isEmpty()
- || (!postscript && ((fe->fsType & 0x200) /* bitmap embedding only */
- || (fe->fsType == 2) /* no embedding allowed */))) {
+ || fe->fsType & 0x200 /* bitmap embedding only */
+ || fe->fsType == 2 /* no embedding allowed */) {
*currentPage << "Q\n";
q->QPaintEngine::drawTextItem(p, ti);
*currentPage << "q\n";
diff --git a/src/gui/painting/qpdf_p.h b/src/gui/painting/qpdf_p.h
index 54530d0f78..ae2d4b00ac 100644
--- a/src/gui/painting/qpdf_p.h
+++ b/src/gui/painting/qpdf_p.h
@@ -250,7 +250,6 @@ public:
void newPage();
- bool postscript;
int currentObject;
QPdfPage* currentPage;
diff --git a/src/gui/painting/qpdfwriter.cpp b/src/gui/painting/qpdfwriter.cpp
index a783aad66a..27fb8b1646 100644
--- a/src/gui/painting/qpdfwriter.cpp
+++ b/src/gui/painting/qpdfwriter.cpp
@@ -209,6 +209,8 @@ void QPdfWriter::setMargins(const Margins &m)
{
Q_D(QPdfWriter);
+ QPagedPaintDevice::setMargins(m);
+
const qreal multiplier = 72./25.4;
d->engine->d_func()->leftMargin = m.left*multiplier;
d->engine->d_func()->rightMargin = m.right*multiplier;
diff --git a/src/gui/painting/qt_mips_asm_dsp_p.h b/src/gui/painting/qt_mips_asm_dsp_p.h
index 1b78eaf52c..54fcfab206 100644
--- a/src/gui/painting/qt_mips_asm_dsp_p.h
+++ b/src/gui/painting/qt_mips_asm_dsp_p.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2012 MIPS Technologies, www.mips.com, author Damir Tatalovic <dtatalovic@mips.com>
+** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com
** Contact: http://www.qt-project.org/legal
**
** This file is part of the QtGui module of the Qt Toolkit.
@@ -261,4 +261,168 @@ LEAF_MIPS32R2(symbol) \
or \out_1, \scratch1, \scratch3
.endm
+/*
+ * Checks if stack offset is big enough for storing/restoring regs_num
+ * number of register to/from stack. Stack offset must be greater than
+ * or equal to the number of bytes needed for storing registers (regs_num*4).
+ * Since MIPS ABI allows usage of first 16 bytes of stack frame (this is
+ * preserved for input arguments of the functions, already stored in a0-a3),
+ * stack size can be further optimized by utilizing this space.
+ */
+.macro CHECK_STACK_OFFSET regs_num, stack_offset
+.if \stack_offset < \regs_num * 4 - 16
+.error "Stack offset too small."
+.endif
+.endm
+
+/*
+ * Saves set of registers on stack. Maximum number of registers that
+ * can be saved on stack is limitted to 14 (a0-a3, v0-v1 and s0-s7).
+ * Stack offset is number of bytes that are added to stack pointer (sp)
+ * before registers are pushed in order to provide enough space on stack
+ * (offset must be multiple of 4, and must be big enough, as described by
+ * CHECK_STACK_OFFSET macro). This macro is intended to be used in
+ * combination with RESTORE_REGS_FROM_STACK macro. Example:
+ * SAVE_REGS_ON_STACK 4, v0, v1, s0, s1
+ * RESTORE_REGS_FROM_STACK 4, v0, v1, s0, s1
+ */
+.macro SAVE_REGS_ON_STACK stack_offset = 0, r1, \
+ r2 = 0, r3 = 0, r4 = 0, \
+ r5 = 0, r6 = 0, r7 = 0, \
+ r8 = 0, r9 = 0, r10 = 0, \
+ r11 = 0, r12 = 0, r13 = 0, \
+ r14 = 0
+ .if (\stack_offset < 0) || (\stack_offset - (\stack_offset / 4) * 4)
+ .error "Stack offset must be positive and multiple of 4."
+ .endif
+ .if \stack_offset != 0
+ addiu sp, sp, -\stack_offset
+ .endif
+ sw \r1, 0(sp)
+ .if \r2 != 0
+ sw \r2, 4(sp)
+ .endif
+ .if \r3 != 0
+ sw \r3, 8(sp)
+ .endif
+ .if \r4 != 0
+ sw \r4, 12(sp)
+ .endif
+ .if \r5 != 0
+ CHECK_STACK_OFFSET 5, \stack_offset
+ sw \r5, 16(sp)
+ .endif
+ .if \r6 != 0
+ CHECK_STACK_OFFSET 6, \stack_offset
+ sw \r6, 20(sp)
+ .endif
+ .if \r7 != 0
+ CHECK_STACK_OFFSET 7, \stack_offset
+ sw \r7, 24(sp)
+ .endif
+ .if \r8 != 0
+ CHECK_STACK_OFFSET 8, \stack_offset
+ sw \r8, 28(sp)
+ .endif
+ .if \r9 != 0
+ CHECK_STACK_OFFSET 9, \stack_offset
+ sw \r9, 32(sp)
+ .endif
+ .if \r10 != 0
+ CHECK_STACK_OFFSET 10, \stack_offset
+ sw \r10, 36(sp)
+ .endif
+ .if \r11 != 0
+ CHECK_STACK_OFFSET 11, \stack_offset
+ sw \r11, 40(sp)
+ .endif
+ .if \r12 != 0
+ CHECK_STACK_OFFSET 12, \stack_offset
+ sw \r12, 44(sp)
+ .endif
+ .if \r13 != 0
+ CHECK_STACK_OFFSET 13, \stack_offset
+ sw \r13, 48(sp)
+ .endif
+ .if \r14 != 0
+ CHECK_STACK_OFFSET 14, \stack_offset
+ sw \r14, 52(sp)
+ .endif
+.endm
+
+/*
+ * Restores set of registers from stack. Maximum number of registers that
+ * can be restored from stack is limitted to 14 (a0-a3, v0-v1 and s0-s7).
+ * Stack offset is number of bytes that are added to stack pointer (sp)
+ * after registers are restored (offset must be multiple of 4, and must
+ * be big enough, as described by CHECK_STACK_OFFSET macro). This macro is
+ * intended to be used in combination with RESTORE_REGS_FROM_STACK macro.
+ * Example:
+ * SAVE_REGS_ON_STACK 4, v0, v1, s0, s1
+ * RESTORE_REGS_FROM_STACK 4, v0, v1, s0, s1
+ */
+.macro RESTORE_REGS_FROM_STACK stack_offset = 0, r1, \
+ r2 = 0, r3 = 0, r4 = 0, \
+ r5 = 0, r6 = 0, r7 = 0, \
+ r8 = 0, r9 = 0, r10 = 0, \
+ r11 = 0, r12 = 0, r13 = 0, \
+ r14 = 0
+ .if (\stack_offset < 0) || (\stack_offset - (\stack_offset/4)*4)
+ .error "Stack offset must be pozitive and multiple of 4."
+ .endif
+ lw \r1, 0(sp)
+ .if \r2 != 0
+ lw \r2, 4(sp)
+ .endif
+ .if \r3 != 0
+ lw \r3, 8(sp)
+ .endif
+ .if \r4 != 0
+ lw \r4, 12(sp)
+ .endif
+ .if \r5 != 0
+ CHECK_STACK_OFFSET 5, \stack_offset
+ lw \r5, 16(sp)
+ .endif
+ .if \r6 != 0
+ CHECK_STACK_OFFSET 6, \stack_offset
+ lw \r6, 20(sp)
+ .endif
+ .if \r7 != 0
+ CHECK_STACK_OFFSET 7, \stack_offset
+ lw \r7, 24(sp)
+ .endif
+ .if \r8 != 0
+ CHECK_STACK_OFFSET 8, \stack_offset
+ lw \r8, 28(sp)
+ .endif
+ .if \r9 != 0
+ CHECK_STACK_OFFSET 9, \stack_offset
+ lw \r9, 32(sp)
+ .endif
+ .if \r10 != 0
+ CHECK_STACK_OFFSET 10, \stack_offset
+ lw \r10, 36(sp)
+ .endif
+ .if \r11 != 0
+ CHECK_STACK_OFFSET 11, \stack_offset
+ lw \r11, 40(sp)
+ .endif
+ .if \r12 != 0
+ CHECK_STACK_OFFSET 12, \stack_offset
+ lw \r12, 44(sp)
+ .endif
+ .if \r13 != 0
+ CHECK_STACK_OFFSET 13, \stack_offset
+ lw \r13, 48(sp)
+ .endif
+ .if \r14 != 0
+ CHECK_STACK_OFFSET 14, \stack_offset
+ lw \r14, 52(sp)
+ .endif
+ .if \stack_offset != 0
+ addiu sp, sp, \stack_offset
+ .endif
+.endm
+
#endif // QT_MIPS_ASM_DSP_H
diff --git a/src/platformsupport/eglconvenience/qeglplatformcontext.cpp b/src/platformsupport/eglconvenience/qeglplatformcontext.cpp
index 714ad8a17e..716b01b4d9 100644
--- a/src/platformsupport/eglconvenience/qeglplatformcontext.cpp
+++ b/src/platformsupport/eglconvenience/qeglplatformcontext.cpp
@@ -71,19 +71,19 @@ static inline void bindApi(const QSurfaceFormat &format)
QEGLPlatformContext::QEGLPlatformContext(const QSurfaceFormat &format, QPlatformOpenGLContext *share, EGLDisplay display,
EGLenum eglApi)
: m_eglDisplay(display)
- , m_eglApi(eglApi)
, m_eglConfig(q_configFromGLFormat(display, format))
{
init(format, share);
+ Q_UNUSED(eglApi);
}
QEGLPlatformContext::QEGLPlatformContext(const QSurfaceFormat &format, QPlatformOpenGLContext *share, EGLDisplay display,
EGLConfig config, EGLenum eglApi)
: m_eglDisplay(display)
- , m_eglApi(eglApi)
, m_eglConfig(config)
{
init(format, share);
+ Q_UNUSED(eglApi);
}
void QEGLPlatformContext::init(const QSurfaceFormat &format, QPlatformOpenGLContext *share)
diff --git a/src/platformsupport/eglconvenience/qeglplatformcontext_p.h b/src/platformsupport/eglconvenience/qeglplatformcontext_p.h
index 952f5a856a..7c05894246 100644
--- a/src/platformsupport/eglconvenience/qeglplatformcontext_p.h
+++ b/src/platformsupport/eglconvenience/qeglplatformcontext_p.h
@@ -77,7 +77,6 @@ private:
EGLContext m_eglContext;
EGLContext m_shareContext;
EGLDisplay m_eglDisplay;
- EGLenum m_eglApi;
EGLConfig m_eglConfig;
QSurfaceFormat m_format;
};
diff --git a/src/platformsupport/input/evdevtouch/qevdevtouch_p.h b/src/platformsupport/input/evdevtouch/qevdevtouch_p.h
index dbd401c297..d0ea839f51 100644
--- a/src/platformsupport/input/evdevtouch/qevdevtouch_p.h
+++ b/src/platformsupport/input/evdevtouch/qevdevtouch_p.h
@@ -48,13 +48,14 @@
#include <QThread>
#include <qpa/qwindowsysteminterface.h>
+#if !defined(QT_NO_MTDEV)
+struct mtdev;
+#endif
+
QT_BEGIN_NAMESPACE
class QSocketNotifier;
class QEvdevTouchScreenData;
-#if !defined(QT_NO_MTDEV)
-struct mtdev;
-#endif
class QEvdevTouchScreenHandler : public QObject
{
diff --git a/src/plugins/bearer/connman/qconnmanengine.cpp b/src/plugins/bearer/connman/qconnmanengine.cpp
index 6ea34b17f5..eac0d2b813 100644
--- a/src/plugins/bearer/connman/qconnmanengine.cpp
+++ b/src/plugins/bearer/connman/qconnmanengine.cpp
@@ -65,6 +65,9 @@ QConnmanEngine::QConnmanEngine(QObject *parent)
: QBearerEngineImpl(parent),
connmanManager(new QConnmanManagerInterface(this))
{
+ qDBusRegisterMetaType<ConnmanMap>();
+ qDBusRegisterMetaType<ConnmanMapList>();
+ qRegisterMetaType<ConnmanMapList>("ConnmanMapList");
}
QConnmanEngine::~QConnmanEngine()
@@ -82,6 +85,9 @@ void QConnmanEngine::initialize()
connect(connmanManager,SIGNAL(propertyChangedContext(QString,QString,QDBusVariant)),
this,SLOT(propertyChangedContext(QString,QString,QDBusVariant)));
+ connect(connmanManager,SIGNAL(servicesChanged(ConnmanMapList, QList<QDBusObjectPath>)),
+ this, SLOT(updateServices(ConnmanMapList, QList<QDBusObjectPath>)));
+
foreach (const QString &techPath, connmanManager->getTechnologies()) {
QConnmanTechnologyInterface *tech;
tech = new QConnmanTechnologyInterface(techPath, this);
@@ -172,6 +178,22 @@ void QConnmanEngine::requestUpdate()
QTimer::singleShot(0, this, SLOT(doRequestUpdate()));
}
+void QConnmanEngine::updateServices(const ConnmanMapList &changed, const QList<QDBusObjectPath> &removed)
+{
+ foreach (const QDBusObjectPath &objectPath, removed) {
+ removeConfiguration(QString::number(qHash(objectPath.path())));
+ }
+
+ foreach (const ConnmanMap &connmanMap, changed) {
+ const QString id = QString::number(qHash(connmanMap.objectPath.path()));
+ if (accessPointConfigurations.contains(id)) {
+ configurationChange(id);
+ } else {
+ addServiceConfiguration(connmanMap.objectPath.path());
+ }
+ }
+}
+
QString QConnmanEngine::serviceFromId(const QString &id)
{
QMutexLocker locker(&mutex);
@@ -394,21 +416,23 @@ QNetworkConfiguration::StateFlags QConnmanEngine::getStateForService(const QStri
QMutexLocker locker(&mutex);
QConnmanServiceInterface serv(service);
QNetworkConfiguration::StateFlags flag = QNetworkConfiguration::Defined;
- if( serv.getType() == "cellular") {
- if(serv.isSetupRequired()) {
+ if (serv.getType() == "cellular") {
+ if (serv.isSetupRequired() || !serv.isAutoConnect() || (serv.isRoaming() && isAlwaysAskRoaming())) {
flag = ( flag | QNetworkConfiguration::Defined);
} else {
flag = ( flag | QNetworkConfiguration::Discovered);
}
} else {
- if(serv.isFavorite()) {
- flag = ( flag | QNetworkConfiguration::Discovered);
+ if (serv.isFavorite()) {
+ if (serv.isAutoConnect()) {
+ flag = ( flag | QNetworkConfiguration::Discovered);
+ }
} else {
flag = QNetworkConfiguration::Undefined;
}
}
- if(serv.getState() == "ready" || serv.getState() == "online") {
+ if (serv.getState() == "ready" || serv.getState() == "online") {
flag = ( flag | QNetworkConfiguration::Active);
}
@@ -569,6 +593,12 @@ bool QConnmanEngine::requiresPolling() const
return false;
}
+bool QConnmanEngine::isAlwaysAskRoaming()
+{
+ QSettings confFile(QStringLiteral("nemomobile"), QStringLiteral("connectionagent"));
+ confFile.beginGroup(QStringLiteral("Connectionagent"));
+ return confFile.value(QStringLiteral("askForRoaming")).toBool();
+}
QT_END_NAMESPACE
#endif // QT_NO_DBUS
diff --git a/src/plugins/bearer/connman/qconnmanengine.h b/src/plugins/bearer/connman/qconnmanengine.h
index 9b6a271011..49a1a91d29 100644
--- a/src/plugins/bearer/connman/qconnmanengine.h
+++ b/src/plugins/bearer/connman/qconnmanengine.h
@@ -105,6 +105,7 @@ private Q_SLOTS:
void servicePropertyChangedContext(const QString &,const QString &,const QDBusVariant &);
void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
void technologyPropertyChangedContext(const QString &,const QString &, const QDBusVariant &);
+ void updateServices(const ConnmanMapList &changed, const QList<QDBusObjectPath> &removed);
private:
QConnmanManagerInterface *connmanManager;
@@ -128,6 +129,7 @@ private:
QNetworkConfiguration::BearerType ofonoTechToBearerType(const QString &type);
bool isRoamingAllowed(const QString &context);
+ bool isAlwaysAskRoaming();
protected:
bool requiresPolling() const;
};
diff --git a/src/plugins/bearer/connman/qconnmanservice_linux.cpp b/src/plugins/bearer/connman/qconnmanservice_linux.cpp
index 380cf92a24..6d9ee265c6 100644
--- a/src/plugins/bearer/connman/qconnmanservice_linux.cpp
+++ b/src/plugins/bearer/connman/qconnmanservice_linux.cpp
@@ -127,8 +127,24 @@ void QConnmanManagerInterface::connectNotify(const QMetaMethod &signal)
QObject::connect(helper,SIGNAL(propertyChangedContext(QString,QString,QDBusVariant)),
this,SIGNAL(propertyChangedContext(QString,QString,QDBusVariant)), Qt::UniqueConnection);
}
+ static const QMetaMethod servicesChangedSignal = QMetaMethod::fromSignal(&QConnmanManagerInterface::servicesChanged);
+ if (signal == servicesChangedSignal) {
+ if (!connection().connect(QLatin1String(CONNMAN_SERVICE),
+ QLatin1String(CONNMAN_MANAGER_PATH),
+ QLatin1String(CONNMAN_MANAGER_INTERFACE),
+ QLatin1String("ServicesChanged"),
+ this,SLOT(onServicesChanged(ConnmanMapList, QList<QDBusObjectPath>)))) {
+ qWarning() << "servicesChanged not connected";
+ }
+ }
}
+void QConnmanManagerInterface::onServicesChanged(const ConnmanMapList &changed, const QList<QDBusObjectPath> &removed)
+{
+ emit servicesChanged(changed, removed);
+}
+
+
void QConnmanManagerInterface::disconnectNotify(const QMetaMethod &signal)
{
static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QConnmanManagerInterface::propertyChanged);
diff --git a/src/plugins/bearer/connman/qconnmanservice_linux_p.h b/src/plugins/bearer/connman/qconnmanservice_linux_p.h
index a437c6609c..dd3f847cfd 100644
--- a/src/plugins/bearer/connman/qconnmanservice_linux_p.h
+++ b/src/plugins/bearer/connman/qconnmanservice_linux_p.h
@@ -155,11 +155,16 @@ Q_SIGNALS:
void propertyChanged(const QString &, const QDBusVariant &value);
void stateChanged(const QString &);
void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
+ void servicesChanged(const ConnmanMapList&, const QList<QDBusObjectPath> &);
protected:
void connectNotify(const QMetaMethod &signal);
void disconnectNotify(const QMetaMethod &signal);
QVariant getProperty(const QString &);
+
+private slots:
+ void onServicesChanged(const ConnmanMapList&, const QList<QDBusObjectPath> &);
+
};
class QConnmanProfileInterfacePrivate;
diff --git a/src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp b/src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp
index dad34e121b..11545b16c3 100644
--- a/src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp
+++ b/src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp
@@ -227,8 +227,7 @@ QByteArray TableGenerator::readLocaleAliases(const QByteArray &locale)
{
QFile aliases(systemComposeDir() + QLatin1String("/locale.alias"));
QByteArray fullLocaleName;
- if (aliases.exists()) {
- aliases.open(QIODevice::ReadOnly);
+ if (aliases.open(QIODevice::ReadOnly)) {
while (!aliases.atEnd()) {
char l[1024];
int read = aliases.readLine(l, sizeof(l));
@@ -267,8 +266,7 @@ QByteArray TableGenerator::readLocaleAliases(const QByteArray &locale)
bool TableGenerator::processFile(QString composeFileName)
{
QFile composeFile(composeFileName);
- if (composeFile.exists()) {
- composeFile.open(QIODevice::ReadOnly);
+ if (composeFile.open(QIODevice::ReadOnly)) {
parseComposeFile(&composeFile);
return true;
}
diff --git a/src/plugins/platforms/cocoa/qcocoabackingstore.mm b/src/plugins/platforms/cocoa/qcocoabackingstore.mm
index 665b3d4c13..30c15d823a 100644
--- a/src/plugins/platforms/cocoa/qcocoabackingstore.mm
+++ b/src/plugins/platforms/cocoa/qcocoabackingstore.mm
@@ -73,7 +73,8 @@ QPaintDevice *QCocoaBackingStore::paintDevice()
}
#endif
- QImage::Format format = window()->format().hasAlpha()
+ QCocoaWindow *cocoaWindow = static_cast<QCocoaWindow *>(window()->handle());
+ QImage::Format format = (window()->format().hasAlpha() || cocoaWindow->m_drawContentBorderGradient)
? QImage::Format_ARGB32_Premultiplied : QImage::Format_RGB32;
m_qImage = QImage(m_requestedSize * scaleFactor, format);
m_qImage.setDevicePixelRatio(scaleFactor);
diff --git a/src/plugins/platforms/cocoa/qcocoanativeinterface.h b/src/plugins/platforms/cocoa/qcocoanativeinterface.h
index d30b281eb8..5c59c73847 100644
--- a/src/plugins/platforms/cocoa/qcocoanativeinterface.h
+++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.h
@@ -132,6 +132,9 @@ private:
// touch events, which then will be delivered until the widget
// deregisters.
static void registerTouchWindow(QWindow *window, bool enable);
+
+ // Request a unified title and toolbar look for the window.
+ static void setContentBorderThickness(QWindow *window, int topThickness, int bottomThickness);
};
#endif // QCOCOANATIVEINTERFACE_H
diff --git a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm
index 795d1a8149..eb520b97c9 100644
--- a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm
+++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm
@@ -123,6 +123,8 @@ QPlatformNativeInterface::NativeResourceForIntegrationFunction QCocoaNativeInter
return NativeResourceForIntegrationFunction(QCocoaNativeInterface::registerTouchWindow);
if (resource.toLower() == "setembeddedinforeignview")
return NativeResourceForIntegrationFunction(QCocoaNativeInterface::setEmbeddedInForeignView);
+ if (resource.toLower() == "setcontentborderthickness")
+ return NativeResourceForIntegrationFunction(QCocoaNativeInterface::setContentBorderThickness);
return 0;
}
@@ -268,14 +270,19 @@ void QCocoaNativeInterface::registerTouchWindow(QWindow *window, bool enable)
if (!window)
return;
- // Make sure the QCocoaWindow is created when enabling. Disabling might
- // happen on window destruction, don't (re)create the QCocoaWindow then.
- if (enable)
- window->create();
-
QCocoaWindow *cocoaWindow = static_cast<QCocoaWindow *>(window->handle());
if (cocoaWindow)
cocoaWindow->registerTouch(enable);
}
+void QCocoaNativeInterface::setContentBorderThickness(QWindow *window, int topThickness, int bottomThickness)
+{
+ if (!window)
+ return;
+
+ QCocoaWindow *cocoaWindow = static_cast<QCocoaWindow *>(window->handle());
+ if (cocoaWindow)
+ cocoaWindow->setContentBorderThickness(topThickness, bottomThickness);
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h
index c7ec315f04..66c3241b3d 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.h
+++ b/src/plugins/platforms/cocoa/qcocoawindow.h
@@ -157,6 +157,8 @@ public:
void setWindowCursor(NSCursor *cursor);
void registerTouch(bool enable);
+ void setContentBorderThickness(int topThickness, int bottomThickness);
+ void applyContentBorderThickness(NSWindow *window);
qreal devicePixelRatio() const;
bool isWindowExposable();
@@ -214,6 +216,10 @@ public: // for QNSView
static const int NoAlertRequest;
NSInteger m_alertRequest;
id monitor;
+
+ bool m_drawContentBorderGradient;
+ int m_topContentBorderThickness;
+ int m_bottomContentBorderThickness;
};
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm
index ad11a525ad..8e977236fa 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.mm
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
@@ -220,6 +220,9 @@ QCocoaWindow::QCocoaWindow(QWindow *tlw)
, m_overrideBecomeKey(false)
, m_alertRequest(NoAlertRequest)
, monitor(nil)
+ , m_drawContentBorderGradient(false)
+ , m_topContentBorderThickness(0)
+ , m_bottomContentBorderThickness(0)
{
#ifdef QT_COCOA_ENABLE_WINDOW_DEBUG
qDebug() << "QCocoaWindow::QCocoaWindow" << this;
@@ -502,6 +505,9 @@ NSUInteger QCocoaWindow::windowStyleMask(Qt::WindowFlags flags)
}
}
+ if (m_drawContentBorderGradient)
+ styleMask |= NSTexturedBackgroundWindowMask;
+
#ifdef QT_COCOA_ENABLE_WINDOW_DEBUG
qDebug("windowStyleMask of '%s': flags %X -> styleMask %lX", qPrintable(window()->title()), (int)flags, styleMask);
#endif
@@ -927,6 +933,9 @@ NSWindow * QCocoaWindow::createNSWindow()
}
m_windowModality = window()->modality();
+
+ applyContentBorderThickness(createdWindow);
+
return createdWindow;
}
@@ -1069,6 +1078,38 @@ void QCocoaWindow::registerTouch(bool enable)
[m_contentView setAcceptsTouchEvents:NO];
}
+void QCocoaWindow::setContentBorderThickness(int topThickness, int bottomThickness)
+{
+ m_topContentBorderThickness = topThickness;
+ m_bottomContentBorderThickness = bottomThickness;
+ bool enable = (topThickness > 0 || bottomThickness > 0);
+ m_drawContentBorderGradient = enable;
+
+ applyContentBorderThickness(m_nsWindow);
+}
+
+void QCocoaWindow::applyContentBorderThickness(NSWindow *window)
+{
+ if (!window)
+ return;
+
+ if (m_drawContentBorderGradient)
+ [window setStyleMask:[window styleMask] | NSTexturedBackgroundWindowMask];
+ else
+ [window setStyleMask:[window styleMask] & ~NSTexturedBackgroundWindowMask];
+
+ if (m_topContentBorderThickness > 0) {
+ [window setContentBorderThickness:m_topContentBorderThickness forEdge:NSMaxYEdge];
+ [window setAutorecalculatesContentBorderThickness:NO forEdge:NSMaxYEdge];
+ }
+
+ if (m_bottomContentBorderThickness > 0) {
+ [window setContentBorderThickness:m_topContentBorderThickness forEdge:NSMinYEdge];
+ [window setAutorecalculatesContentBorderThickness:NO forEdge:NSMinYEdge];
+ }
+}
+
+
qreal QCocoaWindow::devicePixelRatio() const
{
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7
diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm
index e183f93c6c..f7b129aea1 100644
--- a/src/plugins/platforms/cocoa/qnsview.mm
+++ b/src/plugins/platforms/cocoa/qnsview.mm
@@ -408,6 +408,9 @@ static QTouchDevice *touchDevice = 0;
m_shouldSetGLContextinDrawRect = false;
}
+ if (m_platformWindow->m_drawContentBorderGradient)
+ NSDrawWindowBackground(dirtyRect);
+
if (!m_backingStore)
return;
@@ -451,7 +454,8 @@ static QTouchDevice *touchDevice = 0;
// Optimization: Copy frame buffer content instead of blending for
// top-level windows where Qt fills the entire window content area.
- if (m_platformWindow->m_nsWindow)
+ // (But don't overpaint the title-bar gradient)
+ if (m_platformWindow->m_nsWindow && !m_platformWindow->m_drawContentBorderGradient)
CGContextSetBlendMode(cgContext, kCGBlendModeCopy);
CGContextDrawImage(cgContext, dirtyWindowRect, cleanImg);
diff --git a/src/plugins/platforms/kms/qkmscursor.h b/src/plugins/platforms/kms/qkmscursor.h
index 91ac10aae5..f972604c01 100644
--- a/src/plugins/platforms/kms/qkmscursor.h
+++ b/src/plugins/platforms/kms/qkmscursor.h
@@ -44,11 +44,12 @@
#include <qpa/qplatformcursor.h>
+struct gbm_device;
+struct gbm_bo;
+
QT_BEGIN_NAMESPACE
class QKmsScreen;
-struct gbm_device;
-struct gbm_bo;
class QKmsCursor : public QPlatformCursor
{
diff --git a/src/plugins/platforms/kms/qkmsdevice.h b/src/plugins/platforms/kms/qkmsdevice.h
index 906e00aa13..2f8e2da709 100644
--- a/src/plugins/platforms/kms/qkmsdevice.h
+++ b/src/plugins/platforms/kms/qkmsdevice.h
@@ -51,9 +51,10 @@ extern "C" {
#include <QObject>
+struct gbm_device;
+
QT_BEGIN_NAMESPACE
-struct gbm_device;
class QKmsIntegration;
class QKmsDevice : public QObject
diff --git a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp
index 7ba48fe0cb..8ebfd018d0 100644
--- a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp
+++ b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp
@@ -572,6 +572,8 @@ bool QWindowsDialogHelperBase<BaseClass>::show(Qt::WindowFlags,
QWindow *parent)
{
const bool modal = (windowModality != Qt::NonModal);
+ if (!parent)
+ parent = QGuiApplication::focusWindow(); // Need a parent window, else the application loses activation when closed.
if (parent) {
m_ownerWindow = QWindowsWindow::handleOf(parent);
} else {
@@ -1633,8 +1635,8 @@ void QWindowsFileDialogHelper::selectFile(const QUrl &fileName)
if (QWindowsContext::verboseDialogs)
qDebug("%s %s" , __FUNCTION__, qPrintable(fileName.toString()));
- if (QWindowsNativeFileDialogBase *nfd = nativeFileDialog())
- nfd->selectFile(fileName.toLocalFile()); // ## should use QUrl::fileName() once it exists
+ if (hasNativeDialog()) // Might be invoked from the QFileDialog constructor.
+ nativeFileDialog()->selectFile(fileName.toLocalFile()); // ## should use QUrl::fileName() once it exists
}
QList<QUrl> QWindowsFileDialogHelper::selectedFiles() const
diff --git a/src/plugins/platforms/windows/qwindowsscreen.cpp b/src/plugins/platforms/windows/qwindowsscreen.cpp
index 530ebc38b7..1fc1be53c7 100644
--- a/src/plugins/platforms/windows/qwindowsscreen.cpp
+++ b/src/plugins/platforms/windows/qwindowsscreen.cpp
@@ -306,6 +306,8 @@ QList<QPlatformScreen *> QWindowsScreen::virtualSiblings() const
void QWindowsScreen::handleChanges(const QWindowsScreenData &newData)
{
+ m_data.physicalSizeMM = newData.physicalSizeMM;
+
if (m_data.geometry != newData.geometry) {
m_data.geometry = newData.geometry;
QWindowSystemInterface::handleScreenGeometryChange(screen(),
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index 9ff387190b..59a81bcee9 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -280,8 +280,12 @@ void QXcbWindow::create()
if (parent()) {
xcb_parent_id = static_cast<QXcbWindow *>(parent())->xcb_window();
m_embedded = parent()->window()->type() == Qt::ForeignWindow;
- }
+ QSurfaceFormat parentFormat = parent()->window()->requestedFormat();
+ if (window()->surfaceType() != QSurface::OpenGLSurface && parentFormat.hasAlpha()) {
+ window()->setFormat(parentFormat);
+ }
+ }
m_format = window()->requestedFormat();
#if (defined(XCB_USE_GLX) || defined(XCB_USE_EGL)) && defined(XCB_USE_XLIB)
diff --git a/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp b/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp
index e8758da1c7..f85fe0839f 100644
--- a/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp
+++ b/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp
@@ -419,12 +419,11 @@ void QGtk2FileDialogHelper::applyOptions()
if (!nameFilters.isEmpty())
setNameFilters(nameFilters);
- const QString initialDirectory = opts->initialDirectory().toLocalFile();
- if (!initialDirectory.isEmpty())
- setDirectory(initialDirectory);
+ if (opts->initialDirectory().isLocalFile())
+ setDirectory(opts->initialDirectory());
foreach (const QUrl &filename, opts->initiallySelectedFiles())
- selectFile(filename.toLocalFile());
+ selectFile(filename);
const QString initialNameFilter = opts->initiallySelectedNameFilter();
if (!initialNameFilter.isEmpty())
diff --git a/src/testlib/qbenchmarkperfevents.cpp b/src/testlib/qbenchmarkperfevents.cpp
index acc11b09ac..30a0d3ea9c 100644
--- a/src/testlib/qbenchmarkperfevents.cpp
+++ b/src/testlib/qbenchmarkperfevents.cpp
@@ -515,16 +515,18 @@ void QBenchmarkPerfEventsMeasurer::start()
{
initPerf();
- // pid == 0 -> attach to the current process
- // cpu == -1 -> monitor on all CPUs
- // group_fd == -1 -> this is the group leader
- // flags == 0 -> reserved, must be zero
- fd = perf_event_open(&attr, 0, -1, -1, 0);
if (fd == -1) {
- perror("QBenchmarkPerfEventsMeasurer::start: perf_event_open");
- exit(1);
- } else {
- ::fcntl(fd, F_SETFD, FD_CLOEXEC);
+ // pid == 0 -> attach to the current process
+ // cpu == -1 -> monitor on all CPUs
+ // group_fd == -1 -> this is the group leader
+ // flags == 0 -> reserved, must be zero
+ fd = perf_event_open(&attr, 0, -1, -1, 0);
+ if (fd == -1) {
+ perror("QBenchmarkPerfEventsMeasurer::start: perf_event_open");
+ exit(1);
+ } else {
+ ::fcntl(fd, F_SETFD, FD_CLOEXEC);
+ }
}
// enable the counter
diff --git a/src/testlib/qplaintestlogger.cpp b/src/testlib/qplaintestlogger.cpp
index 77be0e423e..3f65dc0a6e 100644
--- a/src/testlib/qplaintestlogger.cpp
+++ b/src/testlib/qplaintestlogger.cpp
@@ -197,6 +197,10 @@ namespace QTest {
}
}
+#if defined(Q_OS_WIN)
+Q_CORE_EXPORT bool qWinLogToStderr(); // defined in qlogging.cpp
+#endif
+
void QPlainTestLogger::outputMessage(const char *str)
{
#if defined(Q_OS_WINCE)
@@ -209,7 +213,11 @@ void QPlainTestLogger::outputMessage(const char *str)
} while (!strUtf16.isEmpty());
if (stream != stdout)
#elif defined(Q_OS_WIN)
- OutputDebugStringA(str);
+ // log to system log only if output is not redirected, and no console is attached
+ if (!qWinLogToStderr() && stream == stdout) {
+ OutputDebugStringA(str);
+ return;
+ }
#elif defined(Q_OS_ANDROID)
__android_log_write(ANDROID_LOG_INFO, "QTestLib", str);
#endif
diff --git a/src/tools/qdoc/config.cpp b/src/tools/qdoc/config.cpp
index 2d8e98d64c..56e7287c40 100644
--- a/src/tools/qdoc/config.cpp
+++ b/src/tools/qdoc/config.cpp
@@ -196,8 +196,7 @@ void MetaStack::process(QChar ch, const Location& location)
if (ch == QLatin1Char('{')) {
push(MetaStackEntry());
top().open();
- }
- else if (ch == QLatin1Char('}')) {
+ } else if (ch == QLatin1Char('}')) {
if (count() == 1)
location.fatal(tr("Unexpected '}'"));
@@ -215,12 +214,10 @@ void MetaStack::process(QChar ch, const Location& location)
}
++pre;
}
- }
- else if (ch == QLatin1Char(',') && count() > 1) {
+ } else if (ch == QLatin1Char(',') && count() > 1) {
top().close();
top().open();
- }
- else {
+ } else {
/*
This is where all the processing is done.
*/
@@ -296,12 +293,10 @@ Config::~Config()
void Config::load(const QString& fileName)
{
load(Location::null, fileName);
- if (loc.isEmpty()) {
+ if (loc.isEmpty())
loc = Location(fileName);
- }
- else {
+ else
loc.setEtc(true);
- }
lastLocation_ = Location::null;
}
@@ -472,9 +467,8 @@ QStringList Config::getCanonicalPathList(const QString& var) const
const ConfigVar& cv = configVars[i];
if (!cv.location_.isEmpty())
(Location&) lastLocation_ = cv.location_;
- if (!cv.plus_) {
+ if (!cv.plus_)
t.clear();
- }
const QString d = cv.currentPath_;
const QStringList& sl = cv.values_;
if (!sl.isEmpty()) {
@@ -786,9 +780,8 @@ QString Config::findFile(const Location& location,
QStringList::ConstIterator d = dirs.constBegin();
while (d != dirs.constEnd()) {
fileInfo.setFile(QDir(*d), firstComponent);
- if (fileInfo.exists()) {
+ if (fileInfo.exists())
break;
- }
++d;
}
}
@@ -808,9 +801,9 @@ QString Config::findFile(const Location& location,
QString extracted = extractedDirs[fileInfo.filePath()];
++c;
fileInfo.setFile(QDir(extracted), *c);
- }
- else
+ } else {
break;
+ }
userFriendlyFilePath += QLatin1Char('?');
}
@@ -876,9 +869,8 @@ QString Config::copyFile(const Location& location,
char buffer[1024];
int len;
- while ((len = inFile.read(buffer, sizeof(buffer))) > 0) {
+ while ((len = inFile.read(buffer, sizeof(buffer))) > 0)
outFile.write(buffer, len);
- }
return outFileName;
}
@@ -1002,17 +994,15 @@ void Config::load(Location location, const QString& fileName)
QChar c = text.at(0);
uint cc = c.unicode();
while (i < (int) text.length()) {
- if (cc == 0)
+ if (cc == 0) {
++i;
- else if (c.isSpace()) {
+ } else if (c.isSpace()) {
SKIP_CHAR();
- }
- else if (cc == '#') {
+ } else if (cc == '#') {
do {
SKIP_CHAR();
} while (cc != '\n');
- }
- else if (isMetaKeyChar(c)) {
+ } else if (isMetaKeyChar(c)) {
Location keyLoc = location;
bool plus = false;
QString stringValue;
@@ -1184,15 +1174,13 @@ void Config::load(Location location, const QString& fileName)
++key;
}
}
- }
- else {
+ } else {
location.fatal(tr("Unexpected character '%1' at beginning of line").arg(c));
}
}
popWorkingDir();
- if (!workingDirs_.isEmpty()) {
+ if (!workingDirs_.isEmpty())
QDir::setCurrent(workingDirs_.top());
- }
}
QStringList Config::getFilesHere(const QString& uncleanDir,
@@ -1219,9 +1207,8 @@ QStringList Config::getFilesHere(const QString& uncleanDir,
if (!fn->startsWith(QLatin1Char('~'))) {
QString s = dirInfo.filePath(*fn);
QString c = QDir::cleanPath(s);
- if (!excludedFiles.contains(c)) {
+ if (!excludedFiles.contains(c))
result.append(c);
- }
}
++fn;
}
@@ -1251,9 +1238,9 @@ void Config::pushWorkingDir(const QString& dir)
*/
QString Config::popWorkingDir()
{
- if (!workingDirs_.isEmpty()) {
+ if (!workingDirs_.isEmpty())
return workingDirs_.pop();
- }
+
qDebug() << "RETURNED EMPTY WORKING DIR";
return QString();
}
diff --git a/src/tools/qdoc/qdoc.pro b/src/tools/qdoc/qdoc.pro
index 55e32dd4a3..7ec4b4f726 100644
--- a/src/tools/qdoc/qdoc.pro
+++ b/src/tools/qdoc/qdoc.pro
@@ -1,3 +1,9 @@
+!force_bootstrap {
+ load(qfeatures)
+ requires(!contains(QT_DISABLED_FEATURES, xmlstreamwriter))
+ requires(!contains(QT_DISABLED_FEATURES, dom))
+}
+
option(host_build)
QT = core xml
diff --git a/src/widgets/itemviews/qlistview.cpp b/src/widgets/itemviews/qlistview.cpp
index 0cca52daa2..8238e5f6d4 100644
--- a/src/widgets/itemviews/qlistview.cpp
+++ b/src/widgets/itemviews/qlistview.cpp
@@ -915,6 +915,11 @@ QStyleOptionViewItem QListView::viewOptions() const
} else {
option.decorationPosition = QStyleOptionViewItem::Left;
}
+
+ if (d->gridSize().isValid()) {
+ option.rect.setSize(d->gridSize());
+ }
+
return option;
}
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp
index 08e8975f9d..df523e7e21 100644
--- a/src/widgets/kernel/qwidget.cpp
+++ b/src/widgets/kernel/qwidget.cpp
@@ -5026,16 +5026,6 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP
if (rgn.isEmpty())
return;
-#ifdef Q_WS_MAC
- if (qt_mac_clearDirtyOnWidgetInsideDrawWidget)
- dirtyOnWidget = QRegion();
-
- // We disable the rendering of QToolBar in the backingStore if
- // it's supposed to be in the unified toolbar on Mac OS X.
- if (backingStore && isInUnifiedToolbar)
- return;
-#endif // Q_WS_MAC
-
const bool asRoot = flags & DrawAsRoot;
bool onScreen = paintOnScreen();
@@ -9403,26 +9393,13 @@ QWidget *QWidgetPrivate::childAt_helper(const QPoint &p, bool ignoreChildrenInDe
if (children.isEmpty())
return 0;
-#ifdef Q_WS_MAC
- Q_Q(const QWidget);
- // Unified tool bars on the Mac require special handling since they live outside
- // QMainWindow's geometry(). See commit: 35667fd45ada49269a5987c235fdedfc43e92bb8
- bool includeFrame = q->isWindow() && qobject_cast<const QMainWindow *>(q)
- && static_cast<const QMainWindow *>(q)->unifiedTitleAndToolBarOnMac();
- if (includeFrame)
- return childAtRecursiveHelper(p, ignoreChildrenInDestructor, includeFrame);
-#endif
-
if (!pointInsideRectAndMask(p))
return 0;
return childAtRecursiveHelper(p, ignoreChildrenInDestructor);
}
-QWidget *QWidgetPrivate::childAtRecursiveHelper(const QPoint &p, bool ignoreChildrenInDestructor, bool includeFrame) const
+QWidget *QWidgetPrivate::childAtRecursiveHelper(const QPoint &p, bool ignoreChildrenInDestructor) const
{
-#ifndef Q_WS_MAC
- Q_UNUSED(includeFrame);
-#endif
for (int i = children.size() - 1; i >= 0; --i) {
QWidget *child = qobject_cast<QWidget *>(children.at(i));
if (!child || child->isWindow() || child->isHidden() || child->testAttribute(Qt::WA_TransparentForMouseEvents)
@@ -9432,14 +9409,6 @@ QWidget *QWidgetPrivate::childAtRecursiveHelper(const QPoint &p, bool ignoreChil
// Map the point 'p' from parent coordinates to child coordinates.
QPoint childPoint = p;
-#ifdef Q_WS_MAC
- // 'includeFrame' is true if the child's parent is a top-level QMainWindow with an unified tool bar.
- // An unified tool bar on the Mac lives outside QMainWindow's geometry(), so a normal
- // QWidget::mapFromParent won't do the trick.
- if (includeFrame && qobject_cast<QToolBar *>(child))
- childPoint = qt_mac_nativeMapFromParent(child, p);
- else
-#endif
childPoint -= child->data->crect.topLeft();
// Check if the point hits the child.
@@ -9614,13 +9583,7 @@ void QWidget::setParent(QWidget *parent, Qt::WindowFlags f)
bool newParent = (parent != parentWidget()) || !wasCreated || desktopWidget;
if (newParent && parent && !desktopWidget) {
- if (testAttribute(Qt::WA_NativeWindow) && !qApp->testAttribute(Qt::AA_DontCreateNativeWidgetSiblings)
-#ifdef Q_WS_MAC
- // On Mac, toolbars inside the unified title bar will never overlap with
- // siblings in the content view. So we skip enforce native siblings in that case
- && !d->isInUnifiedToolbar && parentWidget() && parentWidget()->isWindow()
-#endif // Q_WS_MAC
- )
+ if (testAttribute(Qt::WA_NativeWindow) && !qApp->testAttribute(Qt::AA_DontCreateNativeWidgetSiblings))
parent->d_func()->enforceNativeChildren();
else if (parent->d_func()->nativeChildrenForced() || parent->testAttribute(Qt::WA_PaintOnScreen))
setAttribute(Qt::WA_NativeWindow);
@@ -9879,12 +9842,6 @@ void QWidget::repaint(const QRect &rect)
return;
if (hasBackingStoreSupport()) {
-#ifdef Q_WS_MAC
- if (qt_widget_private(this)->isInUnifiedToolbar) {
- qt_widget_private(this)->unifiedSurface->renderToolbar(this, true);
- return;
- }
-#endif // Q_WS_MAC
QTLWExtra *tlwExtra = window()->d_func()->maybeTopData();
if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) {
tlwExtra->inRepaint = true;
@@ -9914,12 +9871,6 @@ void QWidget::repaint(const QRegion &rgn)
return;
if (hasBackingStoreSupport()) {
-#ifdef Q_WS_MAC
- if (qt_widget_private(this)->isInUnifiedToolbar) {
- qt_widget_private(this)->unifiedSurface->renderToolbar(this, true);
- return;
- }
-#endif // Q_WS_MAC
QTLWExtra *tlwExtra = window()->d_func()->maybeTopData();
if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) {
tlwExtra->inRepaint = true;
@@ -9982,12 +9933,6 @@ void QWidget::update(const QRect &rect)
}
if (hasBackingStoreSupport()) {
-#ifdef Q_WS_MAC
- if (qt_widget_private(this)->isInUnifiedToolbar) {
- qt_widget_private(this)->unifiedSurface->renderToolbar(this, true);
- return;
- }
-#endif // Q_WS_MAC
QTLWExtra *tlwExtra = window()->d_func()->maybeTopData();
if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore)
tlwExtra->backingStoreTracker->markDirty(r, this);
@@ -10017,12 +9962,6 @@ void QWidget::update(const QRegion &rgn)
}
if (hasBackingStoreSupport()) {
-#ifdef Q_WS_MAC
- if (qt_widget_private(this)->isInUnifiedToolbar) {
- qt_widget_private(this)->unifiedSurface->renderToolbar(this, true);
- return;
- }
-#endif // Q_WS_MAC
QTLWExtra *tlwExtra = window()->d_func()->maybeTopData();
if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore)
tlwExtra->backingStoreTracker->markDirty(r, this);
@@ -10218,13 +10157,7 @@ void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on)
qApp->inputMethod()->commit();
qApp->inputMethod()->update(Qt::ImEnabled);
}
- if (!qApp->testAttribute(Qt::AA_DontCreateNativeWidgetSiblings) && parentWidget()
-#ifdef Q_WS_MAC
- // On Mac, toolbars inside the unified title bar will never overlap with
- // siblings in the content view. So we skip enforce native siblings in that case
- && !d->isInUnifiedToolbar && parentWidget()->isWindow()
-#endif // Q_WS_MAC
- )
+ if (!qApp->testAttribute(Qt::AA_DontCreateNativeWidgetSiblings) && parentWidget())
parentWidget()->d_func()->enforceNativeChildren();
if (on && !internalWinId() && testAttribute(Qt::WA_WState_Created))
d->createWinId();
@@ -11544,28 +11477,6 @@ void QWidget::clearMask()
setMask(QRegion());
}
-#ifdef Q_WS_MAC
-void QWidgetPrivate::syncUnifiedMode() {
- // The whole purpose of this method is to keep the unifiedToolbar in sync.
- // That means making sure we either exchange the drawing methods or we let
- // the toolbar know that it does not require to draw the baseline.
- Q_Q(QWidget);
- // This function makes sense only if this is a top level
- if(!q->isWindow())
- return;
- OSWindowRef window = qt_mac_window_for(q);
- if(changeMethods) {
- // Ok, we are in documentMode.
- if(originalDrawMethod)
- qt_mac_replaceDrawRect(window, this);
- } else {
- if(!originalDrawMethod)
- qt_mac_replaceDrawRectOriginal(window, this);
- }
-}
-
-#endif // Q_WS_MAC
-
QT_END_NAMESPACE
#include "moc_qwidget.cpp"
diff --git a/src/widgets/kernel/qwidget_p.h b/src/widgets/kernel/qwidget_p.h
index df40908c00..943b7057b5 100644
--- a/src/widgets/kernel/qwidget_p.h
+++ b/src/widgets/kernel/qwidget_p.h
@@ -495,7 +495,7 @@ public:
void setConstraints_sys();
bool pointInsideRectAndMask(const QPoint &) const;
QWidget *childAt_helper(const QPoint &, bool) const;
- QWidget *childAtRecursiveHelper(const QPoint &p, bool, bool includeFrame = false) const;
+ QWidget *childAtRecursiveHelper(const QPoint &p, bool) const;
void updateGeometry_helper(bool forceUpdate);
void getLayoutItemMargins(int *left, int *top, int *right, int *bottom) const;
@@ -780,7 +780,6 @@ public:
void finishCreateWindow_sys_Cocoa(void * /*NSWindow * */ windowRef);
void syncCocoaMask();
void finishCocoaMaskSetup();
- void syncUnifiedMode();
// Did we add the drawRectOriginal method?
bool drawRectOriginalAdded;
// Is the original drawRect method available?
diff --git a/src/widgets/kernel/qwidget_qpa.cpp b/src/widgets/kernel/qwidget_qpa.cpp
index 3281e0c6f7..0fd794cc02 100644
--- a/src/widgets/kernel/qwidget_qpa.cpp
+++ b/src/widgets/kernel/qwidget_qpa.cpp
@@ -118,11 +118,12 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO
win->resize(q->size());
win->setScreen(QGuiApplication::screens().value(topData()->screenIndex, 0));
- if (q->testAttribute(Qt::WA_TranslucentBackground)) {
- QSurfaceFormat format;
+ QSurfaceFormat format = win->requestedFormat();
+ if ((flags & Qt::Window) && win->surfaceType() != QSurface::OpenGLSurface
+ && q->testAttribute(Qt::WA_TranslucentBackground)) {
format.setAlphaBufferSize(8);
- win->setFormat(format);
}
+ win->setFormat(format);
if (QWidget *nativeParent = q->nativeParentWidget()) {
if (nativeParent->windowHandle()) {
diff --git a/src/widgets/kernel/qwidgetbackingstore.cpp b/src/widgets/kernel/qwidgetbackingstore.cpp
index 02fa80bef6..4a94cd6cb8 100644
--- a/src/widgets/kernel/qwidgetbackingstore.cpp
+++ b/src/widgets/kernel/qwidgetbackingstore.cpp
@@ -66,15 +66,6 @@ QT_BEGIN_NAMESPACE
extern QRegion qt_dirtyRegion(QWidget *);
-/*
- A version of QRect::intersects() that does not normalize the rects.
-*/
-static inline bool qRectIntersects(const QRect &r1, const QRect &r2)
-{
- return (qMax(r1.left(), r2.left()) <= qMin(r1.right(), r2.right())
- && qMax(r1.top(), r2.top()) <= qMin(r1.bottom(), r2.bottom()));
-}
-
/**
* Flushes the contents of the \a backingStore into the screen area of \a widget.
* \a tlwOffset is the position of the top level widget relative to the window surface.
diff --git a/src/widgets/styles/qcommonstyle.cpp b/src/widgets/styles/qcommonstyle.cpp
index a9f1c3bbbc..2d7107598f 100644
--- a/src/widgets/styles/qcommonstyle.cpp
+++ b/src/widgets/styles/qcommonstyle.cpp
@@ -838,7 +838,10 @@ QSize QCommonStylePrivate::viewItemSize(const QStyleOptionViewItem *option, int
break;
case QStyleOptionViewItem::Top:
case QStyleOptionViewItem::Bottom:
- bounds.setWidth(wrapText ? option->decorationSize.width() : QFIXED_MAX);
+ if (wrapText)
+ bounds.setWidth(bounds.isValid() ? bounds.width() - 2 * textMargin : option->decorationSize.width());
+ else
+ bounds.setWidth(QFIXED_MAX);
break;
default:
break;
diff --git a/src/widgets/styles/qmacstyle_mac.mm b/src/widgets/styles/qmacstyle_mac.mm
index 5db4801c37..d13339b555 100644
--- a/src/widgets/styles/qmacstyle_mac.mm
+++ b/src/widgets/styles/qmacstyle_mac.mm
@@ -679,6 +679,18 @@ bool qt_macWindowIsTextured(const QWidget *window)
return false;
}
+static bool qt_macWindowMainWindow(const QWidget *window)
+{
+ if (QWindow *w = window->windowHandle()) {
+ if (w->handle()) {
+ if (NSWindow *nswindow = static_cast<NSWindow*>(QGuiApplication::platformNativeInterface()->nativeResourceForWindow(QByteArrayLiteral("nswindow"), w))) {
+ return [nswindow isMainWindow];
+ }
+ }
+ }
+ return false;
+}
+
/*****************************************************************************
QMacCGStyle globals
*****************************************************************************/
@@ -2425,11 +2437,6 @@ int QMacStyle::pixelMetric(PixelMetric metric, const QStyleOption *opt, const QW
break;
case PM_ToolBarFrameWidth:
ret = 1;
- if (widget) {
- if (QMainWindow * mainWindow = qobject_cast<QMainWindow *>(widget->parent()))
- if (mainWindow->unifiedTitleAndToolBarOnMac())
- ret = 0;
- }
break;
case PM_ScrollView_ScrollBarOverlap:
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7
@@ -3008,23 +3015,19 @@ void QMacStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, QPai
if (opt->state & State_Horizontal) {
while (y < opt->rect.height() - RectHeight - 5) {
path.moveTo(x, y);
- path.addRect(x, y, RectHeight, RectHeight);
+ path.addEllipse(x, y, RectHeight, RectHeight);
y += 6;
}
} else {
while (x < opt->rect.width() - RectHeight - 5) {
path.moveTo(x, y);
- path.addRect(x, y, RectHeight, RectHeight);
+ path.addEllipse(x, y, RectHeight, RectHeight);
x += 6;
}
}
p->setPen(Qt::NoPen);
- QColor dark = opt->palette.dark().color();
- dark.setAlphaF(0.75);
- QColor light = opt->palette.light().color();
- light.setAlphaF(0.6);
- p->fillPath(path, light);
- p->translate(1, 1);
+ QColor dark = opt->palette.dark().color().darker();
+ dark.setAlphaF(0.50);
p->fillPath(path, dark);
p->restore();
@@ -3437,14 +3440,8 @@ void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter
if (tb->toolButtonStyle != Qt::ToolButtonIconOnly) {
needText = true;
if (tb->toolButtonStyle == Qt::ToolButtonTextUnderIcon) {
- QMainWindow *mw = w ? qobject_cast<QMainWindow *>(w->window()) : 0;
- if (mw && mw->unifiedTitleAndToolBarOnMac()) {
- pr.setHeight(pixmap.size().height() / pixmap.devicePixelRatio());
- cr.adjust(0, pr.bottom() + 1, 0, 1);
- } else {
- pr.setHeight(pixmap.size().height() / pixmap.devicePixelRatio() + 6);
- cr.adjust(0, pr.bottom(), 0, -3);
- }
+ pr.setHeight(pixmap.size().height() / pixmap.devicePixelRatio() + 6);
+ cr.adjust(0, pr.bottom(), 0, -3);
alignment |= Qt::AlignCenter;
} else {
pr.setWidth(pixmap.width() / pixmap.devicePixelRatio() + 8);
@@ -4442,12 +4439,34 @@ void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter
}
break;
case CE_ToolBar: {
- // For unified tool bars, draw nothing.
- if (w) {
+ const QStyleOptionToolBar *toolBar = qstyleoption_cast<const QStyleOptionToolBar *>(opt);
+
+ // Unified title and toolbar drawing. In this mode the cocoa platform plugin will
+ // fill the top toolbar area part with a background gradient that "unifies" with
+ // the title bar. The following code fills the toolBar area with transparent pixels
+ // to make that gradient visible.
+ if (w) {
if (QMainWindow * mainWindow = qobject_cast<QMainWindow *>(w->window())) {
- if (mainWindow->unifiedTitleAndToolBarOnMac())
+ if (toolBar && toolBar->toolBarArea == Qt::TopToolBarArea && mainWindow->unifiedTitleAndToolBarOnMac()) {
+
+ // fill with transparent pixels.
+ p->save();
+ p->setCompositionMode(QPainter::CompositionMode_Source);
+ p->fillRect(opt->rect, Qt::transparent);
+ p->restore();
+
+ // drow horizontal sepearator line at toolBar bottom.
+ SInt32 margin;
+ GetThemeMetric(kThemeMetricSeparatorSize, &margin);
+ CGRect separatorRect = CGRectMake(opt->rect.left(), opt->rect.bottom(), opt->rect.width(), margin);
+ HIThemeSeparatorDrawInfo separatorDrawInfo;
+ separatorDrawInfo.version = 0;
+ separatorDrawInfo.state = qt_macWindowMainWindow(mainWindow) ? kThemeStateActive : kThemeStateInactive;
+ QMacCGContext cg(p);
+ HIThemeDrawSeparator(&separatorRect, &separatorDrawInfo, cg, kHIThemeOrientationNormal);
break;
}
+ }
}
// draw background gradient
@@ -6241,18 +6260,6 @@ QSize QMacStyle::sizeFromContents(ContentsType ct, const QStyleOption *opt,
}
break;
case CT_ToolButton:
- if (widget && qobject_cast<const QToolBar *>(widget->parentWidget())) {
- if (QMainWindow * mainWindow = qobject_cast<QMainWindow *>(widget->parent())) {
- if (mainWindow->unifiedTitleAndToolBarOnMac()) {
- sz.rwidth() += 4;
- if (sz.height() <= 32) {
- // Workaround strange HIToolBar bug when getting constraints.
- sz.rheight() += 1;
- }
- return sz;
- }
- }
- }
sz.rwidth() += 10;
sz.rheight() += 10;
return sz;
diff --git a/src/widgets/widgets/qcocoatoolbardelegate_mac.mm b/src/widgets/widgets/qcocoatoolbardelegate_mac.mm
deleted file mode 100644
index 2ea66b0d40..0000000000
--- a/src/widgets/widgets/qcocoatoolbardelegate_mac.mm
+++ /dev/null
@@ -1,151 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/legal
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia. For licensing terms and
-** conditions see http://qt.digia.com/licensing. For further information
-** use the contact form at http://qt.digia.com/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Digia gives you certain additional
-** rights. These rights are described in the Digia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#import <private/qcocoatoolbardelegate_mac_p.h>
-#include <private/qmainwindowlayout_p.h>
-#include <private/qt_mac_p.h>
-#include <private/qt_cocoa_helpers_mac_p.h>
-#include <private/qcocoaview_mac_p.h>
-#include <private/qwidget_p.h>
-#include <qtoolbar.h>
-#include <qlayout.h>
-#include <qdebug.h>
-
-QT_BEGIN_NAMESPACE
-extern QWidgetPrivate *qt_widget_private(QWidget *widget);
-QT_END_NAMESPACE
-
-QT_FORWARD_DECLARE_CLASS(QMainWindowLayout);
-QT_FORWARD_DECLARE_CLASS(QToolBar);
-QT_FORWARD_DECLARE_CLASS(QCFString);
-
-@implementation QT_MANGLE_NAMESPACE(QCocoaToolBarDelegate)
-
-- (id)initWithMainWindowLayout:(QMainWindowLayout *)layout
-{
- self = [super init];
- if (self) {
- mainWindowLayout = layout;
- }
- return self;
-}
-
-- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar
-{
- Q_UNUSED(toolbar);
- return [NSArray arrayWithObject:@"org.qt-project.qt.nstoolbar-qtoolbar"];
-}
-
-- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar
-{
- return [self toolbarAllowedItemIdentifiers:toolbar];
-}
-
-- (void)toolbarDidRemoveItem:(NSNotification *)notification
-{
- NSToolbarItem *item = [[notification userInfo] valueForKey:@"item"];
- mainWindowLayout->unifiedToolbarHash.remove(item);
- for (int i = 0; i < mainWindowLayout->toolbarItemsCopy.size(); ++i) {
- if (mainWindowLayout->toolbarItemsCopy.at(i) == item) {
- // I know about it, so release it.
- mainWindowLayout->toolbarItemsCopy.removeAt(i);
- mainWindowLayout->qtoolbarsInUnifiedToolbarList.removeAt(i);
- [item release];
- break;
- }
- }
-}
-
-- (NSToolbarItem *)toolbar:(NSToolbar *)nstoolbar itemForItemIdentifier:(NSString *)itemIdentifier
- willBeInsertedIntoToolbar:(BOOL)flag
-{
- Q_UNUSED(flag);
- Q_UNUSED(nstoolbar);
- QToolBar *tb = mainWindowLayout->cocoaItemIDToToolbarHash.value(
- QT_PREPEND_NAMESPACE(qt_mac_NSStringToQString)(itemIdentifier));
- NSToolbarItem *item = nil;
- if (tb) {
- item = [[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier];
- mainWindowLayout->unifiedToolbarHash.insert(item, tb);
- }
- return item;
-}
-
-- (void)toolbarWillAddItem:(NSNotification *)notification
-{
- NSToolbarItem *item = [[notification userInfo] valueForKey:@"item"];
- QToolBar *tb = mainWindowLayout->cocoaItemIDToToolbarHash.value(
- QT_PREPEND_NAMESPACE(qt_mac_NSStringToQString)([item itemIdentifier]));
- if (!tb)
- return; // I can't really do anything about this.
- [item retain];
- [item setView:QT_PREPEND_NAMESPACE(qt_mac_nativeview_for)(tb)];
-
- NSArray *items = [[qt_mac_window_for(mainWindowLayout->layoutState.mainWindow->window()) toolbar] items];
- int someIndex = 0;
- for (NSToolbarItem *i in items) {
- if (i == item)
- break;
- ++someIndex;
- }
- mainWindowLayout->toolbarItemsCopy.insert(someIndex, item);
-
- // This is synchronization code that was needed in Carbon, but may not be needed anymore here.
- QToolBar *toolbar = mainWindowLayout->unifiedToolbarHash.value(item);
- if (toolbar) {
- int toolbarIndex = mainWindowLayout->qtoolbarsInUnifiedToolbarList.indexOf(toolbar);
- if (someIndex != toolbarIndex) {
- // Dang, we must be out of sync, rebuild it from the "toolbarItemsCopy"
- mainWindowLayout->qtoolbarsInUnifiedToolbarList.clear();
- for (int i = 0; i < mainWindowLayout->toolbarItemsCopy.size(); ++i) {
- // This will either append the correct toolbar or an
- // null toolbar. This is fine because this list
- // is really only kept to make sure that things are but in the right order.
- mainWindowLayout->qtoolbarsInUnifiedToolbarList.append(
- mainWindowLayout->unifiedToolbarHash.value(mainWindowLayout->
- toolbarItemsCopy.at(i)));
- }
- }
- toolbar->update();
- }
-}
-
-@end
diff --git a/src/widgets/widgets/qmainwindowlayout_mac.mm b/src/widgets/widgets/qmainwindowlayout_mac.mm
deleted file mode 100644
index 38605c2e09..0000000000
--- a/src/widgets/widgets/qmainwindowlayout_mac.mm
+++ /dev/null
@@ -1,292 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/legal
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia. For licensing terms and
-** conditions see http://qt.digia.com/licensing. For further information
-** use the contact form at http://qt.digia.com/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Digia gives you certain additional
-** rights. These rights are described in the Digia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <private/qmainwindowlayout_p.h>
-#include <qtoolbar.h>
-#include <private/qtoolbarlayout_p.h>
-#include <private/qt_cocoa_helpers_mac_p.h>
-#include <private/qtoolbar_p.h>
-
-#include <private/qcocoatoolbardelegate_mac_p.h>
-#import <private/qcocoawindowdelegate_mac_p.h>
-
-QT_BEGIN_NAMESPACE
-#ifdef QT_NAMESPACE
-
-// namespace up the stuff
-#define SS(x) #x
-#define S0(x) SS(x)
-#define S "org.qt-project.qt-" S0(QT_NAMESPACE) ".qmainwindow.qtoolbarInHIToolbar"
-#define SToolbar "org.qt-project.qt-" S0(QT_NAMESPACE) ".hitoolbar-qtoolbar"
-#define SNSToolbar "org.qt-project.qt-" S0(QT_NAMESPACE) ".qtoolbarInNSToolbar"
-#define MacToolbar "org.qt-project.qt-" S0(QT_NAMESPACE) ".qmainwindow.mactoolbar"
-
-static NSString *kQToolBarNSToolbarIdentifier = @SNSToolbar;
-static CFStringRef kQMainWindowMacToolbarID = CFSTR(MacToolbar);
-#undef SS
-#undef S0
-#undef S
-#undef SToolbar
-#undef SNSToolbar
-#undef MacToolbar
-
-#else
-static NSString *kQToolBarNSToolbarIdentifier = @"org.qt-project.qt.qmainwindow.qtoolbarInNSToolbar";
-static CFStringRef kQMainWindowMacToolbarID = CFSTR("org.qt-project.qt.qmainwindow.mactoolbar");
-#endif // QT_NAMESPACE
-
-
-#ifndef kWindowUnifiedTitleAndToolbarAttribute
-#define kWindowUnifiedTitleAndToolbarAttribute (1 << 7)
-#endif
-
-void QMainWindowLayout::updateHIToolBarStatus()
-{
- bool useMacToolbar = layoutState.mainWindow->unifiedTitleAndToolBarOnMac();
-
- layoutState.mainWindow->setUpdatesEnabled(false); // reduces a little bit of flicker, not all though
- QMacCocoaAutoReleasePool pool;
- NSView *cView = [qt_mac_window_for(layoutState.mainWindow) contentView];
- if (useMacToolbar) {
- [cView setPostsFrameChangedNotifications:YES];
- [[NSNotificationCenter defaultCenter] addObserver: [QT_MANGLE_NAMESPACE(QCocoaWindowDelegate) sharedDelegate]
- selector: @selector(syncContentViewFrame:)
- name: NSViewFrameDidChangeNotification
- object: cView];
- }
- if (!useMacToolbar) {
- macWindowToolbarShow(layoutState.mainWindow, false);
- // Move everything out of the HIToolbar into the main toolbar.
- while (!qtoolbarsInUnifiedToolbarList.isEmpty()) {
- // Should shrink the list by one every time.
- QToolBar *toolbar = qtoolbarsInUnifiedToolbarList.first();
- unifiedSurface->removeToolbar(toolbar);
- layoutState.mainWindow->addToolBar(Qt::TopToolBarArea, toolbar);
- }
- macWindowToolbarSet(qt_mac_window_for(layoutState.mainWindow), 0);
- } else {
- QList<QToolBar *> toolbars = layoutState.mainWindow->findChildren<QToolBar *>();
- for (int i = 0; i < toolbars.size(); ++i) {
- QToolBar *toolbar = toolbars.at(i);
- if (toolBarArea(toolbar) == Qt::TopToolBarArea) {
- // Do this here, because we are in an in-between state.
- removeWidget(toolbar);
- layoutState.mainWindow->addToolBar(Qt::TopToolBarArea, toolbar);
- }
- }
- syncUnifiedToolbarVisibility();
- }
- if (!useMacToolbar) {
- [cView setPostsFrameChangedNotifications:NO];
- [[NSNotificationCenter defaultCenter] removeObserver: [QT_MANGLE_NAMESPACE(QCocoaWindowDelegate) sharedDelegate]
- name: NSViewFrameDidChangeNotification
- object: cView];
- }
- layoutState.mainWindow->setUpdatesEnabled(true);
-}
-
-void QMainWindowLayout::insertIntoMacToolbar(QToolBar *before, QToolBar *toolbar)
-{
- // This layering could go on to one more level, but I decided to stop here.
- // The HIToolbar and NSToolbar APIs are fairly similar as you will see.
- if (toolbar == 0)
- return;
-
- // toolbar will now become native (if not already) since we need
- // an nsview for it inside the corresponding NSToolbarItem.
- // Setting isInUnifiedToolbar will (among other things) stop alien
- // siblings from becoming native when this happends since the toolbar
- // will not overlap with other children of the QMainWindow. NB: Switching
- // unified toolbar off after this stage is not supported, as this means
- // that either the menubar must be alien again, or the sibling must
- // be backed by an nsview to protect from overlapping issues:
- toolbar->d_func()->isInUnifiedToolbar = true;
-
- QToolBarLayout *toolbarLayout = static_cast<QToolBarLayout *>(toolbar->layout());
- toolbarSaveState.insert(toolbar, ToolBarSaveState(toolbar->isMovable(), toolbar->maximumSize()));
-
- if (toolbarLayout->hasExpandFlag() == false)
- toolbar->setMaximumSize(toolbar->sizeHint());
-
- toolbar->setMovable(false);
- toolbarLayout->setUsePopupMenu(true);
- // Make the toolbar a child of the mainwindow to avoid creating a window.
- toolbar->setParent(layoutState.mainWindow);
-
- toolbar->winId(); // Now create the OSViewRef.
- layoutState.mainWindow->createWinId();
-
- OSWindowRef window = qt_mac_window_for(layoutState.mainWindow);
- int beforeIndex = qtoolbarsInUnifiedToolbarList.indexOf(before);
- if (beforeIndex == -1)
- beforeIndex = qtoolbarsInUnifiedToolbarList.size();
-
- int toolbarIndex = qtoolbarsInUnifiedToolbarList.indexOf(toolbar);
-
- QMacCocoaAutoReleasePool pool;
- NSToolbar *macToolbar = [window toolbar];
- if (macToolbar == nil) {
- macToolbar = [[NSToolbar alloc] initWithIdentifier:(NSString *)kQMainWindowMacToolbarID];
- [macToolbar setDisplayMode:NSToolbarDisplayModeIconOnly];
- [macToolbar setSizeMode:NSToolbarSizeModeRegular];
- [macToolbar setDelegate:[[QT_MANGLE_NAMESPACE(QCocoaToolBarDelegate) alloc] initWithMainWindowLayout:this]];
- [window setToolbar:macToolbar];
- [macToolbar release];
- }
- if (toolbarIndex != -1) {
- qtoolbarsInUnifiedToolbarList.removeAt(toolbarIndex);
- [macToolbar removeItemAtIndex:toolbarIndex];
- }
- qtoolbarsInUnifiedToolbarList.insert(beforeIndex, toolbar);
-
- // Adding to the unified toolbar surface for the raster engine.
- if (layoutState.mainWindow->windowSurface()) {
- QPoint offset(0, 0);
- for (int i = 0; i < beforeIndex; ++i) {
- offset.setX(offset.x() + qtoolbarsInUnifiedToolbarList.at(i)->size().width());
- }
- unifiedSurface->insertToolbar(toolbar, offset);
- }
-
- NSString *toolbarID = kQToolBarNSToolbarIdentifier;
- toolbarID = [toolbarID stringByAppendingFormat:@"%p", toolbar];
- cocoaItemIDToToolbarHash.insert(qt_mac_NSStringToQString(toolbarID), toolbar);
- [macToolbar insertItemWithItemIdentifier:toolbarID atIndex:beforeIndex];
-}
-
-void QMainWindowLayout::updateUnifiedToolbarOffset()
-{
- QPoint offset(0, 0);
-
- for (int i = 1; i < qtoolbarsInUnifiedToolbarList.length(); ++i) {
- offset.setX(offset.x() + qtoolbarsInUnifiedToolbarList.at(i - 1)->size().width());
- qtoolbarsInUnifiedToolbarList.at(i)->d_func()->toolbar_offset = offset;
- }
-}
-
-
-void QMainWindowLayout::removeFromMacToolbar(QToolBar *toolbar)
-{
- QHash<void *, QToolBar *>::iterator it = unifiedToolbarHash.begin();
- while (it != unifiedToolbarHash.end()) {
- if (it.value() == toolbar) {
- // Rescue our HIView and set it on the mainWindow again.
- bool saveVisible = !toolbar->isHidden();
- toolbar->setParent(0);
- toolbar->setParent(parentWidget());
- toolbar->setVisible(saveVisible);
- ToolBarSaveState saveState = toolbarSaveState.value(toolbar);
- static_cast<QToolBarLayout *>(toolbar->layout())->setUsePopupMenu(false);
- toolbar->setMovable(saveState.movable);
- toolbar->setMaximumSize(saveState.maximumSize);
- toolbarSaveState.remove(toolbar);
- NSToolbarItem *item = static_cast<NSToolbarItem *>(it.key());
- [[qt_mac_window_for(layoutState.mainWindow->window()) toolbar]
- removeItemAtIndex:toolbarItemsCopy.indexOf(item)];
- unifiedToolbarHash.remove(item);
- qtoolbarsInUnifiedToolbarList.removeAll(toolbar);
- break;
- }
- ++it;
- }
-}
-
-void QMainWindowLayout::cleanUpMacToolbarItems()
-{
- QMacCocoaAutoReleasePool pool;
- for (int i = 0; i < toolbarItemsCopy.size(); ++i) {
- NSToolbarItem *item = static_cast<NSToolbarItem *>(toolbarItemsCopy.at(i));
- [item setView:0];
- CFRelease(toolbarItemsCopy.at(i));
- }
- toolbarItemsCopy.clear();
- unifiedToolbarHash.clear();
-
- OSWindowRef window = qt_mac_window_for(layoutState.mainWindow);
- NSToolbar *macToolbar = [window toolbar];
- if (macToolbar) {
- [[macToolbar delegate] release];
- [macToolbar setDelegate:nil];
- }
-}
-
-void QMainWindowLayout::fixSizeInUnifiedToolbar(QToolBar *tb) const
-{
- QHash<void *, QToolBar *>::const_iterator it = unifiedToolbarHash.constBegin();
- NSToolbarItem *item = nil;
- while (it != unifiedToolbarHash.constEnd()) {
- if (tb == it.value()) {
- item = static_cast<NSToolbarItem *>(it.key());
- break;
- }
- ++it;
- }
- if (item) {
- QMacCocoaAutoReleasePool pool;
- QWidgetItem layoutItem(tb);
- QSize size = layoutItem.maximumSize();
- NSSize nssize = NSMakeSize(size.width(), size.height());
- [item setMaxSize:nssize];
- size = layoutItem.minimumSize();
- nssize.width = size.width();
- nssize.height = size.height();
- [item setMinSize:nssize];
- }
-}
-
-void QMainWindowLayout::syncUnifiedToolbarVisibility()
-{
- if (blockVisiblityCheck)
- return;
-
- Q_ASSERT(layoutState.mainWindow->unifiedTitleAndToolBarOnMac());
- bool show = false;
- const int ToolBarCount = qtoolbarsInUnifiedToolbarList.count();
- for (int i = 0; i < ToolBarCount; ++i) {
- if (qtoolbarsInUnifiedToolbarList.at(i)->isVisible()) {
- show = true;
- break;
- }
- }
- macWindowToolbarShow(layoutState.mainWindow, show);
-}
-
-QT_END_NAMESPACE
diff --git a/src/widgets/widgets/qtoolbar.cpp b/src/widgets/widgets/qtoolbar.cpp
index 5f80bbb1ca..5e7eb943ab 100644
--- a/src/widgets/widgets/qtoolbar.cpp
+++ b/src/widgets/widgets/qtoolbar.cpp
@@ -57,11 +57,6 @@
#include <qwidgetaction.h>
#include <qtimer.h>
#include <private/qwidgetaction_p.h>
-#ifdef Q_WS_MAC
-#include <private/qt_mac_p.h>
-#include <private/qt_cocoa_helpers_mac_p.h>
-#endif
-
#include <private/qmainwindowlayout_p.h>
#include "qtoolbar_p.h"
@@ -74,14 +69,6 @@
QT_BEGIN_NAMESPACE
-#ifdef Q_WS_MAC
-static void qt_mac_updateToolBarButtonHint(QWidget *parentWidget)
-{
- if (!(parentWidget->windowFlags() & Qt::CustomizeWindowHint))
- parentWidget->setWindowFlags(parentWidget->windowFlags() | Qt::MacWindowToolBarButtonHint);
-}
-#endif
-
// qmainwindow.cpp
extern QMainWindowLayout *qt_mainwindow_layout(const QMainWindow *window);
@@ -104,17 +91,6 @@ void QToolBarPrivate::init()
layout = new QToolBarLayout(q);
layout->updateMarginAndSpacing();
-#ifdef Q_WS_MAC
- if (q->parentWidget() && q->parentWidget()->isWindow()) {
- // Make sure that the window has the "toolbar" button.
- QWidget *parentWidget = q->parentWidget();
- qt_mac_updateToolBarButtonHint(parentWidget);
- reinterpret_cast<QToolBar *>(parentWidget)->d_func()->createWinId(); // Please let me create your winId...
- extern OSWindowRef qt_mac_window_for(const QWidget *); // qwidget_mac.cpp
- macWindowToolbarShow(q->parentWidget(), true);
- }
-#endif
-
toggleViewAction = new QAction(q);
toggleViewAction->setCheckable(true);
q->setMovable(q->style()->styleHint(QStyle::SH_ToolBar_Movable, 0, q ));
@@ -158,12 +134,8 @@ void QToolBarPrivate::updateWindowFlags(bool floating, bool unplug)
flags |= Qt::FramelessWindowHint;
- if (unplug) {
+ if (unplug)
flags |= Qt::X11BypassWindowManagerHint;
-#ifdef Q_WS_MAC
- flags |= Qt::WindowStaysOnTopHint;
-#endif
- }
q->setWindowFlags(flags);
}
@@ -272,7 +244,7 @@ bool QToolBarPrivate::mousePressEvent(QMouseEvent *event)
QStyleOptionToolBar opt;
q->initStyleOption(&opt);
if (q->style()->subElementRect(QStyle::SE_ToolBarHandle, &opt, q).contains(event->pos()) == false) {
-#ifdef Q_WS_MAC
+#ifdef Q_OS_OSX
// When using the unified toolbar on Mac OS X, the user can click and
// drag between toolbar contents to move the window. Make this work by
// implementing the standard mouse-dragging code and then call
@@ -306,7 +278,7 @@ bool QToolBarPrivate::mouseReleaseEvent(QMouseEvent*)
endDrag();
return true;
} else {
-#ifdef Q_WS_MAC
+#ifdef Q_OS_OSX
if (!macWindowDragging)
return false;
macWindowDragging = false;
@@ -322,7 +294,7 @@ bool QToolBarPrivate::mouseMoveEvent(QMouseEvent *event)
Q_Q(QToolBar);
if (!state) {
-#ifdef Q_WS_MAC
+#ifdef Q_OS_OSX
if (!macWindowDragging)
return false;
QWidget *w = q->window();
@@ -569,16 +541,6 @@ QToolBar::QToolBar(const QString &title, QWidget *parent)
*/
QToolBar::~QToolBar()
{
- // Remove the toolbar button if there is nothing left.
- QMainWindow *mainwindow = qobject_cast<QMainWindow *>(parentWidget());
- if (mainwindow) {
-#ifdef Q_WS_MAC
- QMainWindowLayout *mainwin_layout = qt_mainwindow_layout(mainwindow);
- if (mainwin_layout && mainwin_layout->layoutState.toolBarAreaLayout.isEmpty()
- && mainwindow->testAttribute(Qt::WA_WState_Created))
- macWindowToolbarShow(mainwindow, false);
-#endif
- }
}
/*! \property QToolBar::movable
@@ -665,12 +627,6 @@ void QToolBar::setAllowedAreas(Qt::ToolBarAreas areas)
Qt::ToolBarAreas QToolBar::allowedAreas() const
{
Q_D(const QToolBar);
-#ifdef Q_WS_MAC
- if (QMainWindow *window = qobject_cast<QMainWindow *>(parentWidget())) {
- if (window->unifiedTitleAndToolBarOnMac()) // Don't allow drags to the top (for now).
- return (d->allowedAreas & ~Qt::TopToolBarArea);
- }
-#endif
return d->allowedAreas;
}
@@ -1083,15 +1039,6 @@ static bool waitForPopup(QToolBar *tb, QWidget *popup)
return false;
}
-#if defined(Q_WS_MAC)
-static bool toolbarInUnifiedToolBar(QToolBar *toolbar)
-{
- const QMainWindow *mainWindow = qobject_cast<const QMainWindow *>(toolbar->parentWidget());
- return mainWindow && mainWindow->unifiedTitleAndToolBarOnMac()
- && mainWindow->toolBarArea(toolbar) == Qt::TopToolBarArea;
-}
-#endif
-
/*! \reimp */
bool QToolBar::event(QEvent *event)
{
@@ -1115,22 +1062,9 @@ bool QToolBar::event(QEvent *event)
case QEvent::Show:
d->toggleViewAction->setChecked(event->type() == QEvent::Show);
emit visibilityChanged(event->type() == QEvent::Show);
-#if defined(Q_WS_MAC)
- if (toolbarInUnifiedToolBar(this)) {
- // I can static_cast because I did the qobject_cast in the if above, therefore
- // we must have a QMainWindowLayout here.
- QMainWindowLayout *mwLayout = qt_mainwindow_layout(qobject_cast<QMainWindow *>(parentWidget()));
- mwLayout->fixSizeInUnifiedToolbar(this);
- mwLayout->syncUnifiedToolbarVisibility();
- }
-#endif // Q_WS_MAC
break;
case QEvent::ParentChange:
d->layout->checkUsePopupMenu();
-#if defined(Q_WS_MAC)
- if (parentWidget() && parentWidget()->isWindow())
- qt_mac_updateToolBarButtonHint(parentWidget());
-#endif
break;
case QEvent::MouseButtonPress: {
diff --git a/src/widgets/widgets/qtoolbar_p.h b/src/widgets/widgets/qtoolbar_p.h
index 9ff0b9d61c..c9dd0490cd 100644
--- a/src/widgets/widgets/qtoolbar_p.h
+++ b/src/widgets/widgets/qtoolbar_p.h
@@ -75,7 +75,7 @@ public:
allowedAreas(Qt::AllToolBarAreas), orientation(Qt::Horizontal),
toolButtonStyle(Qt::ToolButtonIconOnly),
layout(0), state(0)
-#ifdef Q_WS_MAC
+#ifdef Q_OS_OSX
, macWindowDragging(false)
#endif
{ }
@@ -107,7 +107,7 @@ public:
};
DragState *state;
-#ifdef Q_WS_MAC
+#ifdef Q_OS_OSX
bool macWindowDragging;
QPoint macWindowDragPressPosition;
#endif
diff --git a/src/widgets/widgets/qtoolbarlayout.cpp b/src/widgets/widgets/qtoolbarlayout.cpp
index 3c0c84ee2f..fe919feba9 100644
--- a/src/widgets/widgets/qtoolbarlayout.cpp
+++ b/src/widgets/widgets/qtoolbarlayout.cpp
@@ -333,20 +333,6 @@ void QToolBarLayout::updateGeomArray() const
rpick(o, that->hint) += handleExtent;
that->hint += QSize(2*margin, 2*margin);
that->dirty = false;
-#ifdef Q_WS_MAC
- if (QMainWindow *mw = qobject_cast<QMainWindow *>(parentWidget()->parentWidget())) {
- if (mw->unifiedTitleAndToolBarOnMac()
- && mw->toolBarArea(static_cast<QToolBar *>(parentWidget())) == Qt::TopToolBarArea) {
- if (expandFlag) {
- tb->setMaximumSize(0xFFFFFF, 0xFFFFFF);
- } else {
- tb->setMaximumSize(hint);
- }
- }
- }
-#endif
-
- that->dirty = false;
}
static bool defaultWidgetAction(QToolBarItem *item)
@@ -401,15 +387,6 @@ void QToolBarLayout::setGeometry(const QRect &rect)
if (!extension->isHidden())
extension->hide();
}
-#ifdef Q_WS_MAC
- if (QMainWindow *win = qobject_cast<QMainWindow*>(tb->parentWidget())) {
- Qt::ToolBarArea area = win->toolBarArea(tb);
- if (win->unifiedTitleAndToolBarOnMac() && area == Qt::TopToolBarArea) {
- qt_mainwindow_layout(win)->fixSizeInUnifiedToolbar(tb);
- }
- }
-#endif
-
}
bool QToolBarLayout::layoutActions(const QSize &size)
diff --git a/src/widgets/widgets/widgets.pri b/src/widgets/widgets/widgets.pri
index efe1dd3616..1bae87ebcc 100644
--- a/src/widgets/widgets/widgets.pri
+++ b/src/widgets/widgets/widgets.pri
@@ -155,15 +155,6 @@ macx {
widgets/qmaccocoaviewcontainer_mac.mm
}
-# TODO
-false:mac {
- OBJECTIVE_HEADERS += widgets/qcocoatoolbardelegate_mac_p.h \
- widgets/qcocoamenu_mac_p.h
- OBJECTIVE_SOURCES += widgets/qcocoatoolbardelegate_mac.mm \
- widgets/qmainwindowlayout_mac.mm
-
-}
-
wince*: {
SOURCES += widgets/qmenu_wince.cpp
HEADERS += widgets/qmenu_wince_resource_p.h
diff --git a/src/xml/sax/qxml.cpp b/src/xml/sax/qxml.cpp
index f3a1e479f2..1b05e049f1 100644
--- a/src/xml/sax/qxml.cpp
+++ b/src/xml/sax/qxml.cpp
@@ -44,6 +44,7 @@
#include "qbuffer.h"
#include "qregexp.h"
#include "qmap.h"
+#include "qhash.h"
#include "qstack.h"
#include <qdebug.h>
@@ -424,6 +425,10 @@ private:
int stringValueLen;
QString emptyStr;
+ QHash<QString, int> literalEntitySizes;
+ // The entity at (QMap<QString,) referenced the entities at (QMap<QString,) (int>) times.
+ QHash<QString, QHash<QString, int> > referencesToOtherEntities;
+ QHash<QString, int> expandedSizes;
// The limit to the amount of times the DTD parsing functions can be called
// for the DTD currently being parsed.
static const int dtdRecursionLimit = 2;
@@ -3444,6 +3449,10 @@ bool QXmlSimpleReader::parse(const QXmlInputSource *input, bool incremental)
{
Q_D(QXmlSimpleReader);
+ d->literalEntitySizes.clear();
+ d->referencesToOtherEntities.clear();
+ d->expandedSizes.clear();
+
if (incremental) {
d->initIncrementalParsing();
} else {
@@ -6659,43 +6668,63 @@ bool QXmlSimpleReaderPrivate::parseChoiceSeq()
bool QXmlSimpleReaderPrivate::isExpandedEntityValueTooLarge(QString *errorMessage)
{
- QMap<QString, int> literalEntitySizes;
- // The entity at (QMap<QString,) referenced the entities at (QMap<QString,) (int>) times.
- QMap<QString, QMap<QString, int> > referencesToOtherEntities;
- QMap<QString, int> expandedSizes;
+ QString entityNameBuffer;
// For every entity, check how many times all entity names were referenced in its value.
- foreach (QString toSearch, entities.keys()) {
- // The amount of characters that weren't entity names, but literals, like 'X'.
- QString leftOvers = entities.value(toSearch);
- // How many times was entityName referenced by toSearch?
- foreach (QString entityName, entities.keys()) {
- for (int i = 0; i < leftOvers.size() && i != -1; ) {
- i = leftOvers.indexOf(QString::fromLatin1("&%1;").arg(entityName), i);
- if (i != -1) {
- leftOvers.remove(i, entityName.size() + 2);
- // The entityName we're currently trying to find was matched in this string; increase our count.
- ++referencesToOtherEntities[toSearch][entityName];
+ for (QMap<QString,QString>::const_iterator toSearchIt = entities.constBegin();
+ toSearchIt != entities.constEnd();
+ ++toSearchIt) {
+ const QString &toSearch = toSearchIt.key();
+
+ // Don't check the same entities twice.
+ if (!literalEntitySizes.contains(toSearch)) {
+ // The amount of characters that weren't entity names, but literals, like 'X'.
+ QString leftOvers = entities.value(toSearch);
+ // How many times was entityName referenced by toSearch?
+ for (QMap<QString,QString>::const_iterator referencedIt = entities.constBegin();
+ referencedIt != entities.constEnd();
+ ++referencedIt) {
+ const QString &entityName = referencedIt.key();
+
+ for (int i = 0; i < leftOvers.size() && i != -1; ) {
+ entityNameBuffer = QLatin1Char('&') + entityName + QLatin1Char(';');
+
+ i = leftOvers.indexOf(entityNameBuffer, i);
+ if (i != -1) {
+ leftOvers.remove(i, entityName.size() + 2);
+ // The entityName we're currently trying to find was matched in this string; increase our count.
+ ++referencesToOtherEntities[toSearch][entityName];
+ }
}
}
+ literalEntitySizes[toSearch] = leftOvers.size();
}
- literalEntitySizes[toSearch] = leftOvers.size();
}
- foreach (QString entity, referencesToOtherEntities.keys()) {
- expandedSizes[entity] = literalEntitySizes[entity];
- foreach (QString referenceTo, referencesToOtherEntities.value(entity).keys()) {
- const int references = referencesToOtherEntities.value(entity).value(referenceTo);
- // The total size of an entity's value is the expanded size of all of its referenced entities, plus its literal size.
- expandedSizes[entity] += expandedSizes[referenceTo] * references + literalEntitySizes[referenceTo] * references;
- }
+ for (QHash<QString, QHash<QString, int> >::const_iterator entityIt = referencesToOtherEntities.constBegin();
+ entityIt != referencesToOtherEntities.constEnd();
+ ++entityIt) {
+ const QString &entity = entityIt.key();
+
+ QHash<QString, int>::iterator expandedIt = expandedSizes.find(entity);
+ if (expandedIt == expandedSizes.end()) {
+ expandedIt = expandedSizes.insert(entity, literalEntitySizes.value(entity));
+ for (QHash<QString, int>::const_iterator referenceIt = entityIt->constBegin();
+ referenceIt != entityIt->constEnd();
+ ++referenceIt) {
+ const QString &referenceTo = referenceIt.key();
+ const int references = referencesToOtherEntities.value(entity).value(referenceTo);
+ // The total size of an entity's value is the expanded size of all of its referenced entities, plus its literal size.
+ *expandedIt += expandedSizes.value(referenceTo) * references + literalEntitySizes.value(referenceTo) * references;
+ }
- if (expandedSizes[entity] > entityCharacterLimit) {
- if (errorMessage) {
- *errorMessage = QString::fromLatin1("The XML entity \"%1\" expands too a string that is too large to process (%2 characters > %3).");
- *errorMessage = (*errorMessage).arg(entity).arg(expandedSizes[entity]).arg(entityCharacterLimit);
+ if (*expandedIt > entityCharacterLimit) {
+ if (errorMessage) {
+ *errorMessage = QString::fromLatin1("The XML entity \"%1\" expands to a string that is too large to process (%2 characters > %3).")
+ .arg(entity, *expandedIt, entityCharacterLimit);
+ }
+ return true;
}
- return true;
}
}
return false;
diff --git a/tests/auto/corelib/io/largefile/tst_largefile.cpp b/tests/auto/corelib/io/largefile/tst_largefile.cpp
index 88b4abe2e3..7564e3fc1f 100644
--- a/tests/auto/corelib/io/largefile/tst_largefile.cpp
+++ b/tests/auto/corelib/io/largefile/tst_largefile.cpp
@@ -121,9 +121,7 @@ private slots:
// Map/unmap large file
void mapFile();
-#ifndef Q_OS_MAC
void mapOffsetOverflow();
-#endif
void closeFile() { largeFile.close(); }
@@ -513,9 +511,9 @@ void tst_LargeFile::mapFile()
}
//Mac: memory-mapping beyond EOF may succeed but it could generate bus error on access
-#ifndef Q_OS_MAC
void tst_LargeFile::mapOffsetOverflow()
{
+#ifndef Q_OS_MAC
// Out-of-range mappings should fail, and not silently clip the offset
for (int i = 50; i < 63; ++i) {
uchar *address = 0;
@@ -529,8 +527,8 @@ void tst_LargeFile::mapOffsetOverflow()
address = largeFile.map(((qint64)1 << i) + blockSize, blockSize);
QVERIFY( !address );
}
-}
#endif
+}
QTEST_APPLESS_MAIN(tst_LargeFile)
#include "tst_largefile.moc"
diff --git a/tests/auto/corelib/tools/qdate/tst_qdate.cpp b/tests/auto/corelib/tools/qdate/tst_qdate.cpp
index b91de092e8..807dcf5cbe 100644
--- a/tests/auto/corelib/tools/qdate/tst_qdate.cpp
+++ b/tests/auto/corelib/tools/qdate/tst_qdate.cpp
@@ -944,6 +944,13 @@ void tst_QDate::fromStringDateFormat_data()
QTest::newRow("iso2") << QDate(1999, 11, 14).toString(Qt::ISODate) << Qt::ISODate << QDate(1999, 11, 14);
QTest::newRow("iso3") << QString("0999-01-01") << Qt::ISODate << QDate(999, 1, 1);
QTest::newRow("iso3b") << QString("0999-01-01") << Qt::ISODate << QDate(999, 1, 1);
+ QTest::newRow("iso4") << QString("2000101101") << Qt::ISODate << QDate();
+ QTest::newRow("iso5") << QString("2000/01/01") << Qt::ISODate << QDate(2000, 1, 1);
+ QTest::newRow("iso6") << QString("2000-01-01 blah") << Qt::ISODate << QDate(2000, 1, 1);
+ QTest::newRow("iso7") << QString("2000-01-011blah") << Qt::ISODate << QDate();
+ QTest::newRow("iso8") << QString("2000-01-01blah") << Qt::ISODate << QDate(2000, 1, 1);
+ QTest::newRow("iso9") << QString("-001-01-01") << Qt::ISODate << QDate();
+ QTest::newRow("iso10") << QString("99999-01-01") << Qt::ISODate << QDate();
// Test Qt::RFC2822Date format (RFC 2822).
QTest::newRow("RFC 2822") << QString::fromLatin1("13 Feb 1987 13:24:51 +0100")
diff --git a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp
index 6c80c5ff47..866f68c99c 100644
--- a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp
+++ b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp
@@ -61,6 +61,7 @@ public:
static QString str( int y, int month, int d, int h, int min, int s );
static QDateTime dt( const QString& str );
public slots:
+ void initTestCase();
void init();
private slots:
void ctor();
@@ -150,6 +151,7 @@ private slots:
void invalid() const;
private:
+ enum { LocalTimeIsUtc = 0, LocalTimeAheadOfUtc = 1, LocalTimeBehindUtc = -1} localTimeType;
bool europeanTimeZone;
QDate defDate() const { return QDate(1900, 1, 1); }
QTime defTime() const { return QTime(0, 0, 0); }
@@ -169,6 +171,42 @@ tst_QDateTime::tst_QDateTime()
uint x1 = QDateTime(QDate(1990, 1, 1), QTime()).toTime_t();
uint x2 = QDateTime(QDate(1990, 6, 1), QTime()).toTime_t();
europeanTimeZone = (x1 == 631148400 && x2 == 644191200);
+
+ QDateTime dt1 = QDateTime::fromTime_t(0);
+ QDateTime dt2 = QDateTime::fromTime_t(181 * 86400); // six months later, Jul 1
+ if (dt1.date().year() < 1970 || dt2.date().month() < 7) {
+ localTimeType = LocalTimeBehindUtc;
+ } else if (dt1.time().hour() > 0 || dt1.date().day() > 1) {
+ localTimeType = LocalTimeAheadOfUtc;
+ } else if (dt2.time().hour() > 0 || dt2.date().day() > 1) {
+ localTimeType = LocalTimeAheadOfUtc;
+ } else {
+ localTimeType = LocalTimeIsUtc;
+ }
+}
+
+void tst_QDateTime::initTestCase()
+{
+ // Never construct a message like this in an i18n context...
+ const char *typemsg1, *typemsg2 = "and therefore not";
+ switch (localTimeType) {
+ case LocalTimeIsUtc:
+ typemsg1 = "exactly";
+ break;
+ case LocalTimeBehindUtc:
+ typemsg1 = "behind";
+ break;
+ case LocalTimeAheadOfUtc:
+ typemsg1 = "ahead of";
+ typemsg2 = europeanTimeZone ? "and is" : "but isn't";
+ break;
+ }
+
+ qDebug() << "Current local time detected to be"
+ << typemsg1
+ << "UTC"
+ << typemsg2
+ << "the Central European timezone";
}
void tst_QDateTime::init()
@@ -610,8 +648,10 @@ void tst_QDateTime::fromMSecsSinceEpoch()
QDateTime dtUtc = QDateTime::fromMSecsSinceEpoch(msecs, Qt::UTC);
QDateTime dtOffset = QDateTime::fromMSecsSinceEpoch(msecs, Qt::OffsetFromUTC, 60*60);
- // LocalTime will overflow for max
- if (msecs != std::numeric_limits<qint64>::max())
+ // LocalTime will overflow for min or max, depending on whether you're
+ // East or West of Greenwich. The test passes at GMT.
+ if (localTimeType == LocalTimeIsUtc
+ || msecs != std::numeric_limits<qint64>::max() * localTimeType)
QCOMPARE(dtLocal, utc);
QCOMPARE(dtUtc, utc);
@@ -2744,6 +2784,13 @@ void tst_QDateTime::daylightTransitions() const
void tst_QDateTime::timeZones() const
{
+ QTimeZone invalidTz = QTimeZone("Vulcan/ShiKahr");
+ QCOMPARE(invalidTz.isValid(), false);
+ QDateTime invalidDateTime = QDateTime(QDate(2000, 1, 1), QTime(0, 0, 0), invalidTz);
+ QCOMPARE(invalidDateTime.isValid(), false);
+ QCOMPARE(invalidDateTime.date(), QDate(2000, 1, 1));
+ QCOMPARE(invalidDateTime.time(), QTime(0, 0, 0));
+
QTimeZone nzTz = QTimeZone("Pacific/Auckland");
// During Standard Time NZ is +12:00
diff --git a/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp b/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp
index bd7bd3a464..493d7e20c5 100644
--- a/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp
+++ b/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp
@@ -120,10 +120,8 @@ private slots:
void symetricConstructors();
void checkMultipleNames();
void checkMultipleCodes();
-#ifndef Q_OS_MAC
void mnemonic_data();
void mnemonic();
-#endif
void toString_data();
void toString();
void toStringFromKeycode_data();
@@ -144,10 +142,8 @@ private slots:
void standardKeys_data();
void standardKeys();
void keyBindings();
-#if !defined (Q_OS_MAC) && !defined (Q_OS_WINCE)
void translated_data();
void translated();
-#endif
void i18nKeys_data();
void i18nKeys();
@@ -405,9 +401,11 @@ void tst_QKeySequence::keyBindings()
QCOMPARE(bindings, expected);
}
-#ifndef Q_OS_MAC
void tst_QKeySequence::mnemonic_data()
{
+#ifdef Q_OS_MAC
+ QSKIP("Test not applicable to Mac OS X");
+#endif
QTest::addColumn<QString>("string");
QTest::addColumn<QString>("key");
QTest::addColumn<bool>("warning");
@@ -427,6 +425,7 @@ void tst_QKeySequence::mnemonic_data()
void tst_QKeySequence::mnemonic()
{
+#ifndef Q_OS_MAC
QFETCH(QString, string);
QFETCH(QString, key);
QFETCH(bool, warning);
@@ -444,8 +443,8 @@ void tst_QKeySequence::mnemonic()
QKeySequence res = QKeySequence(key);
QCOMPARE(seq, res);
-}
#endif
+}
void tst_QKeySequence::toString_data()
{
@@ -734,9 +733,12 @@ void tst_QKeySequence::listFromString()
QCOMPARE(QKeySequence::listFromString(strSequences), sequences);
}
-#if !defined (Q_OS_MAC) && !defined (Q_OS_WINCE)
void tst_QKeySequence::translated_data()
{
+#if defined (Q_OS_MAC) || defined (Q_OS_WINCE)
+ QSKIP("Test not applicable");
+#endif
+
qApp->installTranslator(ourTranslator);
qApp->installTranslator(qtTranslator);
@@ -764,6 +766,7 @@ void tst_QKeySequence::translated_data()
void tst_QKeySequence::translated()
{
+#if !defined (Q_OS_MAC) && !defined (Q_OS_WINCE)
QFETCH(QString, transKey);
QFETCH(QString, compKey);
@@ -775,8 +778,8 @@ void tst_QKeySequence::translated()
qApp->removeTranslator(ourTranslator);
qApp->removeTranslator(qtTranslator);
-}
#endif
+}
void tst_QKeySequence::i18nKeys_data()
{
diff --git a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
index 1837e8d665..291b368e47 100644
--- a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
@@ -6596,9 +6596,8 @@ void tst_QNetworkReply::authenticationCacheAfterCancel()
QTestEventLoop::instance().enterLoop(10);
QVERIFY(!QTestEventLoop::instance().timeout());
- QEXPECT_FAIL("http+socksauth", "QTBUG-23136 - danted accepts bad authentication but blocks the connection", Continue);
- QEXPECT_FAIL("https+socksauth", "QTBUG-23136 - danted accepts bad authentication but blocks the connection", Continue);
-
+ if (reply->error() == QNetworkReply::HostNotFoundError)
+ QSKIP("skip because of quirk in the old test server");
QCOMPARE(reply->error(), QNetworkReply::ProxyAuthenticationRequiredError);
QCOMPARE(authSpy.count(), 0);
QVERIFY(proxyAuthSpy.count() > 0);
diff --git a/tests/auto/widgets/widgets/qscrollbar/tst_qscrollbar.cpp b/tests/auto/widgets/widgets/qscrollbar/tst_qscrollbar.cpp
index baa3022919..51dd0852ee 100644
--- a/tests/auto/widgets/widgets/qscrollbar/tst_qscrollbar.cpp
+++ b/tests/auto/widgets/widgets/qscrollbar/tst_qscrollbar.cpp
@@ -44,68 +44,72 @@
#include <QScrollBar>
#include <QStyleOptionSlider>
#include <QScrollArea>
+#include <QScreen>
+
+static inline void centerOnScreen(QWidget *w, const QSize &size)
+{
+ const QPoint offset = QPoint(size.width() / 2, size.height() / 2);
+ w->move(QGuiApplication::primaryScreen()->availableGeometry().center() - offset);
+}
+
+static inline void centerOnScreen(QWidget *w)
+{
+ centerOnScreen(w, w->geometry().size());
+}
class tst_QScrollBar : public QObject
{
Q_OBJECT
-public slots:
- void initTestCase();
- void cleanupTestCase();
- void hideAndShow(int action);
-
private slots:
void scrollSingleStep();
void task_209492();
#ifndef QT_NO_WHEELEVENT
void QTBUG_27308();
#endif
-
-private:
- QScrollBar *testWidget;
};
-void tst_QScrollBar::initTestCase()
-{
- testWidget = new QScrollBar(Qt::Horizontal);
- testWidget->resize(100, testWidget->height());
- testWidget->show();
-}
-
-void tst_QScrollBar::cleanupTestCase()
-{
- delete testWidget;
- testWidget = 0;
-}
+class SingleStepTestScrollBar : public QScrollBar {
+ Q_OBJECT
+public:
+ explicit SingleStepTestScrollBar(Qt::Orientation o, QWidget *parent = 0) : QScrollBar(o, parent) {}
-void tst_QScrollBar::hideAndShow(int)
-{
- testWidget->hide();
- testWidget->show();
-}
+public slots:
+ void hideAndShow()
+ {
+ hide();
+ show();
+ }
+};
// Check that the scrollbar doesn't scroll after calling hide and show
// from a slot connected to the scrollbar's actionTriggered signal.
void tst_QScrollBar::scrollSingleStep()
{
- testWidget->setValue(testWidget->minimum());
- QCOMPARE(testWidget->value(), testWidget->minimum());
- connect(testWidget, SIGNAL(actionTriggered(int)), this, SLOT(hideAndShow(int)));
+ SingleStepTestScrollBar testWidget(Qt::Horizontal);
+ connect(&testWidget, &QAbstractSlider::actionTriggered, &testWidget, &SingleStepTestScrollBar::hideAndShow);
+ testWidget.resize(100, testWidget.height());
+ centerOnScreen(&testWidget);
+ testWidget.show();
+ QTest::qWaitForWindowExposed(&testWidget);
+
+ testWidget.setValue(testWidget.minimum());
+ QCOMPARE(testWidget.value(), testWidget.minimum());
// Get rect for the area to click on
- const QStyleOptionSlider opt = qt_qscrollbarStyleOption(testWidget);
- QRect sr = testWidget->style()->subControlRect(QStyle::CC_ScrollBar, &opt,
- QStyle::SC_ScrollBarAddLine, testWidget);
+ const QStyleOptionSlider opt = qt_qscrollbarStyleOption(&testWidget);
+ QRect sr = testWidget.style()->subControlRect(QStyle::CC_ScrollBar, &opt,
+ QStyle::SC_ScrollBarAddLine, &testWidget);
if (!sr.isValid())
QSKIP("SC_ScrollBarAddLine not valid");
- QTest::mouseClick(testWidget, Qt::LeftButton, Qt::NoModifier, QPoint(sr.x(), sr.y()));
+ QTest::mouseClick(&testWidget, Qt::LeftButton, Qt::NoModifier, QPoint(sr.x(), sr.y()));
QTest::qWait(510); // initial delay is 500 for setRepeatAction
- disconnect(testWidget, SIGNAL(actionTriggered(int)), 0, 0);
+ disconnect(&testWidget, &QAbstractSlider::actionTriggered, &testWidget, &SingleStepTestScrollBar::hideAndShow);
#ifdef Q_OS_MAC
QEXPECT_FAIL("", "This test fails on Mac OS X, see QTBUG-25272", Abort);
#endif
- QCOMPARE(testWidget->value(), testWidget->singleStep());
+ QCOMPARE(testWidget.value(), testWidget.singleStep());
}
void tst_QScrollBar::task_209492()
@@ -123,8 +127,9 @@ void tst_QScrollBar::task_209492()
MyScrollArea scrollArea;
QScrollBar *verticalScrollBar = scrollArea.verticalScrollBar();
verticalScrollBar->setRange(0, 1000);
+ centerOnScreen(&scrollArea);
scrollArea.show();
- QTest::qWait(300);
+ QTest::qWaitForWindowExposed(&scrollArea);
QSignalSpy spy(verticalScrollBar, SIGNAL(actionTriggered(int)));
QCOMPARE(scrollArea.scrollCount, 0);
@@ -153,12 +158,18 @@ void tst_QScrollBar::QTBUG_27308()
// https://bugreports.qt-project.org/browse/QTBUG-27308
// Check that a disabled scrollbar doesn't react on wheel events anymore
- testWidget->setValue(testWidget->minimum());
- testWidget->setEnabled(false);
- QWheelEvent event(testWidget->rect().center(),
- -WHEEL_DELTA, Qt::NoButton, Qt::NoModifier, testWidget->orientation());
- qApp->sendEvent(testWidget, &event);
- QCOMPARE(testWidget->value(), testWidget->minimum());
+ QScrollBar testWidget(Qt::Horizontal);
+ testWidget.resize(100, testWidget.height());
+ centerOnScreen(&testWidget);
+ testWidget.show();
+ QTest::qWaitForWindowExposed(&testWidget);
+
+ testWidget.setValue(testWidget.minimum());
+ testWidget.setEnabled(false);
+ QWheelEvent event(testWidget.rect().center(),
+ -WHEEL_DELTA, Qt::NoButton, Qt::NoModifier, testWidget.orientation());
+ qApp->sendEvent(&testWidget, &event);
+ QCOMPARE(testWidget.value(), testWidget.minimum());
}
#endif