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

Conflicts:
	src/corelib/global/qglobal.h
	src/corelib/tools/qstring.cpp
	src/gui/image/image.pri
	src/gui/image/qimage.cpp
	src/plugins/platforms/cocoa/qcocoawindow.h
	src/plugins/platforms/cocoa/qcocoawindow.mm
	src/plugins/platforms/eglfs/qeglfshooks_stub.cpp
	tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp

Change-Id: I3b9ba029c8f2263b011f204fdf68c3231c6d4ce5
This commit is contained in:
Frederik Gladhorn 2014-01-20 18:16:08 +01:00
commit 9033977d39
112 changed files with 3223 additions and 1020 deletions

View File

@ -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=""

View File

@ -40,6 +40,7 @@
****************************************************************************/
#include <linux/input.h>
#include <linux/kd.h>
enum {
e1 = ABS_PRESSURE,

134
configure vendored
View File

@ -95,7 +95,7 @@ if [ x"$1" = x"-top-level" ]; then
fi
# later cache the command line in config.status
OPT_CMDLINE=`echo $@ | sed "s,-v ,,g; s,-v$,,g"`
OPT_CMDLINE=`echo $@ | sed 's,-v ,,g; s,-v$,,g'`
# initialize global variables
QMAKE_SWITCHES=
@ -170,7 +170,7 @@ expandQMakeConf()
{
while read line; do case "$line" in
include*)
inc_file=`echo "$line" | sed -n -e "/^include.*(.*)/s/include.*(\(.*\)).*$/\1/p"`
inc_file=`echo "$line" | sed -n -e '/^include.*(.*)/s/include.*(\(.*\)).*$/\1/p'`
current_dir=`dirname "$1"`
conf_file="$current_dir/$inc_file"
if [ ! -f "$conf_file" ]; then
@ -450,7 +450,7 @@ resolveDeviceMkspec()
match_count=$(echo "$result" | wc -w)
if [ "$match_count" -gt 1 ]; then
echo >&2 "Error: Multiple matches for device '$1'. Candidates are:"
tabbed_result=$(echo "$result" | sed "s,^, ,")
tabbed_result=$(echo "$result" | sed 's,^, ,')
echo >&2 "$tabbed_result"
echo "undefined"
elif [ "$match_count" -eq 0 ]; then
@ -829,33 +829,33 @@ while [ "$#" -gt 0 ]; do
case "$1" in
#Autoconf style options
--enable-*)
VAR=`echo $1 | sed "s,^--enable-\(.*\),\1,"`
VAR=`echo $1 | sed 's,^--enable-\(.*\),\1,'`
VAL=yes
;;
--disable-*)
VAR=`echo $1 | sed "s,^--disable-\(.*\),\1,"`
VAR=`echo $1 | sed 's,^--disable-\(.*\),\1,'`
VAL=no
;;
--*=*)
VAR=`echo $1 | sed "s,^--\(.*\)=.*,\1,"`
VAL=`echo $1 | sed "s,^--.*=\(.*\),\1,"`
VAR=`echo $1 | sed 's,^--\(.*\)=.*,\1,'`
VAL=`echo $1 | sed 's,^--.*=\(.*\),\1,'`
;;
--no-*)
VAR=`echo $1 | sed "s,^--no-\(.*\),\1,"`
VAR=`echo $1 | sed 's,^--no-\(.*\),\1,'`
VAL=no
;;
--*)
VAR=`echo $1 | sed "s,^--\(.*\),\1,"`
VAR=`echo $1 | sed 's,^--\(.*\),\1,'`
VAL=yes
;;
#Qt plugin options
-no-*-*|-plugin-*-*|-qt-*-*)
VAR=`echo $1 | sed "s,^-[^-]*-\(.*\),\1,"`
VAL=`echo $1 | sed "s,^-\([^-]*\).*,\1,"`
VAR=`echo $1 | sed 's,^-[^-]*-\(.*\),\1,'`
VAL=`echo $1 | sed 's,^-\([^-]*\).*,\1,'`
;;
#Qt style no options
-no-*)
VAR=`echo $1 | sed "s,^-no-\(.*\),\1,"`
VAR=`echo $1 | sed 's,^-no-\(.*\),\1,'`
VAL=no
;;
#Qt style options that pass an argument
@ -900,14 +900,14 @@ while [ "$#" -gt 0 ]; do
-android-ndk-host| \
-android-arch| \
-android-toolchain-version)
VAR=`echo $1 | sed "s,^-\(.*\),\1,"`
VAR=`echo $1 | sed 's,^-\(.*\),\1,'`
shift
VAL="$1"
;;
#Qt style complex options in one command
-enable-*|-disable-*)
VAR=`echo $1 | sed "s,^-\([^-]*\)-.*,\1,"`
VAL=`echo $1 | sed "s,^-[^-]*-\(.*\),\1,"`
VAR=`echo $1 | sed 's,^-\([^-]*\)-.*,\1,'`
VAL=`echo $1 | sed 's,^-[^-]*-\(.*\),\1,'`
;;
-system-proxies)
VAR=system-proxies
@ -919,8 +919,8 @@ while [ "$#" -gt 0 ]; do
;;
#Qt Builtin/System style options
-no-*|-system-*|-qt-*)
VAR=`echo $1 | sed "s,^-[^-]*-\(.*\),\1,"`
VAL=`echo $1 | sed "s,^-\([^-]*\)-.*,\1,"`
VAR=`echo $1 | sed 's,^-[^-]*-\(.*\),\1,'`
VAL=`echo $1 | sed 's,^-\([^-]*\)-.*,\1,'`
;;
#Options that cannot be generalized
-k|-continue)
@ -948,7 +948,7 @@ while [ "$#" -gt 0 ]; do
fi
;;
-hostprefix)
VAR=`echo $1 | sed "s,^-\(.*\),\1,"`
VAR=`echo $1 | sed 's,^-\(.*\),\1,'`
# this option may or may not be followed by an argument
if [ -z "$2" ] || echo "$2" | grep '^-' >/dev/null 2>&1; then
VAL=$outpath
@ -1038,7 +1038,7 @@ while [ "$#" -gt 0 ]; do
;;
#General options, including Qt style yes options
-*)
VAR=`echo $1 | sed "s,^-\(.*\),\1,"`
VAR=`echo $1 | sed 's,^-\(.*\),\1,'`
VAL="yes"
;;
*)
@ -1396,7 +1396,7 @@ while [ "$#" -gt 0 ]; do
fi
;;
feature-*)
FEATURE=`echo $VAR | sed "s,^[^-]*-\([^-]*\),\1," | tr 'abcdefghijklmnopqrstuvwxyz-' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
FEATURE=`echo $VAR | sed 's,^[^-]*-\([^-]*\),\1,' | tr 'abcdefghijklmnopqrstuvwxyz-' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
if [ "$VAL" = "no" ]; then
QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_$FEATURE"
elif [ "$VAL" = "yes" ] || [ "$VAL" = "unknown" ]; then
@ -1908,8 +1908,8 @@ while [ "$#" -gt 0 ]; do
fi
# now $VAL is "no", "qt", or "plugin"
OPT="$VAL"
VAL=`echo $VAR | sed "s,^[^-]*-\([^-]*\).*,\1,"`
VAR=`echo $VAR | sed "s,^\([^-]*\).*,\1,"`
VAL=`echo $VAR | sed 's,^[^-]*-\([^-]*\).*,\1,'`
VAR=`echo $VAR | sed 's,^\([^-]*\).*,\1,'`
# Grab the available values
case "$VAR" in
@ -1975,7 +1975,7 @@ while [ "$#" -gt 0 ]; do
fi
elif [ "$VAL" = "no" ]; then
if [ "$OPT_VERBOSE" = "$VAL" ] && echo "$QMAKE_SWITCHES" | grep ' -d' >/dev/null 2>&1; then
QMAKE_SWITCHES=`echo $QMAKE_SWITCHES | sed "s, -d,,"`
QMAKE_SWITCHES=`echo $QMAKE_SWITCHES | sed 's, -d,,'`
else
OPT_VERBOSE=no
fi
@ -3047,7 +3047,7 @@ elif [ "$Edition" = "Preview" ]; then
done
elif [ "$Edition" != "OpenSource" ]; then
if [ -n "$ExpiryDate" ]; then
ExpiryDate=`echo $ExpiryDate | sed -e "s,-,,g" | tr -d "\n\r"`
ExpiryDate=`echo $ExpiryDate | sed -e 's,-,,g' | tr -d '\n\r'`
[ -z "$ExpiryDate" ] && ExpiryDate="0"
Today=`date +%Y%m%d`
if [ "$Today" -gt "$ExpiryDate" ]; then
@ -3510,7 +3510,7 @@ function normalize(dir)
{
do {
odir = dir
gsub(/\/[^\/]+\/\.\./, "", dir)
sub(/\/[^\/]+\/\.\./, "", dir)
} while (dir != odir);
do {
odir = dir
@ -3566,7 +3566,7 @@ if [ -z "$CFG_BUILD_PARTS" ]; then
# don't build tools by default when cross-compiling
if [ "$PLATFORM" != "$XPLATFORM" ]; then
CFG_BUILD_PARTS=`echo "$CFG_BUILD_PARTS" | sed "s, tools,,g"`
CFG_BUILD_PARTS=`echo "$CFG_BUILD_PARTS" | sed 's, tools,,g'`
fi
fi
for nobuild in $CFG_NOBUILD_PARTS; do
@ -4017,7 +4017,7 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
if "$WHICH" makedepend >/dev/null 2>&1 && grep 'depend:' "$mkfile" >/dev/null 2>&1; then
(cd "$outpath/qmake" && "$MAKE" -f "$mkfile" depend) >/dev/null 2>&1
sed "s,^.*/\([^/]*.o\):,\1:,g" "$mkfile" >"$mkfile.tmp"
sed 's,^.*/\([^/]*.o\):,\1:,g' "$mkfile" >"$mkfile.tmp"
sed "s,$outpath,$adjoutpath,g" "$mkfile.tmp" >"$mkfile"
rm "$mkfile.tmp"
fi
@ -4155,7 +4155,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
@ -4168,7 +4168,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
@ -5118,6 +5118,42 @@ if compileTest x11/xlib "XLib"; then
QT_CONFIG="$QT_CONFIG xlib"
fi
# auto-detect Xrender support
if [ "$CFG_XRENDER" != "no" ]; then
if compileTest x11/xrender "Xrender"; then
CFG_XRENDER=yes
QT_CONFIG="$QT_CONFIG xrender"
else
if [ "$CFG_XRENDER" = "yes" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
echo "Xrender support cannot be enabled due to functionality tests!"
echo " Turn on verbose messaging (-v) to $0 to see the final report."
echo " If you believe this message is in error you may use the continue"
echo " switch (-continue) to $0 to continue."
exit 101
else
CFG_XRENDER=no
fi
fi
fi
# auto-detect XInput2 support
if [ "$CFG_XINPUT2" != "no" ]; then
if compileTest x11/xinput2 "XInput2"; then
CFG_XINPUT2=yes
CFG_XINPUT=no
else
if [ "$CFG_XINPUT2" = "yes" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
echo "XInput2 support cannot be enabled due to functionality tests!"
echo " Turn on verbose messaging (-v) to $0 to see the final report."
echo " If you believe this message is in error you may use the continue"
echo " switch (-continue) to $0 to continue."
exit 101
else
CFG_XINPUT2=no
fi
fi
fi
if [ "$CFG_XCB" != "no" ]; then
if [ -n "$PKG_CONFIG" ] && $PKG_CONFIG --exists "xcb >= 1.5" 2>/dev/null; then
QMAKE_CFLAGS_XCB="`$PKG_CONFIG --cflags xcb 2>/dev/null`"
@ -5177,42 +5213,6 @@ if [ "$CFG_XCB" != "no" ]; then
QT_CONFIG="$QT_CONFIG xcb-sm"
fi
fi
# auto-detect Xrender support
if [ "$CFG_XRENDER" != "no" ]; then
if compileTest x11/xrender "Xrender"; then
CFG_XRENDER=yes
QT_CONFIG="$QT_CONFIG xrender"
else
if [ "$CFG_XRENDER" = "yes" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
echo "Xrender support cannot be enabled due to functionality tests!"
echo " Turn on verbose messaging (-v) to $0 to see the final report."
echo " If you believe this message is in error you may use the continue"
echo " switch (-continue) to $0 to continue."
exit 101
else
CFG_XRENDER=no
fi
fi
fi
# auto-detect XInput2 support. Needed by xcb too.
if [ "$CFG_XINPUT2" != "no" ]; then
if compileTest x11/xinput2 "XInput2"; then
CFG_XINPUT2=yes
CFG_XINPUT=no
else
if [ "$CFG_XINPUT2" = "yes" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
echo "XInput2 support cannot be enabled due to functionality tests!"
echo " Turn on verbose messaging (-v) to $0 to see the final report."
echo " If you believe this message is in error you may use the continue"
echo " switch (-continue) to $0 to continue."
exit 101
else
CFG_XINPUT2=no
fi
fi
fi
else
if [ "$CFG_XCB" != "auto" ]; then
echo "The test for linking against libxcb failed!"
@ -6319,10 +6319,10 @@ EOF
cfgdNeg=
if [ true ] && echo "$cfgd" | grep 'QT_NO_' >/dev/null 2>&1; then
# QT_NO_option can be forcefully turned on by QT_option
cfgdNeg=`echo $cfgd | sed "s,QT_NO_,QT_,"`
cfgdNeg=`echo $cfgd | sed 's,QT_NO_,QT_,'`
elif [ true ] && echo "$cfgd" | grep 'QT_' >/dev/null 2>&1; then
# QT_option can be forcefully turned off by QT_NO_option
cfgdNeg=`echo $cfgd | sed "s,QT_,QT_NO_,"`
cfgdNeg=`echo $cfgd | sed 's,QT_,QT_NO_,'`
fi
if [ -z $cfgdNeg ]; then

View File

@ -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 \

View File

@ -29,7 +29,7 @@
\example effects/fademessage
\title Fade Message Effect Example
\ingroup examples-graphicsview-graphicseffects
\brief Demonstrates how to appliy effects on items in the view
\brief Demonstrates how to apply effects on items in the view
\div { style="text-align: left"}
\inlineimage fademessageeffect-example.png

View File

@ -72,7 +72,7 @@ QEglFSImx6Hooks::QEglFSImx6Hooks()
qputenv("FB_MULTI_BUFFER", "2");
}
mNativeDisplay = fbGetDisplayByIndex(0);
mNativeDisplay = fbGetDisplayByIndex(framebufferIndex());
fbGetDisplayGeometry(mNativeDisplay, &width, &height);
mScreenSize.setHeight(height);
mScreenSize.setWidth(width);

View File

@ -8,4 +8,7 @@ contains(TEMPLATE, ".*app") {
INSTALLS *= target
}
}
} else: contains(TEMPLATE, "lib"):!QTDIR_build:android_install {
target.path = /libs/$$ANDROID_TARGET_ARCH/
INSTALLS *= target
}

View File

@ -97,6 +97,7 @@ probase = $$relative_path($$_PRO_FILE_PWD_, $$dirname(_QMAKE_CONF_)/examples)
TEMPLATE = aux
CONFIG -= have_target qt staticlib dll
SOURCES =
OBJECTIVE_SOURCES =
INSTALLS -= target
}
}

View File

@ -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.
}

View File

@ -65,7 +65,6 @@ depends += \
qtsvg \
qtsysteminfo \
qttestlib \
qttools \
qtuitools \
qtversit \
qtwebkit \

View File

@ -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>
@ -1795,11 +1796,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;

View File

@ -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;

View File

@ -889,30 +889,9 @@ void QMakeEvaluator::visitProVariable(
default: // whatever - cannot happen
case TokAssign: // =
zipEmpty(&varVal);
if (!m_cumulative) {
// FIXME: add check+warning about accidental value removal.
// This may be a bit too noisy, though.
m_valuemapStack.top()[varName] = varVal;
} else {
if (!varVal.isEmpty()) {
// We are greedy for values. But avoid exponential growth.
ProStringList &v = valuesRef(varName);
if (v.isEmpty()) {
v = varVal;
} else {
ProStringList old = v;
v = varVal;
QSet<ProString> has;
has.reserve(v.size());
foreach (const ProString &s, v)
has.insert(s);
v.reserve(v.size() + old.size());
foreach (const ProString &s, old)
if (!has.contains(s))
v << s;
}
}
}
// FIXME: add check+warning about accidental value removal.
// This may be a bit too noisy, though.
m_valuemapStack.top()[varName] = varVal;
debugMsg(2, "assigning");
break;
case TokAppendUnique: // *=
@ -928,7 +907,7 @@ void QMakeEvaluator::visitProVariable(
if (!m_cumulative) {
removeEach(&valuesRef(varName), varVal);
} else {
// We are stingy with our values, too.
// We are stingy with our values.
}
debugMsg(2, "removing");
break;
@ -1850,14 +1829,12 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateFile(
VisitReturn ok = visitProFile(pro, type, flags);
m_current = m_locationStack.pop();
pro->deref();
#ifdef PROEVALUATOR_FULL
if (ok == ReturnTrue && !(flags & LoadHidden)) {
ProStringList &iif = m_valuemapStack.first()[ProKey("QMAKE_INTERNAL_INCLUDED_FILES")];
ProString ifn(fileName);
if (!iif.contains(ifn))
iif << ifn;
}
#endif
return ok;
} else {
return ReturnFalse;
@ -1970,13 +1947,11 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateFileInto(
if (ret != ReturnTrue)
return ret;
*values = visitor.m_valuemapStack.top();
#ifdef PROEVALUATOR_FULL
ProKey qiif("QMAKE_INTERNAL_INCLUDED_FILES");
ProStringList &iif = m_valuemapStack.first()[qiif];
foreach (const ProString &ifn, values->value(qiif))
if (!iif.contains(ifn))
iif << ifn;
#endif
return ReturnTrue;
}

View File

@ -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") )

View File

@ -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
}

View File

@ -256,7 +256,7 @@
# if defined(__EDG__)
# define Q_CC_EDG
# endif
/* Compaq have disabled EDG's _BOOL macro and use _BOOL_EXISTS instead
/* Compaq has disabled EDG's _BOOL macro and uses _BOOL_EXISTS instead
- observed on Compaq C++ V6.3-002.
In any case versions prior to Compaq C++ V6.0-005 do not have bool. */
# if !defined(_BOOL_EXISTS)
@ -794,13 +794,13 @@
# define Q_COMPILER_DECLTYPE
# define Q_COMPILER_RVALUE_REFS
# define Q_COMPILER_STATIC_ASSERT
// MSVC's library has std::initilizer_list, but the compiler does not support the braces initialization
// MSVC's library has std::initializer_list, but the compiler does not support the braces initialization
//# define Q_COMPILER_INITIALIZER_LISTS
//# define Q_COMPILER_UNIFORM_INIT
# endif
# if _MSC_VER >= 1700
/* C++11 features supported in VC11 = VC2012: */
# undef Q_DECL_OVERRIDE /* undo 2005/2098 settings... */
# undef Q_DECL_OVERRIDE /* undo 2005/2008 settings... */
# undef Q_DECL_FINAL /* undo 2005/2008 settings... */
# define Q_COMPILER_EXPLICIT_OVERRIDES /* ...and use std C++11 now */
# define Q_COMPILER_RANGE_FOR

View File

@ -829,18 +829,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

View File

@ -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();

View File

@ -144,6 +144,8 @@ win32 {
}
} else:blackberry {
SOURCES += io/qstandardpaths_blackberry.cpp
} else:android {
SOURCES += io/qstandardpaths_android.cpp
} else {
SOURCES += io/qstandardpaths_unix.cpp
}

View File

@ -855,7 +855,7 @@ QString QDir::fromNativeSeparators(const QString &pathName)
/*!
Changes the QDir's directory to \a dirName.
Returns \c true if the new directory exists and is readable;
Returns \c true if the new directory exists;
otherwise returns \c false. Note that the logical cd() operation is
not performed if the new directory does not exist.
@ -923,7 +923,7 @@ bool QDir::cd(const QString &dirName)
Changes directory by moving one directory up from the QDir's
current directory.
Returns \c true if the new directory exists and is readable;
Returns \c true if the new directory exists;
otherwise returns \c false. Note that the logical cdUp() operation is
not performed if the new directory does not exist.

View File

@ -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();

View File

@ -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
}

View File

@ -0,0 +1,331 @@
/****************************************************************************
**
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and 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 "qstandardpaths.h"
#ifndef QT_NO_STANDARDPATHS
#include <QtCore/private/qjni_p.h>
#include <QtCore/private/qjnihelpers_p.h>
#include <QtCore/qmap.h>
#include <QDir>
QT_BEGIN_NAMESPACE
typedef QMap<QString, QString> AndroidDirCache;
Q_GLOBAL_STATIC(AndroidDirCache, androidDirCache)
static QString testDir()
{
return QStandardPaths::isTestModeEnabled() ? QLatin1String("/qttest")
: QLatin1String("");
}
static QJNIObjectPrivate applicationContext()
{
static QJNIObjectPrivate appCtx;
if (appCtx.isValid())
return appCtx;
QJNIObjectPrivate activity = QtAndroidPrivate::activity();
if (!activity.isValid())
return appCtx;
appCtx = activity.callObjectMethod("getApplicationContext",
"()Landroid/content/Context;");
return appCtx;
}
static inline QString getAbsolutePath(const QJNIObjectPrivate &file)
{
QJNIObjectPrivate path = file.callObjectMethod("getAbsolutePath",
"()Ljava/lang/String;");
if (!path.isValid())
return QString();
return path.toString();
}
/*
* The root of the external storage
*
*/
static QString getExternalStorageDirectory()
{
QString &path = (*androidDirCache)[QStringLiteral("EXT_ROOT")];
if (!path.isEmpty())
return path;
QJNIObjectPrivate file = QJNIObjectPrivate::callStaticObjectMethod("android/os/Environment",
"getExternalStorageDirectory",
"()Ljava/io/File;");
if (!file.isValid())
return QString();
return (path = getAbsolutePath(file));
}
/*
* Locations where applications can place user files (public).
* E.g., /storage/Music
*/
static QString getExternalStoragePublicDirectory(const char *directoryField)
{
QString &path = (*androidDirCache)[QLatin1String(directoryField)];
if (!path.isEmpty())
return path;
QJNIObjectPrivate dirField = QJNIObjectPrivate::getStaticObjectField("android/os/Environment",
directoryField,
"Ljava/lang/String;");
if (!dirField.isValid())
return QString();
QJNIObjectPrivate file = QJNIObjectPrivate::callStaticObjectMethod("android/os/Environment",
"getExternalStoragePublicDirectory",
"(Ljava/lang/String;)Ljava/io/File;",
dirField.object());
if (!file.isValid())
return QString();
return (path = getAbsolutePath(file));
}
/*
* Locations where applications can place persistent files it owns.
* E.g., /storage/org.app/Music
*/
static QString getExternalFilesDir(const char *directoryField = 0)
{
QString &path = (*androidDirCache)[QString(QLatin1String("APPNAME_%1")).arg(QLatin1String(directoryField))];
if (!path.isEmpty())
return path;
QJNIObjectPrivate activity = QtAndroidPrivate::activity();
if (!activity.isValid())
return QString();
QJNIObjectPrivate appCtx = applicationContext();
if (!appCtx.isValid())
return QString();
QJNIObjectPrivate dirField = QJNIObjectPrivate::fromString(QLatin1String(""));
if (directoryField) {
dirField = QJNIObjectPrivate::getStaticObjectField("android/os/Environment",
directoryField,
"Ljava/lang/String;");
if (!dirField.isValid())
return QString();
}
QJNIObjectPrivate file = appCtx.callObjectMethod("getExternalFilesDir",
"(Ljava/lang/String;)Ljava/io/File;",
dirField.object());
if (!file.isValid())
return QString();
return (path = getAbsolutePath(file));
}
/*
* Directory where applications can store cache files it owns (public).
* E.g., /storage/org.app/
*/
static QString getExternalCacheDir()
{
QString &path = (*androidDirCache)[QStringLiteral("APPNAME_CACHE")];
if (!path.isEmpty())
return path;
QJNIObjectPrivate appCtx = applicationContext();
if (!appCtx.isValid())
return QString();
QJNIObjectPrivate file = appCtx.callObjectMethod("getExternalCacheDir",
"()Ljava/io/File;");
if (!file.isValid())
return QString();
return (path = getAbsolutePath(file));
}
/*
* Directory where applications can store cache files it owns (private).
*/
static QString getCacheDir()
{
QString &path = (*androidDirCache)[QStringLiteral("APPROOT_CACHE")];
if (!path.isEmpty())
return path;
QJNIObjectPrivate appCtx = applicationContext();
if (!appCtx.isValid())
return QString();
QJNIObjectPrivate file = appCtx.callObjectMethod("getCacheDir",
"()Ljava/io/File;");
if (!file.isValid())
return QString();
return (path = getAbsolutePath(file));
}
/*
* Directory where applications can store files it owns (private).
* (Same location as $HOME)
*/
static QString getFilesDir()
{
QString &path = (*androidDirCache)[QStringLiteral("APPROOT_FILES")];
if (!path.isEmpty())
return path;
return (path = QDir::homePath());
}
QString QStandardPaths::writableLocation(StandardLocation type)
{
switch (type) {
case QStandardPaths::MusicLocation:
return getExternalStoragePublicDirectory("DIRECTORY_MUSIC");
case QStandardPaths::MoviesLocation:
return getExternalStoragePublicDirectory("DIRECTORY_MOVIES");
case QStandardPaths::PicturesLocation:
return getExternalStoragePublicDirectory("DIRECTORY_PICTURES");
case QStandardPaths::DocumentsLocation:
if (QtAndroidPrivate::androidSdkVersion() > 18)
return getExternalStoragePublicDirectory("DIRECTORY_DOCUMENTS");
else
return getExternalStorageDirectory() + QLatin1String("/Documents");
case QStandardPaths::DownloadLocation:
return getExternalStoragePublicDirectory("DIRECTORY_DOWNLOADS");
case QStandardPaths::GenericConfigLocation:
case QStandardPaths::ConfigLocation:
return getFilesDir() + testDir() + QLatin1String("/settings");
case QStandardPaths::GenericDataLocation:
return getExternalStorageDirectory() + testDir();
case QStandardPaths::DataLocation:
return getFilesDir() + testDir();
case QStandardPaths::GenericCacheLocation:
case QStandardPaths::RuntimeLocation:
case QStandardPaths::TempLocation:
case QStandardPaths::CacheLocation:
return getCacheDir() + testDir();
case QStandardPaths::DesktopLocation:
case QStandardPaths::HomeLocation:
return getFilesDir();
case QStandardPaths::ApplicationsLocation:
case QStandardPaths::FontsLocation:
default:
break;
}
return QString();
}
QStringList QStandardPaths::standardLocations(StandardLocation type)
{
if (type == MusicLocation) {
return QStringList() << writableLocation(type)
<< getExternalFilesDir("DIRECTORY_MUSIC")
<< getExternalStoragePublicDirectory("DIRECTORY_PODCASTS")
<< getExternalFilesDir("DIRECTORY_PODCASTS")
<< getExternalStoragePublicDirectory("DIRECTORY_NOTIFICATIONS")
<< getExternalFilesDir("DIRECTORY_NOTIFICATIONS")
<< getExternalStoragePublicDirectory("DIRECTORY_ALARMS")
<< getExternalFilesDir("DIRECTORY_ALARMS");
}
if (type == MoviesLocation) {
return QStringList() << writableLocation(type)
<< getExternalFilesDir("DIRECTORY_MOVIES");
}
if (type == PicturesLocation) {
return QStringList() << writableLocation(type)
<< getExternalFilesDir("DIRECTORY_PICTURES");
}
if (type == DocumentsLocation) {
if (QtAndroidPrivate::androidSdkVersion() > 18) {
return QStringList() << writableLocation(type)
<< getExternalFilesDir("DIRECTORY_DOCUMENTS");
} else {
return QStringList() << writableLocation(type)
<< getExternalFilesDir() + QLatin1String("/Documents");
}
}
if (type == DownloadLocation) {
return QStringList() << writableLocation(type)
<< getExternalFilesDir("DIRECTORY_DOWNLOADS");
}
if (type == DataLocation) {
return QStringList() << writableLocation(type)
<< getExternalFilesDir();
}
if (type == CacheLocation) {
return QStringList() << writableLocation(type)
<< getExternalCacheDir();
}
if (type == FontsLocation) {
QString &fontLocation = (*androidDirCache)[QStringLiteral("FONT_LOCATION")];
if (!fontLocation.isEmpty())
return QStringList(fontLocation);
const QByteArray ba = qgetenv("QT_ANDROID_FONT_LOCATION");
if (!ba.isEmpty())
return QStringList((fontLocation = QDir::cleanPath(QString::fromLocal8Bit(ba))));
return QStringList((fontLocation = QLatin1String("/system/fonts")));
}
return QStringList(writableLocation(type));
}
QT_END_NAMESPACE
#endif // QT_NO_STANDARDPATHS

View File

@ -3437,7 +3437,7 @@ QString QUrl::fromAce(const QByteArray &domain)
(like \c "example.com") to be written using international
characters.
This function return an empty QByteArra if \a domain is not a valid
This function returns an empty QByteArray if \a domain is not a valid
hostname. Note, in particular, that IPv6 literals are not valid domain
names.
*/

View File

@ -2334,6 +2334,31 @@ void QAbstractItemModel::doSetRoleNames(const QHash<int,QByteArray> &roleNames)
Returns the model's role names.
The default role names set by Qt are:
\table
\header
\li Qt Role
\li QML Role Name
\row
\li Qt::DisplayRole
\li display
\row
\li Qt::DecorationRole
\li decoration
\row
\li Qt::EditRole
\li edit
\row
\li Qt::ToolTipRole
\li toolTip
\row
\li Qt::StatusTipRole
\li statusTip
\row
\li Qt::WhatsThisRole
\li whatsThis
\endtable
*/
QHash<int,QByteArray> QAbstractItemModel::roleNames() const
{
@ -3378,6 +3403,9 @@ Qt::ItemFlags QAbstractTableModel::flags(const QModelIndex &index) const
of the rowCount() and data() functions. Well behaved models also provide
a headerData() implementation.
If your model is used within QML and requires roles other than the
default ones provided by the roleNames() function, you must override it.
For editable list models, you must also provide an implementation of
setData(), implement the flags() function so that it returns a value
containing \l{Qt::ItemFlags}{Qt::ItemIsEditable}.

View File

@ -46,6 +46,7 @@ QT_BEGIN_NAMESPACE
static JavaVM *g_javaVM = Q_NULLPTR;
static jobject g_jActivity = Q_NULLPTR;
static jobject g_jClassLoader = Q_NULLPTR;
static jint g_androidSdkVersion = 0;
static inline bool exceptionCheck(JNIEnv *env)
{
@ -60,6 +61,19 @@ static inline bool exceptionCheck(JNIEnv *env)
return false;
}
static void setAndroidSdkVersion(JNIEnv *env)
{
jclass androidVersionClass = env->FindClass("android/os/Build$VERSION");
if (exceptionCheck(env))
return;
jfieldID androidSDKFieldID = env->GetStaticFieldID(androidVersionClass, "SDK_INT", "I");
if (exceptionCheck(env))
return;
g_androidSdkVersion = env->GetStaticIntField(androidVersionClass, androidSDKFieldID);
}
jint QtAndroidPrivate::initJNI(JavaVM *vm, JNIEnv *env)
{
jclass jQtNative = env->FindClass("org/qtproject/qt5/android/QtNative");
@ -93,6 +107,8 @@ jint QtAndroidPrivate::initJNI(JavaVM *vm, JNIEnv *env)
if (exceptionCheck(env))
return JNI_ERR;
setAndroidSdkVersion(env);
g_jClassLoader = env->NewGlobalRef(classLoader);
env->DeleteLocalRef(classLoader);
g_jActivity = env->NewGlobalRef(activity);
@ -118,4 +134,9 @@ jobject QtAndroidPrivate::classLoader()
return g_jClassLoader;
}
jint QtAndroidPrivate::androidSdkVersion()
{
return g_androidSdkVersion;
}
QT_END_NAMESPACE

View File

@ -64,6 +64,7 @@ namespace QtAndroidPrivate
Q_CORE_EXPORT JavaVM *javaVM();
Q_CORE_EXPORT jint initJNI(JavaVM *vm, JNIEnv *env);
jobject classLoader();
jint androidSdkVersion();
}
QT_END_NAMESPACE

View File

@ -2180,7 +2180,9 @@ void QObject::deleteLater()
const char *qFlagLocation(const char *method)
{
QThreadData::current()->flaggedSignatures.store(method);
QThreadData *currentThreadData = QThreadData::current(false);
if (currentThreadData != 0)
currentThreadData->flaggedSignatures.store(method);
return method;
}
@ -3553,8 +3555,11 @@ void QMetaObject::activate(QObject *sender, int signalOffset, int local_signal_i
{
int signal_index = signalOffset + local_signal_index;
if (!sender->d_func()->isSignalConnected(signal_index))
if (!sender->d_func()->isSignalConnected(signal_index)
&& !qt_signal_spy_callback_set.signal_begin_callback
&& !qt_signal_spy_callback_set.signal_end_callback) {
return; // nothing connected to these signals, and no spy
}
if (sender->d_func()->blockSig)
return;

View File

@ -247,7 +247,7 @@ public:
Returns \c true if the signal with index \a signal_index from object \a sender is connected.
Signals with indices above a certain range are always considered connected (see connectedSignals
in QObjectPrivate). If a signal spy is installed, all signals are considered connected.
in QObjectPrivate).
\a signal_index must be the index returned by QObjectPrivate::signalIndex;
*/
@ -256,9 +256,7 @@ inline bool QObjectPrivate::isSignalConnected(uint signal_index) const
return signal_index >= sizeof(connectedSignals) * 8
|| (connectedSignals[signal_index >> 5] & (1 << (signal_index & 0x1f))
|| (declarativeData && QAbstractDeclarativeData::isSignalConnected
&& QAbstractDeclarativeData::isSignalConnected(declarativeData, q_func(), signal_index))
|| qt_signal_spy_callback_set.signal_begin_callback
|| qt_signal_spy_callback_set.signal_end_callback);
&& QAbstractDeclarativeData::isSignalConnected(declarativeData, q_func(), signal_index)));
}
inline QObjectPrivate::Sender *QObjectPrivate::setCurrentSender(QObject *receiver,

View File

@ -232,7 +232,7 @@ public:
QThreadData(int initialRefCount = 1);
~QThreadData();
static QThreadData *current();
static QThreadData *current(bool createIfNecessary = true);
static void clearCurrentThreadData();
static QThreadData *get2(QThread *thread)
{ Q_ASSERT_X(thread != 0, "QThread", "internal error"); return thread->d_func()->data; }

View File

@ -215,10 +215,10 @@ void QThreadData::clearCurrentThreadData()
clear_thread_data();
}
QThreadData *QThreadData::current()
QThreadData *QThreadData::current(bool createIfNecessary)
{
QThreadData *data = get_thread_data();
if (!data) {
if (!data && createIfNecessary) {
data = new QThreadData;
QT_TRY {
set_thread_data(data);

View File

@ -141,11 +141,11 @@ void QThreadData::clearCurrentThreadData()
TlsSetValue(qt_current_thread_data_tls_index, 0);
}
QThreadData *QThreadData::current()
QThreadData *QThreadData::current(bool createIfNecessary)
{
qt_create_tls();
QThreadData *threadData = reinterpret_cast<QThreadData *>(TlsGetValue(qt_current_thread_data_tls_index));
if (!threadData) {
if (!threadData && createIfNecessary) {
threadData = new QThreadData;
// This needs to be called prior to new AdoptedThread() to
// avoid recursion.

View File

@ -720,7 +720,8 @@ QStringList QCommandLineParser::values(const QString &optionName) const
*/
bool QCommandLineParser::isSet(const QCommandLineOption &option) const
{
return isSet(option.names().first());
// option.names() might be empty if the constructor failed
return !option.names().isEmpty() && isSet(option.names().first());
}
/*!

View File

@ -1284,6 +1284,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();
@ -1900,7 +1905,7 @@ int QTime::msecsTo(const QTime &t) const
#ifndef QT_NO_DATESTRING
static QTime fromIsoTimeString(const QString &string, Qt::DateFormat format, bool *isMidnight24)
static QTime fromIsoTimeString(const QStringRef &string, Qt::DateFormat format, bool *isMidnight24)
{
if (isMidnight24)
*isMidnight24 = false;
@ -1933,9 +1938,13 @@ static QTime fromIsoTimeString(const QString &string, Qt::DateFormat format, boo
// the maximum amount of millisecond digits it will expand to once converted to
// seconds is 4. E.g. 12:34,99999 will expand to 12:34:59.9994. The milliseconds
// will then be rounded up AND clamped to 999.
const float minuteFraction = QString::fromUtf8("0.%1").arg(string.mid(6, 5)).toFloat(&ok);
const QStringRef minuteFractionStr = string.mid(6, 5);
const long minuteFractionInt = minuteFractionStr.toLong(&ok);
if (!ok)
return QTime();
const float minuteFraction = double(minuteFractionInt) / (std::pow(double(10), minuteFractionStr.count()));
const float secondWithMs = minuteFraction * 60;
const float secondNoMs = std::floor(secondWithMs);
const float secondFraction = secondWithMs - secondNoMs;
@ -1947,9 +1956,11 @@ static QTime fromIsoTimeString(const QString &string, Qt::DateFormat format, boo
if (!ok)
return QTime();
if (size > 8 && (string.at(8) == QLatin1Char(',') || string.at(8) == QLatin1Char('.'))) {
const double secondFraction = QString::fromUtf8("0.%1").arg(string.mid(9, 4)).toDouble(&ok);
const QStringRef msecStr(string.mid(9, 4));
int msecInt = msecStr.isEmpty() ? 0 : msecStr.toInt(&ok);
if (!ok)
return QTime();
const double secondFraction(msecInt / (std::pow(double(10), msecStr.count())));
msec = qMin(qRound(secondFraction * 1000.0), 999);
}
}
@ -1999,7 +2010,7 @@ QTime QTime::fromString(const QString& string, Qt::DateFormat format)
case Qt::ISODate:
case Qt::TextDate:
default:
return fromIsoTimeString(string, format, 0);
return fromIsoTimeString(&string, format, 0);
}
}
@ -2767,6 +2778,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
@ -4372,26 +4392,40 @@ QDateTime QDateTime::fromString(const QString& string, Qt::DateFormat format)
if (size < 10)
return QDateTime();
QString isoString = string;
QStringRef isoString(&string);
Qt::TimeSpec spec = Qt::LocalTime;
QDate date = QDate::fromString(isoString.left(10), Qt::ISODate);
QDate date = QDate::fromString(string.left(10), Qt::ISODate);
if (!date.isValid())
return QDateTime();
if (size == 10)
return QDateTime(date);
isoString.remove(0, 11);
isoString = isoString.right(11);
int offset = 0;
// Check end of string for Time Zone definition, either Z for UTC or [+-]HH:MM for Offset
if (isoString.endsWith(QLatin1Char('Z'))) {
spec = Qt::UTC;
isoString.chop(1);
isoString = isoString.left(isoString.size() - 1);
} else {
const int signIndex = isoString.indexOf(QRegExp(QStringLiteral("[+-]")));
if (signIndex >= 0) {
// the loop below is faster but functionally equal to:
// const int signIndex = isoString.indexOf(QRegExp(QStringLiteral("[+-]")));
const int sizeOfTimeZoneString = 4;
int signIndex = isoString.size() - sizeOfTimeZoneString - 1;
bool found = false;
{
const QChar plus = QLatin1Char('+');
const QChar minus = QLatin1Char('-');
do {
QChar character(isoString.at(signIndex));
found = character == plus || character == minus;
} while (--signIndex >= 0 && !found);
++signIndex;
}
if (found) {
bool ok;
offset = fromOffsetString(isoString.mid(signIndex), &ok);
offset = fromOffsetString(isoString.mid(signIndex).toString(), &ok);
if (!ok)
return QDateTime();
isoString = isoString.left(signIndex);

View File

@ -348,6 +348,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,

View File

@ -189,9 +189,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)
@ -3947,6 +3961,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 void toLatin1_helper(uchar *dst, const ushort *src, int length)
{
if (length) {
@ -3995,10 +4013,14 @@ static void toLatin1_helper(uchar *dst, const ushort *src, 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
}
}
@ -4151,6 +4173,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;
@ -4191,8 +4219,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;
}

View File

@ -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)

View File

@ -438,11 +438,15 @@ QVector<T>::QVector(int asize, const T &t)
template <typename T>
QVector<T>::QVector(std::initializer_list<T> args)
{
d = Data::allocate(args.size());
// std::initializer_list<T>::iterator is guaranteed to be
// const T* ([support.initlist]/1), so can be memcpy'ed away from by copyConstruct
copyConstruct(args.begin(), args.end(), d->begin());
d->size = int(args.size());
if (args.size() > 0) {
d = Data::allocate(args.size());
// std::initializer_list<T>::iterator is guaranteed to be
// const T* ([support.initlist]/1), so can be memcpy'ed away from by copyConstruct
copyConstruct(args.begin(), args.end(), d->begin());
d->size = int(args.size());
} else {
d = Data::sharedNull();
}
}
#endif

View File

@ -198,3 +198,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

View File

@ -85,3 +85,5 @@ contains(QT_CPU_FEATURES.$$QT_ARCH, sse2) {
SOURCES += image/qimage_sse2.cpp
SSSE3_SOURCES += image/qimage_ssse3.cpp
}
MIPS_DSPR2_SOURCES += image/qimage_mips_dspr2.cpp
MIPS_DSPR2_ASM += image/qimage_mips_dspr2_asm.S

View File

@ -2172,6 +2172,12 @@ void qInitImageConversions()
qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB32_neon;
qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB32_neon;
#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
}
QT_END_NAMESPACE

View File

@ -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 @@
**
****************************************************************************/
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include "qmacdefines_mac.h"
#import <Cocoa/Cocoa.h>
#include "qimage.h"
#include <private/qimage_p.h>
QT_BEGIN_NAMESPACE
class QMainWindowLayout;
class QToolBar;
QT_END_NAMESPACE
@class NSToolbarItem;
// Defined in qimage_mips_dspr2_asm.S
//
extern "C" void premultiply_argb_inplace_mips_asm(void*, unsigned, unsigned, int);
@interface QT_MANGLE_NAMESPACE(QCocoaToolBarDelegate) : NSObject {
QT_PREPEND_NAMESPACE(QMainWindowLayout) *mainWindowLayout;
NSToolbarItem *toolbarItem;
bool convert_ARGB_to_ARGB_PM_inplace_mips_dspr2(QImageData *data, Qt::ImageConversionFlags)
{
Q_ASSERT(data->format == QImage::Format_ARGB32);
if (!data->width || !data->height)
return true;
Q_ASSERT((data->bytes_per_line - (data->width << 2)) >= 0);
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

View File

@ -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)

View File

@ -1488,10 +1488,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));

View File

@ -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

View File

@ -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
@ -403,6 +405,7 @@ public:
};
#endif
#ifndef QT_NO_GESTURES
class GestureEvent : public InputEvent {
public:
GestureEvent(QWindow *window, ulong time, Qt::NativeGestureType type, QPointF pos, QPointF globalPos)
@ -417,6 +420,7 @@ public:
ulong sequenceId;
quint64 intValue;
};
#endif
class WindowSystemEventList {
QList<WindowSystemEvent *> impl;

View File

@ -436,12 +436,6 @@ inline void QT_FASTCALL storePixel<QPixelLayout::BPP24>(uchar *dest, int index,
reinterpret_cast<quint24 *>(dest)[index] = quint24(pixel);
}
template <>
inline void QT_FASTCALL storePixel<QPixelLayout::BPP32>(uchar *dest, int index, uint pixel)
{
reinterpret_cast<uint *>(dest)[index] = pixel;
}
template <QPixelLayout::BPP width>
inline void QT_FASTCALL storePixels(uchar *dest, const uint *src, int index, int count)
{
@ -1859,7 +1853,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
@ -6385,6 +6379,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;

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -62,6 +62,7 @@
#include "qglyphrun.h"
#include <qpa/qplatformtheme.h>
#include <qpa/qplatformintegration.h>
#include <private/qfontengine_p.h>
#include <private/qpaintengine_p.h>
@ -155,7 +156,9 @@ static bool qt_painter_thread_test(int devType, const char *what)
// can be drawn onto these devices safely from any thread
break;
default:
if (QThread::currentThread() != qApp->thread()) {
if (QThread::currentThread() != qApp->thread()
&& (devType!=QInternal::Pixmap || !QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ThreadedPixmaps))
&& (devType!=QInternal::OpenGL || !QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ThreadedOpenGL))) {
qWarning("QPainter: It is not safe to use %s outside the GUI thread", what);
return false;
}

View File

@ -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

View File

@ -591,8 +591,7 @@ QAbstractSocketPrivate::~QAbstractSocketPrivate()
/*! \internal
Resets the socket layer, clears the read and write buffers and
deletes any socket notifiers.
Resets the socket layer and deletes any socket notifiers.
*/
void QAbstractSocketPrivate::resetSocketLayer()
{
@ -1834,6 +1833,7 @@ qintptr QAbstractSocket::socketDescriptor() const
as a valid socket descriptor; otherwise returns \c false.
The socket is opened in the mode specified by \a openMode, and
enters the socket state specified by \a socketState.
Read and write buffers are cleared, discarding any pending data.
\b{Note:} It is not possible to initialize two abstract sockets
with the same native socket descriptor.
@ -1846,6 +1846,8 @@ bool QAbstractSocket::setSocketDescriptor(qintptr socketDescriptor, SocketState
Q_D(QAbstractSocket);
d->resetSocketLayer();
d->writeBuffer.clear();
d->buffer.clear();
d->socketEngine = QAbstractSocketEngine::createSocketEngine(socketDescriptor, this);
if (!d->socketEngine) {
d->socketError = UnsupportedSocketOperationError;
@ -2310,6 +2312,7 @@ void QAbstractSocket::abort()
#if defined (QABSTRACTSOCKET_DEBUG)
qDebug("QAbstractSocket::abort()");
#endif
d->writeBuffer.clear();
if (d->state == UnconnectedState)
return;
#ifndef QT_NO_SSL
@ -2324,7 +2327,6 @@ void QAbstractSocket::abort()
d->connectTimer = 0;
}
d->writeBuffer.clear();
d->abortCalled = true;
close();
}

View File

@ -189,9 +189,6 @@ init_context:
q_SSL_CTX_load_verify_locations(sslContext->ctx, 0, unixDirs.at(a).constData());
}
// Register a custom callback to get all verification errors.
X509_STORE_set_verify_cb_func(sslContext->ctx->cert_store, q_X509Callback);
if (!sslContext->sslConfiguration.localCertificate().isNull()) {
// Require a private key as well.
if (sslContext->sslConfiguration.privateKey().isNull()) {

View File

@ -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

View File

@ -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;
};

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -259,13 +259,17 @@ QPixmap QCocoaTheme::fileIconPixmap(const QFileInfo &fileInfo, const QSizeF &siz
NSImage *iconImage = [[NSWorkspace sharedWorkspace] iconForFile:QCFString::toNSString(fileInfo.canonicalFilePath())];
if (!iconImage)
return QPixmap();
NSRect iconRect = NSMakeRect(0, 0, size.width(), size.height());
NSGraphicsContext *gc = [NSGraphicsContext currentContext];
CGImageRef cgImage = [iconImage CGImageForProposedRect:&iconRect
context:([gc graphicsPort] ? gc : nil)
hints:nil];
QPixmap pixmap = QPixmap::fromImage(qt_mac_toQImage(cgImage));
NSSize pixmapSize = NSMakeSize(size.width(), size.height());
QPixmap pixmap(pixmapSize.width, pixmapSize.height);
pixmap.fill(Qt::transparent);
[iconImage setSize:pixmapSize];
NSRect iconRect = NSMakeRect(0, 0, pixmapSize.width, pixmapSize.height);
CGContextRef ctx = qt_mac_cg_context(&pixmap);
NSGraphicsContext *gc = [NSGraphicsContext graphicsContextWithGraphicsPort:ctx flipped:YES];
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext:gc];
[iconImage drawInRect:iconRect fromRect:iconRect operation:NSCompositeSourceOver fraction:1.0 respectFlipped:YES hints:nil];
[NSGraphicsContext restoreGraphicsState];
return pixmap;
}
@ -281,8 +285,12 @@ QVariant QCocoaTheme::themeHint(ThemeHint hint) const
case TabAllWidgets:
return QVariant(bool([[NSApplication sharedApplication] isFullKeyboardAccessEnabled]));
case IconPixmapSizes: {
qreal devicePixelRatio = qGuiApp->devicePixelRatio();
QList<int> sizes;
sizes << 16 << 32 << 64 << 128;
sizes << 16 * devicePixelRatio
<< 32 * devicePixelRatio
<< 64 * devicePixelRatio
<< 128 * devicePixelRatio;
return QVariant::fromValue(sizes);
}
case QPlatformTheme::PasswordMaskCharacter:

View File

@ -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();
@ -215,6 +217,10 @@ public: // for QNSView
NSInteger m_alertRequest;
id monitor;
bool m_drawContentBorderGradient;
int m_topContentBorderThickness;
int m_bottomContentBorderThickness;
// used by showFullScreen in fake mode
QRect m_normalGeometry;
Qt::WindowFlags m_oldWindowFlags;

View File

@ -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)
, m_normalGeometry(QRect(0,0,-1,-1))
{
#ifdef QT_COCOA_ENABLE_WINDOW_DEBUG
@ -511,6 +514,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
@ -936,6 +942,9 @@ NSWindow * QCocoaWindow::createNSWindow()
}
m_windowModality = window()->modality();
applyContentBorderThickness(createdWindow);
return createdWindow;
}
@ -1100,6 +1109,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

View File

@ -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);

View File

@ -77,7 +77,8 @@ public:
virtual bool filterConfig(EGLDisplay display, EGLConfig config) const;
virtual void waitForVSync() const;
virtual const char *fbDeviceName() const;
virtual QByteArray fbDeviceName() const;
virtual int framebufferIndex() const;
static QEglFSHooks *hooks()
{

View File

@ -42,6 +42,7 @@
#include "qeglfshooks.h"
#include <QtPlatformSupport/private/qeglplatformcursor_p.h>
#include <QtPlatformSupport/private/qeglconvenience_p.h>
#include <QtCore/QRegularExpression>
#include <fcntl.h>
#include <unistd.h>
@ -56,17 +57,34 @@ QT_BEGIN_NAMESPACE
// this is a global static to keep the QEglFSHooks interface as clean as possible
static int framebuffer = -1;
const char *QEglFSHooks::fbDeviceName() const
QByteArray QEglFSHooks::fbDeviceName() const
{
return "/dev/fb0";
QByteArray fbDev = qgetenv("QT_QPA_EGLFS_FB");
if (fbDev.isEmpty())
fbDev = QByteArrayLiteral("/dev/fb0");
return fbDev;
}
int QEglFSHooks::framebufferIndex() const
{
int fbIndex = 0;
QRegularExpression fbIndexRx(QLatin1String("fb(\\d+)"));
QRegularExpressionMatch match = fbIndexRx.match(fbDeviceName());
if (match.hasMatch())
fbIndex = match.captured(1).toInt();
return fbIndex;
}
void QEglFSHooks::platformInit()
{
framebuffer = qt_safe_open(fbDeviceName(), O_RDONLY);
QByteArray fbDev = fbDeviceName();
framebuffer = qt_safe_open(fbDev, O_RDONLY);
if (framebuffer == -1)
qWarning("EGLFS: Failed to open %s", fbDeviceName());
qWarning("EGLFS: Failed to open %s", qPrintable(fbDev));
}
void QEglFSHooks::platformDestroy()

View File

@ -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 {

View File

@ -304,6 +304,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(),

View File

@ -607,7 +607,7 @@ bool QSQLiteDriver::open(const QString & db, const QString &, const QString &, c
foreach (const QString &option, opts) {
if (option.startsWith(QLatin1String("QSQLITE_BUSY_TIMEOUT="))) {
bool ok;
const int nt = option.mid(21).toInt(&ok);
const int nt = option.midRef(21).toInt(&ok);
if (ok)
timeOut = nt;
} else if (option == QLatin1String("QSQLITE_OPEN_READONLY")) {

View File

@ -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

View File

@ -151,17 +151,17 @@ namespace QTest
Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
{ sendKeyEvent(action, window, key, keyToAscii(key), modifier, delay); }
inline static void keyClick(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
Q_DECL_UNUSED inline static void keyClick(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
{ keyEvent(Click, window, key, modifier, delay); }
inline static void keyClick(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
Q_DECL_UNUSED inline static void keyClick(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
{ keyEvent(Click, window, key, modifier, delay); }
inline static void keyRelease(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
Q_DECL_UNUSED inline static void keyRelease(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
{ keyEvent(Release, window, key, modifier, delay); }
inline static void keyRelease(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
Q_DECL_UNUSED inline static void keyRelease(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
{ keyEvent(Release, window, key, modifier, delay); }
inline static void keyPress(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
Q_DECL_UNUSED inline static void keyPress(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
{ keyEvent(Press, window, key, modifier, delay); }
inline static void keyPress(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
Q_DECL_UNUSED inline static void keyPress(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
{ keyEvent(Press, window, key, modifier, delay); }
#ifdef QT_WIDGETS_LIB

View File

@ -56,7 +56,7 @@ QT_BEGIN_NAMESPACE
namespace QTest
{
inline static void qWait(int ms)
Q_DECL_UNUSED inline static void qWait(int ms)
{
Q_ASSERT(QCoreApplication::instance());

View File

@ -343,7 +343,8 @@ int runMoc(int argc, char **argv)
parser.showHelp(1);
}
Macro macro;
macro.symbols += Symbol(0, PP_IDENTIFIER, value);
macro.symbols = Preprocessor::tokenize(value, 1, Preprocessor::TokenizeDefine);
macro.symbols.removeLast(); // remove the EOF symbol
pp.macros.insert(name, macro);
}
foreach (const QString &arg, parser.values(undefineOption)) {

View File

@ -158,8 +158,7 @@ bool Preprocessor::skipBranch()
}
enum TokenizeMode { TokenizeCpp, TokenizePreprocessor, PreparePreprocessorStatement, TokenizePreprocessorStatement, TokenizeInclude, PrepareDefine, TokenizeDefine };
static Symbols tokenize(const QByteArray &input, int lineNum = 1, TokenizeMode mode = TokenizeCpp)
Symbols Preprocessor::tokenize(const QByteArray& input, int lineNum, Preprocessor::TokenizeMode mode)
{
Symbols symbols;
const char *begin = input.constData();

View File

@ -89,6 +89,8 @@ public:
int evaluateCondition();
enum TokenizeMode { TokenizeCpp, TokenizePreprocessor, PreparePreprocessorStatement, TokenizePreprocessorStatement, TokenizeInclude, PrepareDefine, TokenizeDefine };
static Symbols tokenize(const QByteArray &input, int lineNum = 1, TokenizeMode mode = TokenizeCpp);
private:
void until(Token);

View File

@ -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();
}

View File

@ -62,7 +62,6 @@ depends += \
qtsql \
qtsvg \
qttestlib \
qttools \
qtuitools \
qtversit \
qtwidgets \

View File

@ -1,6 +1,7 @@
!force_bootstrap {
load(qfeatures)
requires(!contains(QT_DISABLED_FEATURES, xmlstreamwriter))
requires(!contains(QT_DISABLED_FEATURES, dom))
}
option(host_build)

View File

@ -44,7 +44,7 @@ w->setWindowState(w->windowState() ^ Qt::WindowFullScreen);
//! [1]
w->setWindowState(w->windowState() & ~Qt::WindowMinimized | Qt::WindowActive);
w->setWindowState((w->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
//! [1]

View File

@ -2274,7 +2274,7 @@ void QGraphicsWidget::paintWindowFrame(QPainter *painter, const QStyleOptionGrap
const QPointF styleOrigin = this->windowFrameRect().topLeft();
painter->translate(styleOrigin);
#ifdef Q_WS_MAC
#ifdef Q_OS_MAC
const QSize pixmapSize = windowFrameRect.size();
if (pixmapSize.width() <= 0 || pixmapSize.height() <= 0)
return;
@ -2342,7 +2342,7 @@ void QGraphicsWidget::paintWindowFrame(QPainter *painter, const QStyleOptionGrap
frameOptions.midLineWidth = 1;
style()->drawPrimitive(QStyle::PE_FrameWindow, &frameOptions, painter, widget);
#ifdef Q_WS_MAC
#ifdef Q_OS_MAC
realPainter->drawPixmap(QPoint(), pm);
delete painter;
#endif

View File

@ -915,6 +915,11 @@ QStyleOptionViewItem QListView::viewOptions() const
} else {
option.decorationPosition = QStyleOptionViewItem::Left;
}
if (d->gridSize().isValid()) {
option.rect.setSize(d->gridSize());
}
return option;
}

View File

@ -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"

View File

@ -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?

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -2042,7 +2042,7 @@ QList<QTextEdit::ExtraSelection> QTextEdit::extraSelections() const
This function returns a new MIME data object to represent the contents
of the text edit's current selection. It is called when the selection needs
to be encapsulated into a new QMimeData object; for example, when a drag
and drop operation is started, or when data is copyied to the clipboard.
and drop operation is started, or when data is copied to the clipboard.
If you reimplement this function, note that the ownership of the returned
QMimeData object is passed to the caller. The selection can be retrieved

View File

@ -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: {

View File

@ -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

View File

@ -332,20 +332,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;
}
@ -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)

View File

@ -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

View File

@ -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"

View File

@ -193,6 +193,8 @@ private slots:
void isReadable();
void cdNonreadable();
void cdBelowRoot();
private:
@ -1990,6 +1992,23 @@ void tst_QDir::isReadable()
#endif
}
void tst_QDir::cdNonreadable()
{
#ifdef Q_OS_UNIX
if (::getuid() == 0)
QSKIP("Running this test as root doesn't make sense");
QDir dir;
QVERIFY(dir.mkdir("nonreadabledir2"));
QVERIFY(0 == ::chmod("nonreadabledir2", S_IWUSR | S_IXUSR));
QVERIFY(dir.cd("nonreadabledir2"));
QVERIFY(!dir.isReadable());
QVERIFY(dir.cd(".."));
QVERIFY(0 == ::chmod("nonreadabledir2", S_IRUSR | S_IWUSR | S_IXUSR));
QVERIFY(dir.rmdir("nonreadabledir2"));
#endif
}
void tst_QDir::cdBelowRoot()
{
#if defined (Q_OS_UNIX)

View File

@ -52,7 +52,7 @@
#include <sys/types.h>
#endif
#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_BLACKBERRY)
#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_BLACKBERRY) && !defined(Q_OS_ANDROID)
#define Q_XDG_PLATFORM
#endif
@ -289,9 +289,9 @@ void tst_qstandardpaths::testDataLocation()
{
// On all platforms, DataLocation should be GenericDataLocation / organization name / app name
// This allows one app to access the data of another app.
// Blackberry OS and WinRT are an exception to this case, owing to the fact that
// Blackberry OS, Android and WinRT are an exception to this case, owing to the fact that
// applications are sandboxed.
#if !defined(Q_OS_BLACKBERRY) && !defined(Q_OS_WINRT)
#if !defined(Q_OS_BLACKBERRY) && !defined(Q_OS_ANDROID) && !defined(Q_OS_WINRT)
const QString base = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
QCOMPARE(QStandardPaths::writableLocation(QStandardPaths::DataLocation), base + "/tst_qstandardpaths");
QCoreApplication::instance()->setOrganizationName("Qt");

View File

@ -1,3 +1,3 @@
TEMPLATE = subdirs
SUBDIRS = qmimedatabase-xml
unix:!mac: SUBDIRS += qmimedatabase-cache
unix:!mac:!qnx: SUBDIRS += qmimedatabase-cache

View File

@ -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")

View File

@ -2787,6 +2787,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

Some files were not shown because too many files have changed in this diff Show More