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:
commit
9033977d39
@ -19,6 +19,24 @@ fi
|
|||||||
LFLAGS="$SYSROOT_FLAG"
|
LFLAGS="$SYSROOT_FLAG"
|
||||||
CXXFLAGS="$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
|
# debuggery
|
||||||
[ "$VERBOSE" = "yes" ] && echo "Determining architecture... ($*)"
|
[ "$VERBOSE" = "yes" ] && echo "Determining architecture... ($*)"
|
||||||
|
|
||||||
@ -26,7 +44,7 @@ CXXFLAGS="$SYSROOT_FLAG"
|
|||||||
test -d "$OUTDIR/config.tests/arch" || mkdir -p "$OUTDIR/config.tests/arch"
|
test -d "$OUTDIR/config.tests/arch" || mkdir -p "$OUTDIR/config.tests/arch"
|
||||||
cd "$OUTDIR/config.tests/arch"
|
cd "$OUTDIR/config.tests/arch"
|
||||||
[ -f Makefile ] && $MAKE distclean >/dev/null 2>&1
|
[ -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=""
|
ARCH=""
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
|
#include <linux/kd.h>
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
e1 = ABS_PRESSURE,
|
e1 = ABS_PRESSURE,
|
||||||
|
134
configure
vendored
134
configure
vendored
@ -95,7 +95,7 @@ if [ x"$1" = x"-top-level" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# later cache the command line in config.status
|
# 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
|
# initialize global variables
|
||||||
QMAKE_SWITCHES=
|
QMAKE_SWITCHES=
|
||||||
@ -170,7 +170,7 @@ expandQMakeConf()
|
|||||||
{
|
{
|
||||||
while read line; do case "$line" in
|
while read line; do case "$line" in
|
||||||
include*)
|
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"`
|
current_dir=`dirname "$1"`
|
||||||
conf_file="$current_dir/$inc_file"
|
conf_file="$current_dir/$inc_file"
|
||||||
if [ ! -f "$conf_file" ]; then
|
if [ ! -f "$conf_file" ]; then
|
||||||
@ -450,7 +450,7 @@ resolveDeviceMkspec()
|
|||||||
match_count=$(echo "$result" | wc -w)
|
match_count=$(echo "$result" | wc -w)
|
||||||
if [ "$match_count" -gt 1 ]; then
|
if [ "$match_count" -gt 1 ]; then
|
||||||
echo >&2 "Error: Multiple matches for device '$1'. Candidates are:"
|
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 >&2 "$tabbed_result"
|
||||||
echo "undefined"
|
echo "undefined"
|
||||||
elif [ "$match_count" -eq 0 ]; then
|
elif [ "$match_count" -eq 0 ]; then
|
||||||
@ -829,33 +829,33 @@ while [ "$#" -gt 0 ]; do
|
|||||||
case "$1" in
|
case "$1" in
|
||||||
#Autoconf style options
|
#Autoconf style options
|
||||||
--enable-*)
|
--enable-*)
|
||||||
VAR=`echo $1 | sed "s,^--enable-\(.*\),\1,"`
|
VAR=`echo $1 | sed 's,^--enable-\(.*\),\1,'`
|
||||||
VAL=yes
|
VAL=yes
|
||||||
;;
|
;;
|
||||||
--disable-*)
|
--disable-*)
|
||||||
VAR=`echo $1 | sed "s,^--disable-\(.*\),\1,"`
|
VAR=`echo $1 | sed 's,^--disable-\(.*\),\1,'`
|
||||||
VAL=no
|
VAL=no
|
||||||
;;
|
;;
|
||||||
--*=*)
|
--*=*)
|
||||||
VAR=`echo $1 | sed "s,^--\(.*\)=.*,\1,"`
|
VAR=`echo $1 | sed 's,^--\(.*\)=.*,\1,'`
|
||||||
VAL=`echo $1 | sed "s,^--.*=\(.*\),\1,"`
|
VAL=`echo $1 | sed 's,^--.*=\(.*\),\1,'`
|
||||||
;;
|
;;
|
||||||
--no-*)
|
--no-*)
|
||||||
VAR=`echo $1 | sed "s,^--no-\(.*\),\1,"`
|
VAR=`echo $1 | sed 's,^--no-\(.*\),\1,'`
|
||||||
VAL=no
|
VAL=no
|
||||||
;;
|
;;
|
||||||
--*)
|
--*)
|
||||||
VAR=`echo $1 | sed "s,^--\(.*\),\1,"`
|
VAR=`echo $1 | sed 's,^--\(.*\),\1,'`
|
||||||
VAL=yes
|
VAL=yes
|
||||||
;;
|
;;
|
||||||
#Qt plugin options
|
#Qt plugin options
|
||||||
-no-*-*|-plugin-*-*|-qt-*-*)
|
-no-*-*|-plugin-*-*|-qt-*-*)
|
||||||
VAR=`echo $1 | sed "s,^-[^-]*-\(.*\),\1,"`
|
VAR=`echo $1 | sed 's,^-[^-]*-\(.*\),\1,'`
|
||||||
VAL=`echo $1 | sed "s,^-\([^-]*\).*,\1,"`
|
VAL=`echo $1 | sed 's,^-\([^-]*\).*,\1,'`
|
||||||
;;
|
;;
|
||||||
#Qt style no options
|
#Qt style no options
|
||||||
-no-*)
|
-no-*)
|
||||||
VAR=`echo $1 | sed "s,^-no-\(.*\),\1,"`
|
VAR=`echo $1 | sed 's,^-no-\(.*\),\1,'`
|
||||||
VAL=no
|
VAL=no
|
||||||
;;
|
;;
|
||||||
#Qt style options that pass an argument
|
#Qt style options that pass an argument
|
||||||
@ -900,14 +900,14 @@ while [ "$#" -gt 0 ]; do
|
|||||||
-android-ndk-host| \
|
-android-ndk-host| \
|
||||||
-android-arch| \
|
-android-arch| \
|
||||||
-android-toolchain-version)
|
-android-toolchain-version)
|
||||||
VAR=`echo $1 | sed "s,^-\(.*\),\1,"`
|
VAR=`echo $1 | sed 's,^-\(.*\),\1,'`
|
||||||
shift
|
shift
|
||||||
VAL="$1"
|
VAL="$1"
|
||||||
;;
|
;;
|
||||||
#Qt style complex options in one command
|
#Qt style complex options in one command
|
||||||
-enable-*|-disable-*)
|
-enable-*|-disable-*)
|
||||||
VAR=`echo $1 | sed "s,^-\([^-]*\)-.*,\1,"`
|
VAR=`echo $1 | sed 's,^-\([^-]*\)-.*,\1,'`
|
||||||
VAL=`echo $1 | sed "s,^-[^-]*-\(.*\),\1,"`
|
VAL=`echo $1 | sed 's,^-[^-]*-\(.*\),\1,'`
|
||||||
;;
|
;;
|
||||||
-system-proxies)
|
-system-proxies)
|
||||||
VAR=system-proxies
|
VAR=system-proxies
|
||||||
@ -919,8 +919,8 @@ while [ "$#" -gt 0 ]; do
|
|||||||
;;
|
;;
|
||||||
#Qt Builtin/System style options
|
#Qt Builtin/System style options
|
||||||
-no-*|-system-*|-qt-*)
|
-no-*|-system-*|-qt-*)
|
||||||
VAR=`echo $1 | sed "s,^-[^-]*-\(.*\),\1,"`
|
VAR=`echo $1 | sed 's,^-[^-]*-\(.*\),\1,'`
|
||||||
VAL=`echo $1 | sed "s,^-\([^-]*\)-.*,\1,"`
|
VAL=`echo $1 | sed 's,^-\([^-]*\)-.*,\1,'`
|
||||||
;;
|
;;
|
||||||
#Options that cannot be generalized
|
#Options that cannot be generalized
|
||||||
-k|-continue)
|
-k|-continue)
|
||||||
@ -948,7 +948,7 @@ while [ "$#" -gt 0 ]; do
|
|||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
-hostprefix)
|
-hostprefix)
|
||||||
VAR=`echo $1 | sed "s,^-\(.*\),\1,"`
|
VAR=`echo $1 | sed 's,^-\(.*\),\1,'`
|
||||||
# this option may or may not be followed by an argument
|
# this option may or may not be followed by an argument
|
||||||
if [ -z "$2" ] || echo "$2" | grep '^-' >/dev/null 2>&1; then
|
if [ -z "$2" ] || echo "$2" | grep '^-' >/dev/null 2>&1; then
|
||||||
VAL=$outpath
|
VAL=$outpath
|
||||||
@ -1038,7 +1038,7 @@ while [ "$#" -gt 0 ]; do
|
|||||||
;;
|
;;
|
||||||
#General options, including Qt style yes options
|
#General options, including Qt style yes options
|
||||||
-*)
|
-*)
|
||||||
VAR=`echo $1 | sed "s,^-\(.*\),\1,"`
|
VAR=`echo $1 | sed 's,^-\(.*\),\1,'`
|
||||||
VAL="yes"
|
VAL="yes"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
@ -1396,7 +1396,7 @@ while [ "$#" -gt 0 ]; do
|
|||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
feature-*)
|
feature-*)
|
||||||
FEATURE=`echo $VAR | sed "s,^[^-]*-\([^-]*\),\1," | tr 'abcdefghijklmnopqrstuvwxyz-' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
|
FEATURE=`echo $VAR | sed 's,^[^-]*-\([^-]*\),\1,' | tr 'abcdefghijklmnopqrstuvwxyz-' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
|
||||||
if [ "$VAL" = "no" ]; then
|
if [ "$VAL" = "no" ]; then
|
||||||
QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_$FEATURE"
|
QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_$FEATURE"
|
||||||
elif [ "$VAL" = "yes" ] || [ "$VAL" = "unknown" ]; then
|
elif [ "$VAL" = "yes" ] || [ "$VAL" = "unknown" ]; then
|
||||||
@ -1908,8 +1908,8 @@ while [ "$#" -gt 0 ]; do
|
|||||||
fi
|
fi
|
||||||
# now $VAL is "no", "qt", or "plugin"
|
# now $VAL is "no", "qt", or "plugin"
|
||||||
OPT="$VAL"
|
OPT="$VAL"
|
||||||
VAL=`echo $VAR | sed "s,^[^-]*-\([^-]*\).*,\1,"`
|
VAL=`echo $VAR | sed 's,^[^-]*-\([^-]*\).*,\1,'`
|
||||||
VAR=`echo $VAR | sed "s,^\([^-]*\).*,\1,"`
|
VAR=`echo $VAR | sed 's,^\([^-]*\).*,\1,'`
|
||||||
|
|
||||||
# Grab the available values
|
# Grab the available values
|
||||||
case "$VAR" in
|
case "$VAR" in
|
||||||
@ -1975,7 +1975,7 @@ while [ "$#" -gt 0 ]; do
|
|||||||
fi
|
fi
|
||||||
elif [ "$VAL" = "no" ]; then
|
elif [ "$VAL" = "no" ]; then
|
||||||
if [ "$OPT_VERBOSE" = "$VAL" ] && echo "$QMAKE_SWITCHES" | grep ' -d' >/dev/null 2>&1; 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
|
else
|
||||||
OPT_VERBOSE=no
|
OPT_VERBOSE=no
|
||||||
fi
|
fi
|
||||||
@ -3047,7 +3047,7 @@ elif [ "$Edition" = "Preview" ]; then
|
|||||||
done
|
done
|
||||||
elif [ "$Edition" != "OpenSource" ]; then
|
elif [ "$Edition" != "OpenSource" ]; then
|
||||||
if [ -n "$ExpiryDate" ]; 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"
|
[ -z "$ExpiryDate" ] && ExpiryDate="0"
|
||||||
Today=`date +%Y%m%d`
|
Today=`date +%Y%m%d`
|
||||||
if [ "$Today" -gt "$ExpiryDate" ]; then
|
if [ "$Today" -gt "$ExpiryDate" ]; then
|
||||||
@ -3510,7 +3510,7 @@ function normalize(dir)
|
|||||||
{
|
{
|
||||||
do {
|
do {
|
||||||
odir = dir
|
odir = dir
|
||||||
gsub(/\/[^\/]+\/\.\./, "", dir)
|
sub(/\/[^\/]+\/\.\./, "", dir)
|
||||||
} while (dir != odir);
|
} while (dir != odir);
|
||||||
do {
|
do {
|
||||||
odir = dir
|
odir = dir
|
||||||
@ -3566,7 +3566,7 @@ if [ -z "$CFG_BUILD_PARTS" ]; then
|
|||||||
|
|
||||||
# don't build tools by default when cross-compiling
|
# don't build tools by default when cross-compiling
|
||||||
if [ "$PLATFORM" != "$XPLATFORM" ]; then
|
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
|
||||||
fi
|
fi
|
||||||
for nobuild in $CFG_NOBUILD_PARTS; do
|
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
|
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
|
(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"
|
sed "s,$outpath,$adjoutpath,g" "$mkfile.tmp" >"$mkfile"
|
||||||
rm "$mkfile.tmp"
|
rm "$mkfile.tmp"
|
||||||
fi
|
fi
|
||||||
@ -4155,7 +4155,7 @@ compileTest()
|
|||||||
|
|
||||||
# Use config.tests/arch/arch.pro to have the compiler tell us what the target architecture is
|
# Use config.tests/arch/arch.pro to have the compiler tell us what the target architecture is
|
||||||
OUTFILE=$outpath/arch.result
|
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
|
if [ $? -eq 0 ]; then
|
||||||
eval `cat "$OUTFILE"`
|
eval `cat "$OUTFILE"`
|
||||||
else
|
else
|
||||||
@ -4168,7 +4168,7 @@ rm -f "$OUTFILE" 2>/dev/null
|
|||||||
|
|
||||||
if [ "$QMAKESPEC" != "$XQMAKESPEC" ]; then
|
if [ "$QMAKESPEC" != "$XQMAKESPEC" ]; then
|
||||||
# Do the same test again, using the host compiler
|
# 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
|
if [ $? -eq 0 ]; then
|
||||||
eval `cat "$OUTFILE"`
|
eval `cat "$OUTFILE"`
|
||||||
else
|
else
|
||||||
@ -5118,6 +5118,42 @@ if compileTest x11/xlib "XLib"; then
|
|||||||
QT_CONFIG="$QT_CONFIG xlib"
|
QT_CONFIG="$QT_CONFIG xlib"
|
||||||
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
|
||||||
|
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 [ "$CFG_XCB" != "no" ]; then
|
||||||
if [ -n "$PKG_CONFIG" ] && $PKG_CONFIG --exists "xcb >= 1.5" 2>/dev/null; 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`"
|
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"
|
QT_CONFIG="$QT_CONFIG xcb-sm"
|
||||||
fi
|
fi
|
||||||
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
|
else
|
||||||
if [ "$CFG_XCB" != "auto" ]; then
|
if [ "$CFG_XCB" != "auto" ]; then
|
||||||
echo "The test for linking against libxcb failed!"
|
echo "The test for linking against libxcb failed!"
|
||||||
@ -6319,10 +6319,10 @@ EOF
|
|||||||
cfgdNeg=
|
cfgdNeg=
|
||||||
if [ true ] && echo "$cfgd" | grep 'QT_NO_' >/dev/null 2>&1; then
|
if [ true ] && echo "$cfgd" | grep 'QT_NO_' >/dev/null 2>&1; then
|
||||||
# QT_NO_option can be forcefully turned on by QT_option
|
# 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
|
elif [ true ] && echo "$cfgd" | grep 'QT_' >/dev/null 2>&1; then
|
||||||
# QT_option can be forcefully turned off by QT_NO_option
|
# 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
|
fi
|
||||||
|
|
||||||
if [ -z $cfgdNeg ]; then
|
if [ -z $cfgdNeg ]; then
|
||||||
|
@ -30,6 +30,7 @@ Cpp.ignoretokens += \
|
|||||||
Q_DECL_DEPRECATED \
|
Q_DECL_DEPRECATED \
|
||||||
Q_DECL_NOEXCEPT \
|
Q_DECL_NOEXCEPT \
|
||||||
Q_DECL_NOTHROW \
|
Q_DECL_NOTHROW \
|
||||||
|
Q_DECL_UNUSED \
|
||||||
Q_DECLARATIVE_EXPORT \
|
Q_DECLARATIVE_EXPORT \
|
||||||
Q_EXPLICIT \
|
Q_EXPLICIT \
|
||||||
Q_EXPORT \
|
Q_EXPORT \
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
\example effects/fademessage
|
\example effects/fademessage
|
||||||
\title Fade Message Effect Example
|
\title Fade Message Effect Example
|
||||||
\ingroup examples-graphicsview-graphicseffects
|
\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"}
|
\div { style="text-align: left"}
|
||||||
\inlineimage fademessageeffect-example.png
|
\inlineimage fademessageeffect-example.png
|
||||||
|
@ -72,7 +72,7 @@ QEglFSImx6Hooks::QEglFSImx6Hooks()
|
|||||||
qputenv("FB_MULTI_BUFFER", "2");
|
qputenv("FB_MULTI_BUFFER", "2");
|
||||||
}
|
}
|
||||||
|
|
||||||
mNativeDisplay = fbGetDisplayByIndex(0);
|
mNativeDisplay = fbGetDisplayByIndex(framebufferIndex());
|
||||||
fbGetDisplayGeometry(mNativeDisplay, &width, &height);
|
fbGetDisplayGeometry(mNativeDisplay, &width, &height);
|
||||||
mScreenSize.setHeight(height);
|
mScreenSize.setHeight(height);
|
||||||
mScreenSize.setWidth(width);
|
mScreenSize.setWidth(width);
|
||||||
|
@ -8,4 +8,7 @@ contains(TEMPLATE, ".*app") {
|
|||||||
INSTALLS *= target
|
INSTALLS *= target
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else: contains(TEMPLATE, "lib"):!QTDIR_build:android_install {
|
||||||
|
target.path = /libs/$$ANDROID_TARGET_ARCH/
|
||||||
|
INSTALLS *= target
|
||||||
}
|
}
|
||||||
|
@ -97,6 +97,7 @@ probase = $$relative_path($$_PRO_FILE_PWD_, $$dirname(_QMAKE_CONF_)/examples)
|
|||||||
TEMPLATE = aux
|
TEMPLATE = aux
|
||||||
CONFIG -= have_target qt staticlib dll
|
CONFIG -= have_target qt staticlib dll
|
||||||
SOURCES =
|
SOURCES =
|
||||||
|
OBJECTIVE_SOURCES =
|
||||||
INSTALLS -= target
|
INSTALLS -= target
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -174,10 +174,19 @@ QT_CPU_FEATURES = $$eval(QT_CPU_FEATURES.$$QT_ARCH)
|
|||||||
mips_dsp_assembler.name = assembling[mips_dsp] ${QMAKE_FILE_IN}
|
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
|
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_compiler
|
||||||
|
QMAKE_EXTRA_COMPILERS += mips_dsp_assembler
|
||||||
}
|
}
|
||||||
mips_dspr2 {
|
mips_dspr2 {
|
||||||
HEADERS += $$MIPS_DSP_HEADERS
|
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 = $$QMAKE_CC -c
|
||||||
mips_dspr2_assembler.commands += $(CFLAGS) $(INCPATH) ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
|
mips_dspr2_assembler.commands += $(CFLAGS) $(INCPATH) ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
|
||||||
mips_dspr2_assembler.dependency_type = TYPE_C
|
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.variable_out = OBJECTS
|
||||||
mips_dspr2_assembler.name = assembling[mips_dspr2] ${QMAKE_FILE_IN}
|
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
|
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
|
QMAKE_EXTRA_COMPILERS += mips_dspr2_assembler
|
||||||
}
|
}
|
||||||
} else:win32-msvc*|winrt {
|
} else:win32-msvc*|winrt {
|
||||||
@ -297,7 +307,7 @@ QT_CPU_FEATURES = $$eval(QT_CPU_FEATURES.$$QT_ARCH)
|
|||||||
$$AVX_SOURCES $$AVX2_SOURCES \
|
$$AVX_SOURCES $$AVX2_SOURCES \
|
||||||
$$NEON_SOURCES $$NEON_ASM \
|
$$NEON_SOURCES $$NEON_ASM \
|
||||||
$$IWMMXT_SOURCES \
|
$$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.
|
# Headers are already done in the above sections.
|
||||||
}
|
}
|
||||||
|
@ -65,7 +65,6 @@ depends += \
|
|||||||
qtsvg \
|
qtsvg \
|
||||||
qtsysteminfo \
|
qtsysteminfo \
|
||||||
qttestlib \
|
qttestlib \
|
||||||
qttools \
|
|
||||||
qtuitools \
|
qtuitools \
|
||||||
qtversit \
|
qtversit \
|
||||||
qtwebkit \
|
qtwebkit \
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
#include "msvc_objectmodel.h"
|
#include "msvc_objectmodel.h"
|
||||||
#include "msvc_vcproj.h"
|
#include "msvc_vcproj.h"
|
||||||
#include "msvc_vcxproj.h"
|
#include "msvc_vcxproj.h"
|
||||||
|
#include <qscopedpointer.h>
|
||||||
#include <qstringlist.h>
|
#include <qstringlist.h>
|
||||||
#include <qfileinfo.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
|
// outputs a given filter for all existing configurations of a project
|
||||||
void VCXProjectWriter::outputFilter(VCProject &project, XmlOutput &xml, XmlOutput &xmlFilter, const QString &filtername)
|
void VCXProjectWriter::outputFilter(VCProject &project, XmlOutput &xml, XmlOutput &xmlFilter, const QString &filtername)
|
||||||
{
|
{
|
||||||
XNode *root;
|
QScopedPointer<XNode> root;
|
||||||
if (project.SingleProjects.at(0).flat_files)
|
if (project.SingleProjects.at(0).flat_files)
|
||||||
root = new XFlatNode;
|
root.reset(new XFlatNode);
|
||||||
else
|
else
|
||||||
root = new XTreeNode;
|
root.reset(new XTreeNode);
|
||||||
|
|
||||||
for (int i = 0; i < project.SingleProjects.count(); ++i) {
|
for (int i = 0; i < project.SingleProjects.count(); ++i) {
|
||||||
VCFilter filter;
|
VCFilter filter;
|
||||||
|
@ -42,6 +42,7 @@
|
|||||||
#include "msvc_objectmodel.h"
|
#include "msvc_objectmodel.h"
|
||||||
#include "msvc_vcproj.h"
|
#include "msvc_vcproj.h"
|
||||||
#include "msvc_vcxproj.h"
|
#include "msvc_vcxproj.h"
|
||||||
|
#include <qscopedpointer.h>
|
||||||
#include <qstringlist.h>
|
#include <qstringlist.h>
|
||||||
#include <qfileinfo.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
|
// outputs a given filter for all existing configurations of a project
|
||||||
void VCProjectWriter::outputFilter(VCProject &project, XmlOutput &xml, const QString &filtername)
|
void VCProjectWriter::outputFilter(VCProject &project, XmlOutput &xml, const QString &filtername)
|
||||||
{
|
{
|
||||||
Node *root;
|
QScopedPointer<Node> root;
|
||||||
if (project.SingleProjects.at(0).flat_files)
|
if (project.SingleProjects.at(0).flat_files)
|
||||||
root = new FlatNode;
|
root.reset(new FlatNode);
|
||||||
else
|
else
|
||||||
root = new TreeNode;
|
root.reset(new TreeNode);
|
||||||
|
|
||||||
QString name, extfilter, guid;
|
QString name, extfilter, guid;
|
||||||
triState parse = unset;
|
triState parse = unset;
|
||||||
|
@ -889,30 +889,9 @@ void QMakeEvaluator::visitProVariable(
|
|||||||
default: // whatever - cannot happen
|
default: // whatever - cannot happen
|
||||||
case TokAssign: // =
|
case TokAssign: // =
|
||||||
zipEmpty(&varVal);
|
zipEmpty(&varVal);
|
||||||
if (!m_cumulative) {
|
// FIXME: add check+warning about accidental value removal.
|
||||||
// FIXME: add check+warning about accidental value removal.
|
// This may be a bit too noisy, though.
|
||||||
// This may be a bit too noisy, though.
|
m_valuemapStack.top()[varName] = varVal;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
debugMsg(2, "assigning");
|
debugMsg(2, "assigning");
|
||||||
break;
|
break;
|
||||||
case TokAppendUnique: // *=
|
case TokAppendUnique: // *=
|
||||||
@ -928,7 +907,7 @@ void QMakeEvaluator::visitProVariable(
|
|||||||
if (!m_cumulative) {
|
if (!m_cumulative) {
|
||||||
removeEach(&valuesRef(varName), varVal);
|
removeEach(&valuesRef(varName), varVal);
|
||||||
} else {
|
} else {
|
||||||
// We are stingy with our values, too.
|
// We are stingy with our values.
|
||||||
}
|
}
|
||||||
debugMsg(2, "removing");
|
debugMsg(2, "removing");
|
||||||
break;
|
break;
|
||||||
@ -1850,14 +1829,12 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateFile(
|
|||||||
VisitReturn ok = visitProFile(pro, type, flags);
|
VisitReturn ok = visitProFile(pro, type, flags);
|
||||||
m_current = m_locationStack.pop();
|
m_current = m_locationStack.pop();
|
||||||
pro->deref();
|
pro->deref();
|
||||||
#ifdef PROEVALUATOR_FULL
|
|
||||||
if (ok == ReturnTrue && !(flags & LoadHidden)) {
|
if (ok == ReturnTrue && !(flags & LoadHidden)) {
|
||||||
ProStringList &iif = m_valuemapStack.first()[ProKey("QMAKE_INTERNAL_INCLUDED_FILES")];
|
ProStringList &iif = m_valuemapStack.first()[ProKey("QMAKE_INTERNAL_INCLUDED_FILES")];
|
||||||
ProString ifn(fileName);
|
ProString ifn(fileName);
|
||||||
if (!iif.contains(ifn))
|
if (!iif.contains(ifn))
|
||||||
iif << ifn;
|
iif << ifn;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
return ok;
|
return ok;
|
||||||
} else {
|
} else {
|
||||||
return ReturnFalse;
|
return ReturnFalse;
|
||||||
@ -1970,13 +1947,11 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateFileInto(
|
|||||||
if (ret != ReturnTrue)
|
if (ret != ReturnTrue)
|
||||||
return ret;
|
return ret;
|
||||||
*values = visitor.m_valuemapStack.top();
|
*values = visitor.m_valuemapStack.top();
|
||||||
#ifdef PROEVALUATOR_FULL
|
|
||||||
ProKey qiif("QMAKE_INTERNAL_INCLUDED_FILES");
|
ProKey qiif("QMAKE_INTERNAL_INCLUDED_FILES");
|
||||||
ProStringList &iif = m_valuemapStack.first()[qiif];
|
ProStringList &iif = m_valuemapStack.first()[qiif];
|
||||||
foreach (const ProString &ifn, values->value(qiif))
|
foreach (const ProString &ifn, values->value(qiif))
|
||||||
if (!iif.contains(ifn))
|
if (!iif.contains(ifn))
|
||||||
iif << ifn;
|
iif << ifn;
|
||||||
#endif
|
|
||||||
return ReturnTrue;
|
return ReturnTrue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,6 +34,7 @@ import java.io.FileOutputStream;
|
|||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.DataOutputStream;
|
import java.io.DataOutputStream;
|
||||||
import java.io.DataInputStream;
|
import java.io.DataInputStream;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@ -816,6 +817,21 @@ public class QtActivity extends Activity
|
|||||||
public void onCreate(Bundle savedInstanceState)
|
public void onCreate(Bundle savedInstanceState)
|
||||||
{
|
{
|
||||||
super.onCreate(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 {
|
try {
|
||||||
setTheme(Class.forName("android.R$style").getDeclaredField(QT_ANDROID_DEFAULT_THEME).getInt(null));
|
setTheme(Class.forName("android.R$style").getDeclaredField(QT_ANDROID_DEFAULT_THEME).getInt(null));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@ -840,14 +856,6 @@ public class QtActivity extends Activity
|
|||||||
ENVIRONMENT_VARIABLES += "\tQT_ANDROID_THEME=" + QT_ANDROID_DEFAULT_THEME
|
ENVIRONMENT_VARIABLES += "\tQT_ANDROID_THEME=" + QT_ANDROID_DEFAULT_THEME
|
||||||
+ "/\tQT_ANDROID_THEME_DISPLAY_DPI=" + getResources().getDisplayMetrics().densityDpi + "\t";
|
+ "/\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 (null == getLastNonConfigurationInstance()) {
|
||||||
// if splash screen is defined, then show it
|
// if splash screen is defined, then show it
|
||||||
if (m_activityInfo.metaData.containsKey("android.app.splash_screen") )
|
if (m_activityInfo.metaData.containsKey("android.app.splash_screen") )
|
||||||
|
@ -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
|
ctest_qt5_module_files.path = $$[QT_INSTALL_LIBS]/cmake/Qt5Core
|
||||||
|
|
||||||
INSTALLS += ctest_qt5_module_files cmake_qt5_umbrella_module_files
|
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
|
||||||
|
}
|
||||||
|
@ -256,7 +256,7 @@
|
|||||||
# if defined(__EDG__)
|
# if defined(__EDG__)
|
||||||
# define Q_CC_EDG
|
# define Q_CC_EDG
|
||||||
# endif
|
# 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.
|
- observed on Compaq C++ V6.3-002.
|
||||||
In any case versions prior to Compaq C++ V6.0-005 do not have bool. */
|
In any case versions prior to Compaq C++ V6.0-005 do not have bool. */
|
||||||
# if !defined(_BOOL_EXISTS)
|
# if !defined(_BOOL_EXISTS)
|
||||||
@ -794,13 +794,13 @@
|
|||||||
# define Q_COMPILER_DECLTYPE
|
# define Q_COMPILER_DECLTYPE
|
||||||
# define Q_COMPILER_RVALUE_REFS
|
# define Q_COMPILER_RVALUE_REFS
|
||||||
# define Q_COMPILER_STATIC_ASSERT
|
# 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_INITIALIZER_LISTS
|
||||||
//# define Q_COMPILER_UNIFORM_INIT
|
//# define Q_COMPILER_UNIFORM_INIT
|
||||||
# endif
|
# endif
|
||||||
# if _MSC_VER >= 1700
|
# if _MSC_VER >= 1700
|
||||||
/* C++11 features supported in VC11 = VC2012: */
|
/* 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... */
|
# undef Q_DECL_FINAL /* undo 2005/2008 settings... */
|
||||||
# define Q_COMPILER_EXPLICIT_OVERRIDES /* ...and use std C++11 now */
|
# define Q_COMPILER_EXPLICIT_OVERRIDES /* ...and use std C++11 now */
|
||||||
# define Q_COMPILER_RANGE_FOR
|
# define Q_COMPILER_RANGE_FOR
|
||||||
|
@ -829,18 +829,18 @@ Q_CORE_EXPORT void qFreeAligned(void *ptr);
|
|||||||
#endif
|
#endif
|
||||||
#if defined(QT_NO_WARNINGS)
|
#if defined(QT_NO_WARNINGS)
|
||||||
# if defined(Q_CC_MSVC)
|
# 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: 4251) /* class 'type' needs to have dll-interface to be used by clients of class 'type2' */
|
||||||
# pragma warning(disable: 4244) /* 'conversion' conversion from 'type1' to 'type2', possible loss of data */
|
# 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: 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: 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: 4097) /* typedef-name 'identifier1' used as synonym for class-name 'identifier2' */
|
||||||
# pragma warning(disable: 4706) /* assignment within conditional expression */
|
# 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: 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: 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)
|
# elif defined(Q_CC_BOR)
|
||||||
# pragma option -w-inl
|
# pragma option -w-inl
|
||||||
# pragma option -w-aus
|
# pragma option -w-aus
|
||||||
|
@ -102,7 +102,7 @@ static inline bool hasStdErr()
|
|||||||
}
|
}
|
||||||
# endif // !Q_OS_WINCE && !Q_OS_WINRT
|
# endif // !Q_OS_WINCE && !Q_OS_WINRT
|
||||||
|
|
||||||
bool qWinLogToStderr()
|
Q_CORE_EXPORT bool qWinLogToStderr()
|
||||||
{
|
{
|
||||||
# if !defined(Q_OS_WINCE) && !defined(Q_OS_WINRT)
|
# if !defined(Q_OS_WINCE) && !defined(Q_OS_WINRT)
|
||||||
static const bool result = hasStdErr();
|
static const bool result = hasStdErr();
|
||||||
|
@ -144,6 +144,8 @@ win32 {
|
|||||||
}
|
}
|
||||||
} else:blackberry {
|
} else:blackberry {
|
||||||
SOURCES += io/qstandardpaths_blackberry.cpp
|
SOURCES += io/qstandardpaths_blackberry.cpp
|
||||||
|
} else:android {
|
||||||
|
SOURCES += io/qstandardpaths_android.cpp
|
||||||
} else {
|
} else {
|
||||||
SOURCES += io/qstandardpaths_unix.cpp
|
SOURCES += io/qstandardpaths_unix.cpp
|
||||||
}
|
}
|
||||||
|
@ -855,7 +855,7 @@ QString QDir::fromNativeSeparators(const QString &pathName)
|
|||||||
/*!
|
/*!
|
||||||
Changes the QDir's directory to \a dirName.
|
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
|
otherwise returns \c false. Note that the logical cd() operation is
|
||||||
not performed if the new directory does not exist.
|
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
|
Changes directory by moving one directory up from the QDir's
|
||||||
current directory.
|
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
|
otherwise returns \c false. Note that the logical cdUp() operation is
|
||||||
not performed if the new directory does not exist.
|
not performed if the new directory does not exist.
|
||||||
|
|
||||||
|
@ -571,6 +571,8 @@ QFile::rename(const QString &newName)
|
|||||||
d->setError(QFile::RenameError, tr("Destination file exists"));
|
d->setError(QFile::RenameError, tr("Destination file exists"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
#ifndef QT_NO_TEMPORARYFILE
|
||||||
|
// This #ifndef disables the workaround it encloses. Therefore, this configuration is not recommended.
|
||||||
#ifdef Q_OS_LINUX
|
#ifdef Q_OS_LINUX
|
||||||
// rename() on Linux simply does nothing when renaming "foo" to "Foo" on a case-insensitive
|
// 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.
|
// 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()));
|
arg(QDir::toNativeSeparators(tempFile.fileName()), tempFile.errorString()));
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif // Q_OS_LINUX
|
||||||
|
#endif // QT_NO_TEMPORARYFILE
|
||||||
}
|
}
|
||||||
unsetError();
|
unsetError();
|
||||||
close();
|
close();
|
||||||
|
@ -77,6 +77,7 @@ QFileSystemWatcherEngine *QFileSystemWatcherPrivate::createNativeEngine(QObject
|
|||||||
#elif defined(Q_OS_FREEBSD) || defined(Q_OS_MAC)
|
#elif defined(Q_OS_FREEBSD) || defined(Q_OS_MAC)
|
||||||
return QKqueueFileSystemWatcherEngine::create(parent);
|
return QKqueueFileSystemWatcherEngine::create(parent);
|
||||||
#else
|
#else
|
||||||
|
Q_UNUSED(parent);
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
331
src/corelib/io/qstandardpaths_android.cpp
Normal file
331
src/corelib/io/qstandardpaths_android.cpp
Normal 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
|
@ -3437,7 +3437,7 @@ QString QUrl::fromAce(const QByteArray &domain)
|
|||||||
(like \c "example.com") to be written using international
|
(like \c "example.com") to be written using international
|
||||||
characters.
|
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
|
hostname. Note, in particular, that IPv6 literals are not valid domain
|
||||||
names.
|
names.
|
||||||
*/
|
*/
|
||||||
|
@ -2334,6 +2334,31 @@ void QAbstractItemModel::doSetRoleNames(const QHash<int,QByteArray> &roleNames)
|
|||||||
|
|
||||||
Returns the model's role names.
|
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
|
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
|
of the rowCount() and data() functions. Well behaved models also provide
|
||||||
a headerData() implementation.
|
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
|
For editable list models, you must also provide an implementation of
|
||||||
setData(), implement the flags() function so that it returns a value
|
setData(), implement the flags() function so that it returns a value
|
||||||
containing \l{Qt::ItemFlags}{Qt::ItemIsEditable}.
|
containing \l{Qt::ItemFlags}{Qt::ItemIsEditable}.
|
||||||
|
@ -46,6 +46,7 @@ QT_BEGIN_NAMESPACE
|
|||||||
static JavaVM *g_javaVM = Q_NULLPTR;
|
static JavaVM *g_javaVM = Q_NULLPTR;
|
||||||
static jobject g_jActivity = Q_NULLPTR;
|
static jobject g_jActivity = Q_NULLPTR;
|
||||||
static jobject g_jClassLoader = Q_NULLPTR;
|
static jobject g_jClassLoader = Q_NULLPTR;
|
||||||
|
static jint g_androidSdkVersion = 0;
|
||||||
|
|
||||||
static inline bool exceptionCheck(JNIEnv *env)
|
static inline bool exceptionCheck(JNIEnv *env)
|
||||||
{
|
{
|
||||||
@ -60,6 +61,19 @@ static inline bool exceptionCheck(JNIEnv *env)
|
|||||||
return false;
|
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)
|
jint QtAndroidPrivate::initJNI(JavaVM *vm, JNIEnv *env)
|
||||||
{
|
{
|
||||||
jclass jQtNative = env->FindClass("org/qtproject/qt5/android/QtNative");
|
jclass jQtNative = env->FindClass("org/qtproject/qt5/android/QtNative");
|
||||||
@ -93,6 +107,8 @@ jint QtAndroidPrivate::initJNI(JavaVM *vm, JNIEnv *env)
|
|||||||
if (exceptionCheck(env))
|
if (exceptionCheck(env))
|
||||||
return JNI_ERR;
|
return JNI_ERR;
|
||||||
|
|
||||||
|
setAndroidSdkVersion(env);
|
||||||
|
|
||||||
g_jClassLoader = env->NewGlobalRef(classLoader);
|
g_jClassLoader = env->NewGlobalRef(classLoader);
|
||||||
env->DeleteLocalRef(classLoader);
|
env->DeleteLocalRef(classLoader);
|
||||||
g_jActivity = env->NewGlobalRef(activity);
|
g_jActivity = env->NewGlobalRef(activity);
|
||||||
@ -118,4 +134,9 @@ jobject QtAndroidPrivate::classLoader()
|
|||||||
return g_jClassLoader;
|
return g_jClassLoader;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jint QtAndroidPrivate::androidSdkVersion()
|
||||||
|
{
|
||||||
|
return g_androidSdkVersion;
|
||||||
|
}
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -64,6 +64,7 @@ namespace QtAndroidPrivate
|
|||||||
Q_CORE_EXPORT JavaVM *javaVM();
|
Q_CORE_EXPORT JavaVM *javaVM();
|
||||||
Q_CORE_EXPORT jint initJNI(JavaVM *vm, JNIEnv *env);
|
Q_CORE_EXPORT jint initJNI(JavaVM *vm, JNIEnv *env);
|
||||||
jobject classLoader();
|
jobject classLoader();
|
||||||
|
jint androidSdkVersion();
|
||||||
}
|
}
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -2180,7 +2180,9 @@ void QObject::deleteLater()
|
|||||||
|
|
||||||
const char *qFlagLocation(const char *method)
|
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;
|
return method;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3553,8 +3555,11 @@ void QMetaObject::activate(QObject *sender, int signalOffset, int local_signal_i
|
|||||||
{
|
{
|
||||||
int signal_index = signalOffset + local_signal_index;
|
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
|
return; // nothing connected to these signals, and no spy
|
||||||
|
}
|
||||||
|
|
||||||
if (sender->d_func()->blockSig)
|
if (sender->d_func()->blockSig)
|
||||||
return;
|
return;
|
||||||
|
@ -247,7 +247,7 @@ public:
|
|||||||
|
|
||||||
Returns \c true if the signal with index \a signal_index from object \a sender is connected.
|
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
|
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;
|
\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
|
return signal_index >= sizeof(connectedSignals) * 8
|
||||||
|| (connectedSignals[signal_index >> 5] & (1 << (signal_index & 0x1f))
|
|| (connectedSignals[signal_index >> 5] & (1 << (signal_index & 0x1f))
|
||||||
|| (declarativeData && QAbstractDeclarativeData::isSignalConnected
|
|| (declarativeData && QAbstractDeclarativeData::isSignalConnected
|
||||||
&& QAbstractDeclarativeData::isSignalConnected(declarativeData, q_func(), signal_index))
|
&& QAbstractDeclarativeData::isSignalConnected(declarativeData, q_func(), signal_index)));
|
||||||
|| qt_signal_spy_callback_set.signal_begin_callback
|
|
||||||
|| qt_signal_spy_callback_set.signal_end_callback);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline QObjectPrivate::Sender *QObjectPrivate::setCurrentSender(QObject *receiver,
|
inline QObjectPrivate::Sender *QObjectPrivate::setCurrentSender(QObject *receiver,
|
||||||
|
@ -232,7 +232,7 @@ public:
|
|||||||
QThreadData(int initialRefCount = 1);
|
QThreadData(int initialRefCount = 1);
|
||||||
~QThreadData();
|
~QThreadData();
|
||||||
|
|
||||||
static QThreadData *current();
|
static QThreadData *current(bool createIfNecessary = true);
|
||||||
static void clearCurrentThreadData();
|
static void clearCurrentThreadData();
|
||||||
static QThreadData *get2(QThread *thread)
|
static QThreadData *get2(QThread *thread)
|
||||||
{ Q_ASSERT_X(thread != 0, "QThread", "internal error"); return thread->d_func()->data; }
|
{ Q_ASSERT_X(thread != 0, "QThread", "internal error"); return thread->d_func()->data; }
|
||||||
|
@ -215,10 +215,10 @@ void QThreadData::clearCurrentThreadData()
|
|||||||
clear_thread_data();
|
clear_thread_data();
|
||||||
}
|
}
|
||||||
|
|
||||||
QThreadData *QThreadData::current()
|
QThreadData *QThreadData::current(bool createIfNecessary)
|
||||||
{
|
{
|
||||||
QThreadData *data = get_thread_data();
|
QThreadData *data = get_thread_data();
|
||||||
if (!data) {
|
if (!data && createIfNecessary) {
|
||||||
data = new QThreadData;
|
data = new QThreadData;
|
||||||
QT_TRY {
|
QT_TRY {
|
||||||
set_thread_data(data);
|
set_thread_data(data);
|
||||||
|
@ -141,11 +141,11 @@ void QThreadData::clearCurrentThreadData()
|
|||||||
TlsSetValue(qt_current_thread_data_tls_index, 0);
|
TlsSetValue(qt_current_thread_data_tls_index, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
QThreadData *QThreadData::current()
|
QThreadData *QThreadData::current(bool createIfNecessary)
|
||||||
{
|
{
|
||||||
qt_create_tls();
|
qt_create_tls();
|
||||||
QThreadData *threadData = reinterpret_cast<QThreadData *>(TlsGetValue(qt_current_thread_data_tls_index));
|
QThreadData *threadData = reinterpret_cast<QThreadData *>(TlsGetValue(qt_current_thread_data_tls_index));
|
||||||
if (!threadData) {
|
if (!threadData && createIfNecessary) {
|
||||||
threadData = new QThreadData;
|
threadData = new QThreadData;
|
||||||
// This needs to be called prior to new AdoptedThread() to
|
// This needs to be called prior to new AdoptedThread() to
|
||||||
// avoid recursion.
|
// avoid recursion.
|
||||||
|
@ -720,7 +720,8 @@ QStringList QCommandLineParser::values(const QString &optionName) const
|
|||||||
*/
|
*/
|
||||||
bool QCommandLineParser::isSet(const QCommandLineOption &option) 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());
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -1284,6 +1284,11 @@ QDate QDate::fromString(const QString& string, Qt::DateFormat format)
|
|||||||
}
|
}
|
||||||
#endif // QT_NO_TEXTDATE
|
#endif // QT_NO_TEXTDATE
|
||||||
case Qt::ISODate: {
|
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();
|
const int year = string.mid(0, 4).toInt();
|
||||||
if (year <= 0 || year > 9999)
|
if (year <= 0 || year > 9999)
|
||||||
return QDate();
|
return QDate();
|
||||||
@ -1900,7 +1905,7 @@ int QTime::msecsTo(const QTime &t) const
|
|||||||
|
|
||||||
#ifndef QT_NO_DATESTRING
|
#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)
|
if (isMidnight24)
|
||||||
*isMidnight24 = false;
|
*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
|
// 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
|
// 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.
|
// 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)
|
if (!ok)
|
||||||
return QTime();
|
return QTime();
|
||||||
|
const float minuteFraction = double(minuteFractionInt) / (std::pow(double(10), minuteFractionStr.count()));
|
||||||
|
|
||||||
const float secondWithMs = minuteFraction * 60;
|
const float secondWithMs = minuteFraction * 60;
|
||||||
const float secondNoMs = std::floor(secondWithMs);
|
const float secondNoMs = std::floor(secondWithMs);
|
||||||
const float secondFraction = secondWithMs - secondNoMs;
|
const float secondFraction = secondWithMs - secondNoMs;
|
||||||
@ -1947,9 +1956,11 @@ static QTime fromIsoTimeString(const QString &string, Qt::DateFormat format, boo
|
|||||||
if (!ok)
|
if (!ok)
|
||||||
return QTime();
|
return QTime();
|
||||||
if (size > 8 && (string.at(8) == QLatin1Char(',') || string.at(8) == QLatin1Char('.'))) {
|
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)
|
if (!ok)
|
||||||
return QTime();
|
return QTime();
|
||||||
|
const double secondFraction(msecInt / (std::pow(double(10), msecStr.count())));
|
||||||
msec = qMin(qRound(secondFraction * 1000.0), 999);
|
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::ISODate:
|
||||||
case Qt::TextDate:
|
case Qt::TextDate:
|
||||||
default:
|
default:
|
||||||
return fromIsoTimeString(string, format, 0);
|
return fromIsoTimeString(&string, format, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2767,6 +2778,15 @@ void QDateTimePrivate::refreshDateTime()
|
|||||||
return;
|
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
|
// 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
|
// LocalTime and TimeZone might fall into "missing" DaylightTime transition hour
|
||||||
// Calling toEpochMSecs will adjust the returned date/time if it does
|
// 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)
|
if (size < 10)
|
||||||
return QDateTime();
|
return QDateTime();
|
||||||
|
|
||||||
QString isoString = string;
|
QStringRef isoString(&string);
|
||||||
Qt::TimeSpec spec = Qt::LocalTime;
|
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())
|
if (!date.isValid())
|
||||||
return QDateTime();
|
return QDateTime();
|
||||||
if (size == 10)
|
if (size == 10)
|
||||||
return QDateTime(date);
|
return QDateTime(date);
|
||||||
|
|
||||||
isoString.remove(0, 11);
|
isoString = isoString.right(11);
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
// Check end of string for Time Zone definition, either Z for UTC or [+-]HH:MM for Offset
|
// Check end of string for Time Zone definition, either Z for UTC or [+-]HH:MM for Offset
|
||||||
if (isoString.endsWith(QLatin1Char('Z'))) {
|
if (isoString.endsWith(QLatin1Char('Z'))) {
|
||||||
spec = Qt::UTC;
|
spec = Qt::UTC;
|
||||||
isoString.chop(1);
|
isoString = isoString.left(isoString.size() - 1);
|
||||||
} else {
|
} else {
|
||||||
const int signIndex = isoString.indexOf(QRegExp(QStringLiteral("[+-]")));
|
// the loop below is faster but functionally equal to:
|
||||||
if (signIndex >= 0) {
|
// 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;
|
bool ok;
|
||||||
offset = fromOffsetString(isoString.mid(signIndex), &ok);
|
offset = fromOffsetString(isoString.mid(signIndex).toString(), &ok);
|
||||||
if (!ok)
|
if (!ok)
|
||||||
return QDateTime();
|
return QDateTime();
|
||||||
isoString = isoString.left(signIndex);
|
isoString = isoString.left(signIndex);
|
||||||
|
@ -348,6 +348,9 @@ QVariant QSystemLocalePrivate::dateTimeFormat(QLocale::FormatType type)
|
|||||||
|
|
||||||
QVariant QSystemLocalePrivate::dayName(int day, QLocale::FormatType type)
|
QVariant QSystemLocalePrivate::dayName(int day, QLocale::FormatType type)
|
||||||
{
|
{
|
||||||
|
if (day < 1 || day > 7)
|
||||||
|
return QString();
|
||||||
|
|
||||||
static const LCTYPE short_day_map[]
|
static const LCTYPE short_day_map[]
|
||||||
= { LOCALE_SABBREVDAYNAME1, LOCALE_SABBREVDAYNAME2,
|
= { LOCALE_SABBREVDAYNAME1, LOCALE_SABBREVDAYNAME2,
|
||||||
LOCALE_SABBREVDAYNAME3, LOCALE_SABBREVDAYNAME4, LOCALE_SABBREVDAYNAME5,
|
LOCALE_SABBREVDAYNAME3, LOCALE_SABBREVDAYNAME4, LOCALE_SABBREVDAYNAME5,
|
||||||
|
@ -189,9 +189,23 @@ static int ucstricmp(const ushort *a, const ushort *ae, const uchar *b, const uc
|
|||||||
return 1;
|
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
|
// Unicode case-sensitive compare two same-sized strings
|
||||||
static int ucstrncmp(const QChar *a, const QChar *b, int l)
|
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)
|
while (l-- && *a == *b)
|
||||||
a++,b++;
|
a++,b++;
|
||||||
if (l==-1)
|
if (l==-1)
|
||||||
@ -3947,6 +3961,10 @@ static inline __m128i mergeQuestionMarks(__m128i chunk)
|
|||||||
}
|
}
|
||||||
#endif
|
#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)
|
static void toLatin1_helper(uchar *dst, const ushort *src, int length)
|
||||||
{
|
{
|
||||||
if (length) {
|
if (length) {
|
||||||
@ -3995,10 +4013,14 @@ static void toLatin1_helper(uchar *dst, const ushort *src, int length)
|
|||||||
length = length % 8;
|
length = length % 8;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(__mips_dsp)
|
||||||
|
qt_toLatin1_mips_dsp_asm(dst, src, length);
|
||||||
|
#else
|
||||||
while (length--) {
|
while (length--) {
|
||||||
*dst++ = (*src>0xff) ? '?' : (uchar) *src;
|
*dst++ = (*src>0xff) ? '?' : (uchar) *src;
|
||||||
++src;
|
++src;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4151,6 +4173,12 @@ QVector<uint> QString::toUcs4() const
|
|||||||
return v;
|
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)
|
QString::Data *QString::fromLatin1_helper(const char *str, int size)
|
||||||
{
|
{
|
||||||
Data *d;
|
Data *d;
|
||||||
@ -4191,8 +4219,15 @@ QString::Data *QString::fromLatin1_helper(const char *str, int size)
|
|||||||
size = size % 16;
|
size = size % 16;
|
||||||
}
|
}
|
||||||
#endif
|
#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--)
|
while (size--)
|
||||||
*dst++ = (uchar)*str++;
|
*dst++ = (uchar)*str++;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
449
src/corelib/tools/qstring_mips_dsp_asm.S
Normal file
449
src/corelib/tools/qstring_mips_dsp_asm.S
Normal 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)
|
||||||
|
|
@ -438,11 +438,15 @@ QVector<T>::QVector(int asize, const T &t)
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
QVector<T>::QVector(std::initializer_list<T> args)
|
QVector<T>::QVector(std::initializer_list<T> args)
|
||||||
{
|
{
|
||||||
d = Data::allocate(args.size());
|
if (args.size() > 0) {
|
||||||
// std::initializer_list<T>::iterator is guaranteed to be
|
d = Data::allocate(args.size());
|
||||||
// const T* ([support.initlist]/1), so can be memcpy'ed away from by copyConstruct
|
// std::initializer_list<T>::iterator is guaranteed to be
|
||||||
copyConstruct(args.begin(), args.end(), d->begin());
|
// const T* ([support.initlist]/1), so can be memcpy'ed away from by copyConstruct
|
||||||
d->size = int(args.size());
|
copyConstruct(args.begin(), args.end(), d->begin());
|
||||||
|
d->size = int(args.size());
|
||||||
|
} else {
|
||||||
|
d = Data::sharedNull();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -198,3 +198,7 @@ INCLUDEPATH += ../3rdparty/md5 \
|
|||||||
!macx-icc:!vxworks:unix:LIBS_PRIVATE += -lm
|
!macx-icc:!vxworks:unix:LIBS_PRIVATE += -lm
|
||||||
|
|
||||||
TR_EXCLUDE += ../3rdparty/*
|
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
|
||||||
|
@ -85,3 +85,5 @@ contains(QT_CPU_FEATURES.$$QT_ARCH, sse2) {
|
|||||||
SOURCES += image/qimage_sse2.cpp
|
SOURCES += image/qimage_sse2.cpp
|
||||||
SSSE3_SOURCES += image/qimage_ssse3.cpp
|
SSSE3_SOURCES += image/qimage_ssse3.cpp
|
||||||
}
|
}
|
||||||
|
MIPS_DSPR2_SOURCES += image/qimage_mips_dspr2.cpp
|
||||||
|
MIPS_DSPR2_ASM += image/qimage_mips_dspr2_asm.S
|
||||||
|
@ -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] = convert_RGB888_to_RGB32_neon;
|
||||||
qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB32_neon;
|
qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB32_neon;
|
||||||
#endif
|
#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
|
QT_END_NAMESPACE
|
||||||
|
@ -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
|
** 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$
|
** $QT_BEGIN_LICENSE:LGPL$
|
||||||
** Commercial License Usage
|
** Commercial License Usage
|
||||||
@ -39,31 +39,31 @@
|
|||||||
**
|
**
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
//
|
#include "qimage.h"
|
||||||
// W A R N I N G
|
#include <private/qimage_p.h>
|
||||||
// -------------
|
|
||||||
//
|
|
||||||
// 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>
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
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 {
|
bool convert_ARGB_to_ARGB_PM_inplace_mips_dspr2(QImageData *data, Qt::ImageConversionFlags)
|
||||||
QT_PREPEND_NAMESPACE(QMainWindowLayout) *mainWindowLayout;
|
{
|
||||||
NSToolbarItem *toolbarItem;
|
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;
|
QT_END_NAMESPACE
|
||||||
@end
|
|
207
src/gui/image/qimage_mips_dspr2_asm.S
Normal file
207
src/gui/image/qimage_mips_dspr2_asm.S
Normal 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)
|
||||||
|
|
@ -1488,10 +1488,12 @@ void QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePriv
|
|||||||
QGuiApplicationPrivate::processTabletLeaveProximityEvent(
|
QGuiApplicationPrivate::processTabletLeaveProximityEvent(
|
||||||
static_cast<QWindowSystemInterfacePrivate::TabletLeaveProximityEvent *>(e));
|
static_cast<QWindowSystemInterfacePrivate::TabletLeaveProximityEvent *>(e));
|
||||||
break;
|
break;
|
||||||
|
#ifndef QT_NO_GESTURES
|
||||||
case QWindowSystemInterfacePrivate::Gesture:
|
case QWindowSystemInterfacePrivate::Gesture:
|
||||||
QGuiApplicationPrivate::processGestureEvent(
|
QGuiApplicationPrivate::processGestureEvent(
|
||||||
static_cast<QWindowSystemInterfacePrivate::GestureEvent *>(e));
|
static_cast<QWindowSystemInterfacePrivate::GestureEvent *>(e));
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
case QWindowSystemInterfacePrivate::PlatformPanel:
|
case QWindowSystemInterfacePrivate::PlatformPanel:
|
||||||
QGuiApplicationPrivate::processPlatformPanelEvent(
|
QGuiApplicationPrivate::processPlatformPanelEvent(
|
||||||
static_cast<QWindowSystemInterfacePrivate::PlatformPanelEvent *>(e));
|
static_cast<QWindowSystemInterfacePrivate::PlatformPanelEvent *>(e));
|
||||||
|
@ -148,7 +148,10 @@ public:
|
|||||||
static void processTabletEvent(QWindowSystemInterfacePrivate::TabletEvent *e);
|
static void processTabletEvent(QWindowSystemInterfacePrivate::TabletEvent *e);
|
||||||
static void processTabletEnterProximityEvent(QWindowSystemInterfacePrivate::TabletEnterProximityEvent *e);
|
static void processTabletEnterProximityEvent(QWindowSystemInterfacePrivate::TabletEnterProximityEvent *e);
|
||||||
static void processTabletLeaveProximityEvent(QWindowSystemInterfacePrivate::TabletLeaveProximityEvent *e);
|
static void processTabletLeaveProximityEvent(QWindowSystemInterfacePrivate::TabletLeaveProximityEvent *e);
|
||||||
|
|
||||||
|
#ifndef QT_NO_GESTURES
|
||||||
static void processGestureEvent(QWindowSystemInterfacePrivate::GestureEvent *e);
|
static void processGestureEvent(QWindowSystemInterfacePrivate::GestureEvent *e);
|
||||||
|
#endif
|
||||||
|
|
||||||
static void processPlatformPanelEvent(QWindowSystemInterfacePrivate::PlatformPanelEvent *e);
|
static void processPlatformPanelEvent(QWindowSystemInterfacePrivate::PlatformPanelEvent *e);
|
||||||
#ifndef QT_NO_CONTEXTMENU
|
#ifndef QT_NO_CONTEXTMENU
|
||||||
|
@ -91,7 +91,9 @@ public:
|
|||||||
PlatformPanel = UserInputEvent | 0x17,
|
PlatformPanel = UserInputEvent | 0x17,
|
||||||
ContextMenu = UserInputEvent | 0x18,
|
ContextMenu = UserInputEvent | 0x18,
|
||||||
EnterWhatsThisMode = UserInputEvent | 0x19,
|
EnterWhatsThisMode = UserInputEvent | 0x19,
|
||||||
|
#ifndef QT_NO_GESTURES
|
||||||
Gesture = UserInputEvent | 0x1a,
|
Gesture = UserInputEvent | 0x1a,
|
||||||
|
#endif
|
||||||
ApplicationStateChanged = 0x19,
|
ApplicationStateChanged = 0x19,
|
||||||
FlushEvents = 0x20,
|
FlushEvents = 0x20,
|
||||||
WindowScreenChanged = 0x21
|
WindowScreenChanged = 0x21
|
||||||
@ -403,6 +405,7 @@ public:
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef QT_NO_GESTURES
|
||||||
class GestureEvent : public InputEvent {
|
class GestureEvent : public InputEvent {
|
||||||
public:
|
public:
|
||||||
GestureEvent(QWindow *window, ulong time, Qt::NativeGestureType type, QPointF pos, QPointF globalPos)
|
GestureEvent(QWindow *window, ulong time, Qt::NativeGestureType type, QPointF pos, QPointF globalPos)
|
||||||
@ -417,6 +420,7 @@ public:
|
|||||||
ulong sequenceId;
|
ulong sequenceId;
|
||||||
quint64 intValue;
|
quint64 intValue;
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
class WindowSystemEventList {
|
class WindowSystemEventList {
|
||||||
QList<WindowSystemEvent *> impl;
|
QList<WindowSystemEvent *> impl;
|
||||||
|
@ -436,12 +436,6 @@ inline void QT_FASTCALL storePixel<QPixelLayout::BPP24>(uchar *dest, int index,
|
|||||||
reinterpret_cast<quint24 *>(dest)[index] = quint24(pixel);
|
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>
|
template <QPixelLayout::BPP width>
|
||||||
inline void QT_FASTCALL storePixels(uchar *dest, const uint *src, int index, int count)
|
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;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const SourceFetchProc sourceFetch[NBlendTypes][QImage::NImageFormats] = {
|
static SourceFetchProc sourceFetch[NBlendTypes][QImage::NImageFormats] = {
|
||||||
// Untransformed
|
// Untransformed
|
||||||
{
|
{
|
||||||
0, // Invalid
|
0, // Invalid
|
||||||
@ -6385,6 +6379,21 @@ void qInitDrawhelperAsm()
|
|||||||
|
|
||||||
destStoreProc[QImage::Format_ARGB32] = qt_destStoreARGB32_mips_dsp;
|
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
|
#endif // QT_COMPILER_SUPPORTS_MIPS_DSP
|
||||||
if (functionForModeSolidAsm) {
|
if (functionForModeSolidAsm) {
|
||||||
const int destinationMode = QPainter::CompositionMode_Destination;
|
const int destinationMode = QPainter::CompositionMode_Destination;
|
||||||
|
@ -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
|
** Contact: http://www.qt-project.org/legal
|
||||||
**
|
**
|
||||||
** This file is part of the QtGui module of the Qt Toolkit.
|
** 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)
|
void comp_func_Source_mips_dsp(uint *dest, const uint *src, int length, uint const_alpha)
|
||||||
{
|
{
|
||||||
if (const_alpha == 255) {
|
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);
|
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
|
QT_END_NAMESPACE
|
||||||
|
@ -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
|
** Contact: http://www.qt-project.org/legal
|
||||||
**
|
**
|
||||||
** This file is part of the QtGui module of the Qt Toolkit.
|
** 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
|
nop
|
||||||
|
|
||||||
END(qt_blend_argb32_on_argb32_const_alpha_256_mips_dsp_asm)
|
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)
|
||||||
|
@ -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
|
** Contact: http://www.qt-project.org/legal
|
||||||
**
|
**
|
||||||
** This file is part of the QtGui module of the Qt Toolkit.
|
** 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_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 * 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 * 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,
|
void qt_blend_argb32_on_argb32_mips_dsp(uchar *destPixels, int dbpl,
|
||||||
const uchar *srcPixels, int sbpl,
|
const uchar *srcPixels, int sbpl,
|
||||||
int w, int h,
|
int w, int h,
|
||||||
int const_alpha);
|
int const_alpha);
|
||||||
|
|
||||||
void qt_blend_rgb32_on_rgb32_mips_dsp(uchar *destPixels, int dbpl,
|
void qt_blend_rgb32_on_rgb32_mips_dsp(uchar *destPixels, int dbpl,
|
||||||
const uchar *srcPixels, int sbpl,
|
const uchar *srcPixels, int sbpl,
|
||||||
int w, int h,
|
int w, int h,
|
||||||
int const_alpha);
|
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);
|
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);
|
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
|
#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 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
|
#endif // QT_COMPILER_SUPPORTS_MIPS_DSPR2
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -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
|
** Contact: http://www.qt-project.org/legal
|
||||||
**
|
**
|
||||||
** This file is part of the QtGui module of the Qt Toolkit.
|
** This file is part of the QtGui module of the Qt Toolkit.
|
||||||
@ -122,3 +122,551 @@ LEAF_MIPS_DSPR2(qConvertRgb16To32_asm_mips_dspr2)
|
|||||||
nop
|
nop
|
||||||
|
|
||||||
END(qConvertRgb16To32_asm_mips_dspr2)
|
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
|
||||||
|
@ -62,6 +62,7 @@
|
|||||||
#include "qglyphrun.h"
|
#include "qglyphrun.h"
|
||||||
|
|
||||||
#include <qpa/qplatformtheme.h>
|
#include <qpa/qplatformtheme.h>
|
||||||
|
#include <qpa/qplatformintegration.h>
|
||||||
|
|
||||||
#include <private/qfontengine_p.h>
|
#include <private/qfontengine_p.h>
|
||||||
#include <private/qpaintengine_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
|
// can be drawn onto these devices safely from any thread
|
||||||
break;
|
break;
|
||||||
default:
|
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);
|
qWarning("QPainter: It is not safe to use %s outside the GUI thread", what);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -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
|
** Contact: http://www.qt-project.org/legal
|
||||||
**
|
**
|
||||||
** This file is part of the QtGui module of the Qt Toolkit.
|
** This file is part of the QtGui module of the Qt Toolkit.
|
||||||
@ -261,4 +261,168 @@ LEAF_MIPS32R2(symbol) \
|
|||||||
or \out_1, \scratch1, \scratch3
|
or \out_1, \scratch1, \scratch3
|
||||||
.endm
|
.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
|
#endif // QT_MIPS_ASM_DSP_H
|
||||||
|
@ -591,8 +591,7 @@ QAbstractSocketPrivate::~QAbstractSocketPrivate()
|
|||||||
|
|
||||||
/*! \internal
|
/*! \internal
|
||||||
|
|
||||||
Resets the socket layer, clears the read and write buffers and
|
Resets the socket layer and deletes any socket notifiers.
|
||||||
deletes any socket notifiers.
|
|
||||||
*/
|
*/
|
||||||
void QAbstractSocketPrivate::resetSocketLayer()
|
void QAbstractSocketPrivate::resetSocketLayer()
|
||||||
{
|
{
|
||||||
@ -1834,6 +1833,7 @@ qintptr QAbstractSocket::socketDescriptor() const
|
|||||||
as a valid socket descriptor; otherwise returns \c false.
|
as a valid socket descriptor; otherwise returns \c false.
|
||||||
The socket is opened in the mode specified by \a openMode, and
|
The socket is opened in the mode specified by \a openMode, and
|
||||||
enters the socket state specified by \a socketState.
|
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
|
\b{Note:} It is not possible to initialize two abstract sockets
|
||||||
with the same native socket descriptor.
|
with the same native socket descriptor.
|
||||||
@ -1846,6 +1846,8 @@ bool QAbstractSocket::setSocketDescriptor(qintptr socketDescriptor, SocketState
|
|||||||
Q_D(QAbstractSocket);
|
Q_D(QAbstractSocket);
|
||||||
|
|
||||||
d->resetSocketLayer();
|
d->resetSocketLayer();
|
||||||
|
d->writeBuffer.clear();
|
||||||
|
d->buffer.clear();
|
||||||
d->socketEngine = QAbstractSocketEngine::createSocketEngine(socketDescriptor, this);
|
d->socketEngine = QAbstractSocketEngine::createSocketEngine(socketDescriptor, this);
|
||||||
if (!d->socketEngine) {
|
if (!d->socketEngine) {
|
||||||
d->socketError = UnsupportedSocketOperationError;
|
d->socketError = UnsupportedSocketOperationError;
|
||||||
@ -2310,6 +2312,7 @@ void QAbstractSocket::abort()
|
|||||||
#if defined (QABSTRACTSOCKET_DEBUG)
|
#if defined (QABSTRACTSOCKET_DEBUG)
|
||||||
qDebug("QAbstractSocket::abort()");
|
qDebug("QAbstractSocket::abort()");
|
||||||
#endif
|
#endif
|
||||||
|
d->writeBuffer.clear();
|
||||||
if (d->state == UnconnectedState)
|
if (d->state == UnconnectedState)
|
||||||
return;
|
return;
|
||||||
#ifndef QT_NO_SSL
|
#ifndef QT_NO_SSL
|
||||||
@ -2324,7 +2327,6 @@ void QAbstractSocket::abort()
|
|||||||
d->connectTimer = 0;
|
d->connectTimer = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
d->writeBuffer.clear();
|
|
||||||
d->abortCalled = true;
|
d->abortCalled = true;
|
||||||
close();
|
close();
|
||||||
}
|
}
|
||||||
|
@ -189,9 +189,6 @@ init_context:
|
|||||||
q_SSL_CTX_load_verify_locations(sslContext->ctx, 0, unixDirs.at(a).constData());
|
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()) {
|
if (!sslContext->sslConfiguration.localCertificate().isNull()) {
|
||||||
// Require a private key as well.
|
// Require a private key as well.
|
||||||
if (sslContext->sslConfiguration.privateKey().isNull()) {
|
if (sslContext->sslConfiguration.privateKey().isNull()) {
|
||||||
|
@ -65,6 +65,9 @@ QConnmanEngine::QConnmanEngine(QObject *parent)
|
|||||||
: QBearerEngineImpl(parent),
|
: QBearerEngineImpl(parent),
|
||||||
connmanManager(new QConnmanManagerInterface(this))
|
connmanManager(new QConnmanManagerInterface(this))
|
||||||
{
|
{
|
||||||
|
qDBusRegisterMetaType<ConnmanMap>();
|
||||||
|
qDBusRegisterMetaType<ConnmanMapList>();
|
||||||
|
qRegisterMetaType<ConnmanMapList>("ConnmanMapList");
|
||||||
}
|
}
|
||||||
|
|
||||||
QConnmanEngine::~QConnmanEngine()
|
QConnmanEngine::~QConnmanEngine()
|
||||||
@ -82,6 +85,9 @@ void QConnmanEngine::initialize()
|
|||||||
connect(connmanManager,SIGNAL(propertyChangedContext(QString,QString,QDBusVariant)),
|
connect(connmanManager,SIGNAL(propertyChangedContext(QString,QString,QDBusVariant)),
|
||||||
this,SLOT(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()) {
|
foreach (const QString &techPath, connmanManager->getTechnologies()) {
|
||||||
QConnmanTechnologyInterface *tech;
|
QConnmanTechnologyInterface *tech;
|
||||||
tech = new QConnmanTechnologyInterface(techPath, this);
|
tech = new QConnmanTechnologyInterface(techPath, this);
|
||||||
@ -172,6 +178,22 @@ void QConnmanEngine::requestUpdate()
|
|||||||
QTimer::singleShot(0, this, SLOT(doRequestUpdate()));
|
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)
|
QString QConnmanEngine::serviceFromId(const QString &id)
|
||||||
{
|
{
|
||||||
QMutexLocker locker(&mutex);
|
QMutexLocker locker(&mutex);
|
||||||
@ -394,21 +416,23 @@ QNetworkConfiguration::StateFlags QConnmanEngine::getStateForService(const QStri
|
|||||||
QMutexLocker locker(&mutex);
|
QMutexLocker locker(&mutex);
|
||||||
QConnmanServiceInterface serv(service);
|
QConnmanServiceInterface serv(service);
|
||||||
QNetworkConfiguration::StateFlags flag = QNetworkConfiguration::Defined;
|
QNetworkConfiguration::StateFlags flag = QNetworkConfiguration::Defined;
|
||||||
if( serv.getType() == "cellular") {
|
if (serv.getType() == "cellular") {
|
||||||
if(serv.isSetupRequired()) {
|
if (serv.isSetupRequired() || !serv.isAutoConnect() || (serv.isRoaming() && isAlwaysAskRoaming())) {
|
||||||
flag = ( flag | QNetworkConfiguration::Defined);
|
flag = ( flag | QNetworkConfiguration::Defined);
|
||||||
} else {
|
} else {
|
||||||
flag = ( flag | QNetworkConfiguration::Discovered);
|
flag = ( flag | QNetworkConfiguration::Discovered);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if(serv.isFavorite()) {
|
if (serv.isFavorite()) {
|
||||||
flag = ( flag | QNetworkConfiguration::Discovered);
|
if (serv.isAutoConnect()) {
|
||||||
|
flag = ( flag | QNetworkConfiguration::Discovered);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
flag = QNetworkConfiguration::Undefined;
|
flag = QNetworkConfiguration::Undefined;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(serv.getState() == "ready" || serv.getState() == "online") {
|
if (serv.getState() == "ready" || serv.getState() == "online") {
|
||||||
flag = ( flag | QNetworkConfiguration::Active);
|
flag = ( flag | QNetworkConfiguration::Active);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -569,6 +593,12 @@ bool QConnmanEngine::requiresPolling() const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool QConnmanEngine::isAlwaysAskRoaming()
|
||||||
|
{
|
||||||
|
QSettings confFile(QStringLiteral("nemomobile"), QStringLiteral("connectionagent"));
|
||||||
|
confFile.beginGroup(QStringLiteral("Connectionagent"));
|
||||||
|
return confFile.value(QStringLiteral("askForRoaming")).toBool();
|
||||||
|
}
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
#endif // QT_NO_DBUS
|
#endif // QT_NO_DBUS
|
||||||
|
@ -105,6 +105,7 @@ private Q_SLOTS:
|
|||||||
void servicePropertyChangedContext(const QString &,const QString &,const QDBusVariant &);
|
void servicePropertyChangedContext(const QString &,const QString &,const QDBusVariant &);
|
||||||
void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
|
void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
|
||||||
void technologyPropertyChangedContext(const QString &,const QString &, const QDBusVariant &);
|
void technologyPropertyChangedContext(const QString &,const QString &, const QDBusVariant &);
|
||||||
|
void updateServices(const ConnmanMapList &changed, const QList<QDBusObjectPath> &removed);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QConnmanManagerInterface *connmanManager;
|
QConnmanManagerInterface *connmanManager;
|
||||||
@ -128,6 +129,7 @@ private:
|
|||||||
|
|
||||||
QNetworkConfiguration::BearerType ofonoTechToBearerType(const QString &type);
|
QNetworkConfiguration::BearerType ofonoTechToBearerType(const QString &type);
|
||||||
bool isRoamingAllowed(const QString &context);
|
bool isRoamingAllowed(const QString &context);
|
||||||
|
bool isAlwaysAskRoaming();
|
||||||
protected:
|
protected:
|
||||||
bool requiresPolling() const;
|
bool requiresPolling() const;
|
||||||
};
|
};
|
||||||
|
@ -127,8 +127,24 @@ void QConnmanManagerInterface::connectNotify(const QMetaMethod &signal)
|
|||||||
QObject::connect(helper,SIGNAL(propertyChangedContext(QString,QString,QDBusVariant)),
|
QObject::connect(helper,SIGNAL(propertyChangedContext(QString,QString,QDBusVariant)),
|
||||||
this,SIGNAL(propertyChangedContext(QString,QString,QDBusVariant)), Qt::UniqueConnection);
|
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)
|
void QConnmanManagerInterface::disconnectNotify(const QMetaMethod &signal)
|
||||||
{
|
{
|
||||||
static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QConnmanManagerInterface::propertyChanged);
|
static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QConnmanManagerInterface::propertyChanged);
|
||||||
|
@ -155,11 +155,16 @@ Q_SIGNALS:
|
|||||||
void propertyChanged(const QString &, const QDBusVariant &value);
|
void propertyChanged(const QString &, const QDBusVariant &value);
|
||||||
void stateChanged(const QString &);
|
void stateChanged(const QString &);
|
||||||
void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
|
void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
|
||||||
|
void servicesChanged(const ConnmanMapList&, const QList<QDBusObjectPath> &);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void connectNotify(const QMetaMethod &signal);
|
void connectNotify(const QMetaMethod &signal);
|
||||||
void disconnectNotify(const QMetaMethod &signal);
|
void disconnectNotify(const QMetaMethod &signal);
|
||||||
QVariant getProperty(const QString &);
|
QVariant getProperty(const QString &);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void onServicesChanged(const ConnmanMapList&, const QList<QDBusObjectPath> &);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class QConnmanProfileInterfacePrivate;
|
class QConnmanProfileInterfacePrivate;
|
||||||
|
@ -73,7 +73,8 @@ QPaintDevice *QCocoaBackingStore::paintDevice()
|
|||||||
}
|
}
|
||||||
#endif
|
#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;
|
? QImage::Format_ARGB32_Premultiplied : QImage::Format_RGB32;
|
||||||
m_qImage = QImage(m_requestedSize * scaleFactor, format);
|
m_qImage = QImage(m_requestedSize * scaleFactor, format);
|
||||||
m_qImage.setDevicePixelRatio(scaleFactor);
|
m_qImage.setDevicePixelRatio(scaleFactor);
|
||||||
|
@ -132,6 +132,9 @@ private:
|
|||||||
// touch events, which then will be delivered until the widget
|
// touch events, which then will be delivered until the widget
|
||||||
// deregisters.
|
// deregisters.
|
||||||
static void registerTouchWindow(QWindow *window, bool enable);
|
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
|
#endif // QCOCOANATIVEINTERFACE_H
|
||||||
|
@ -123,6 +123,8 @@ QPlatformNativeInterface::NativeResourceForIntegrationFunction QCocoaNativeInter
|
|||||||
return NativeResourceForIntegrationFunction(QCocoaNativeInterface::registerTouchWindow);
|
return NativeResourceForIntegrationFunction(QCocoaNativeInterface::registerTouchWindow);
|
||||||
if (resource.toLower() == "setembeddedinforeignview")
|
if (resource.toLower() == "setembeddedinforeignview")
|
||||||
return NativeResourceForIntegrationFunction(QCocoaNativeInterface::setEmbeddedInForeignView);
|
return NativeResourceForIntegrationFunction(QCocoaNativeInterface::setEmbeddedInForeignView);
|
||||||
|
if (resource.toLower() == "setcontentborderthickness")
|
||||||
|
return NativeResourceForIntegrationFunction(QCocoaNativeInterface::setContentBorderThickness);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -268,14 +270,19 @@ void QCocoaNativeInterface::registerTouchWindow(QWindow *window, bool enable)
|
|||||||
if (!window)
|
if (!window)
|
||||||
return;
|
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());
|
QCocoaWindow *cocoaWindow = static_cast<QCocoaWindow *>(window->handle());
|
||||||
if (cocoaWindow)
|
if (cocoaWindow)
|
||||||
cocoaWindow->registerTouch(enable);
|
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
|
QT_END_NAMESPACE
|
||||||
|
@ -259,13 +259,17 @@ QPixmap QCocoaTheme::fileIconPixmap(const QFileInfo &fileInfo, const QSizeF &siz
|
|||||||
NSImage *iconImage = [[NSWorkspace sharedWorkspace] iconForFile:QCFString::toNSString(fileInfo.canonicalFilePath())];
|
NSImage *iconImage = [[NSWorkspace sharedWorkspace] iconForFile:QCFString::toNSString(fileInfo.canonicalFilePath())];
|
||||||
if (!iconImage)
|
if (!iconImage)
|
||||||
return QPixmap();
|
return QPixmap();
|
||||||
|
NSSize pixmapSize = NSMakeSize(size.width(), size.height());
|
||||||
NSRect iconRect = NSMakeRect(0, 0, size.width(), size.height());
|
QPixmap pixmap(pixmapSize.width, pixmapSize.height);
|
||||||
NSGraphicsContext *gc = [NSGraphicsContext currentContext];
|
pixmap.fill(Qt::transparent);
|
||||||
CGImageRef cgImage = [iconImage CGImageForProposedRect:&iconRect
|
[iconImage setSize:pixmapSize];
|
||||||
context:([gc graphicsPort] ? gc : nil)
|
NSRect iconRect = NSMakeRect(0, 0, pixmapSize.width, pixmapSize.height);
|
||||||
hints:nil];
|
CGContextRef ctx = qt_mac_cg_context(&pixmap);
|
||||||
QPixmap pixmap = QPixmap::fromImage(qt_mac_toQImage(cgImage));
|
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;
|
return pixmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -281,8 +285,12 @@ QVariant QCocoaTheme::themeHint(ThemeHint hint) const
|
|||||||
case TabAllWidgets:
|
case TabAllWidgets:
|
||||||
return QVariant(bool([[NSApplication sharedApplication] isFullKeyboardAccessEnabled]));
|
return QVariant(bool([[NSApplication sharedApplication] isFullKeyboardAccessEnabled]));
|
||||||
case IconPixmapSizes: {
|
case IconPixmapSizes: {
|
||||||
|
qreal devicePixelRatio = qGuiApp->devicePixelRatio();
|
||||||
QList<int> sizes;
|
QList<int> sizes;
|
||||||
sizes << 16 << 32 << 64 << 128;
|
sizes << 16 * devicePixelRatio
|
||||||
|
<< 32 * devicePixelRatio
|
||||||
|
<< 64 * devicePixelRatio
|
||||||
|
<< 128 * devicePixelRatio;
|
||||||
return QVariant::fromValue(sizes);
|
return QVariant::fromValue(sizes);
|
||||||
}
|
}
|
||||||
case QPlatformTheme::PasswordMaskCharacter:
|
case QPlatformTheme::PasswordMaskCharacter:
|
||||||
|
@ -157,6 +157,8 @@ public:
|
|||||||
void setWindowCursor(NSCursor *cursor);
|
void setWindowCursor(NSCursor *cursor);
|
||||||
|
|
||||||
void registerTouch(bool enable);
|
void registerTouch(bool enable);
|
||||||
|
void setContentBorderThickness(int topThickness, int bottomThickness);
|
||||||
|
void applyContentBorderThickness(NSWindow *window);
|
||||||
|
|
||||||
qreal devicePixelRatio() const;
|
qreal devicePixelRatio() const;
|
||||||
bool isWindowExposable();
|
bool isWindowExposable();
|
||||||
@ -215,6 +217,10 @@ public: // for QNSView
|
|||||||
NSInteger m_alertRequest;
|
NSInteger m_alertRequest;
|
||||||
id monitor;
|
id monitor;
|
||||||
|
|
||||||
|
bool m_drawContentBorderGradient;
|
||||||
|
int m_topContentBorderThickness;
|
||||||
|
int m_bottomContentBorderThickness;
|
||||||
|
|
||||||
// used by showFullScreen in fake mode
|
// used by showFullScreen in fake mode
|
||||||
QRect m_normalGeometry;
|
QRect m_normalGeometry;
|
||||||
Qt::WindowFlags m_oldWindowFlags;
|
Qt::WindowFlags m_oldWindowFlags;
|
||||||
|
@ -220,6 +220,9 @@ QCocoaWindow::QCocoaWindow(QWindow *tlw)
|
|||||||
, m_overrideBecomeKey(false)
|
, m_overrideBecomeKey(false)
|
||||||
, m_alertRequest(NoAlertRequest)
|
, m_alertRequest(NoAlertRequest)
|
||||||
, monitor(nil)
|
, monitor(nil)
|
||||||
|
, m_drawContentBorderGradient(false)
|
||||||
|
, m_topContentBorderThickness(0)
|
||||||
|
, m_bottomContentBorderThickness(0)
|
||||||
, m_normalGeometry(QRect(0,0,-1,-1))
|
, m_normalGeometry(QRect(0,0,-1,-1))
|
||||||
{
|
{
|
||||||
#ifdef QT_COCOA_ENABLE_WINDOW_DEBUG
|
#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
|
#ifdef QT_COCOA_ENABLE_WINDOW_DEBUG
|
||||||
qDebug("windowStyleMask of '%s': flags %X -> styleMask %lX", qPrintable(window()->title()), (int)flags, styleMask);
|
qDebug("windowStyleMask of '%s': flags %X -> styleMask %lX", qPrintable(window()->title()), (int)flags, styleMask);
|
||||||
#endif
|
#endif
|
||||||
@ -936,6 +942,9 @@ NSWindow * QCocoaWindow::createNSWindow()
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_windowModality = window()->modality();
|
m_windowModality = window()->modality();
|
||||||
|
|
||||||
|
applyContentBorderThickness(createdWindow);
|
||||||
|
|
||||||
return createdWindow;
|
return createdWindow;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1100,6 +1109,38 @@ void QCocoaWindow::registerTouch(bool enable)
|
|||||||
[m_contentView setAcceptsTouchEvents:NO];
|
[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
|
qreal QCocoaWindow::devicePixelRatio() const
|
||||||
{
|
{
|
||||||
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7
|
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7
|
||||||
|
@ -408,6 +408,9 @@ static QTouchDevice *touchDevice = 0;
|
|||||||
m_shouldSetGLContextinDrawRect = false;
|
m_shouldSetGLContextinDrawRect = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_platformWindow->m_drawContentBorderGradient)
|
||||||
|
NSDrawWindowBackground(dirtyRect);
|
||||||
|
|
||||||
if (!m_backingStore)
|
if (!m_backingStore)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -451,7 +454,8 @@ static QTouchDevice *touchDevice = 0;
|
|||||||
|
|
||||||
// Optimization: Copy frame buffer content instead of blending for
|
// Optimization: Copy frame buffer content instead of blending for
|
||||||
// top-level windows where Qt fills the entire window content area.
|
// 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);
|
CGContextSetBlendMode(cgContext, kCGBlendModeCopy);
|
||||||
|
|
||||||
CGContextDrawImage(cgContext, dirtyWindowRect, cleanImg);
|
CGContextDrawImage(cgContext, dirtyWindowRect, cleanImg);
|
||||||
|
@ -77,7 +77,8 @@ public:
|
|||||||
virtual bool filterConfig(EGLDisplay display, EGLConfig config) const;
|
virtual bool filterConfig(EGLDisplay display, EGLConfig config) const;
|
||||||
virtual void waitForVSync() const;
|
virtual void waitForVSync() const;
|
||||||
|
|
||||||
virtual const char *fbDeviceName() const;
|
virtual QByteArray fbDeviceName() const;
|
||||||
|
virtual int framebufferIndex() const;
|
||||||
|
|
||||||
static QEglFSHooks *hooks()
|
static QEglFSHooks *hooks()
|
||||||
{
|
{
|
||||||
|
@ -42,6 +42,7 @@
|
|||||||
#include "qeglfshooks.h"
|
#include "qeglfshooks.h"
|
||||||
#include <QtPlatformSupport/private/qeglplatformcursor_p.h>
|
#include <QtPlatformSupport/private/qeglplatformcursor_p.h>
|
||||||
#include <QtPlatformSupport/private/qeglconvenience_p.h>
|
#include <QtPlatformSupport/private/qeglconvenience_p.h>
|
||||||
|
#include <QtCore/QRegularExpression>
|
||||||
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.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
|
// this is a global static to keep the QEglFSHooks interface as clean as possible
|
||||||
static int framebuffer = -1;
|
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()
|
void QEglFSHooks::platformInit()
|
||||||
{
|
{
|
||||||
framebuffer = qt_safe_open(fbDeviceName(), O_RDONLY);
|
QByteArray fbDev = fbDeviceName();
|
||||||
|
|
||||||
|
framebuffer = qt_safe_open(fbDev, O_RDONLY);
|
||||||
|
|
||||||
if (framebuffer == -1)
|
if (framebuffer == -1)
|
||||||
qWarning("EGLFS: Failed to open %s", fbDeviceName());
|
qWarning("EGLFS: Failed to open %s", qPrintable(fbDev));
|
||||||
}
|
}
|
||||||
|
|
||||||
void QEglFSHooks::platformDestroy()
|
void QEglFSHooks::platformDestroy()
|
||||||
|
@ -572,6 +572,8 @@ bool QWindowsDialogHelperBase<BaseClass>::show(Qt::WindowFlags,
|
|||||||
QWindow *parent)
|
QWindow *parent)
|
||||||
{
|
{
|
||||||
const bool modal = (windowModality != Qt::NonModal);
|
const bool modal = (windowModality != Qt::NonModal);
|
||||||
|
if (!parent)
|
||||||
|
parent = QGuiApplication::focusWindow(); // Need a parent window, else the application loses activation when closed.
|
||||||
if (parent) {
|
if (parent) {
|
||||||
m_ownerWindow = QWindowsWindow::handleOf(parent);
|
m_ownerWindow = QWindowsWindow::handleOf(parent);
|
||||||
} else {
|
} else {
|
||||||
|
@ -304,6 +304,8 @@ QList<QPlatformScreen *> QWindowsScreen::virtualSiblings() const
|
|||||||
|
|
||||||
void QWindowsScreen::handleChanges(const QWindowsScreenData &newData)
|
void QWindowsScreen::handleChanges(const QWindowsScreenData &newData)
|
||||||
{
|
{
|
||||||
|
m_data.physicalSizeMM = newData.physicalSizeMM;
|
||||||
|
|
||||||
if (m_data.geometry != newData.geometry) {
|
if (m_data.geometry != newData.geometry) {
|
||||||
m_data.geometry = newData.geometry;
|
m_data.geometry = newData.geometry;
|
||||||
QWindowSystemInterface::handleScreenGeometryChange(screen(),
|
QWindowSystemInterface::handleScreenGeometryChange(screen(),
|
||||||
|
@ -607,7 +607,7 @@ bool QSQLiteDriver::open(const QString & db, const QString &, const QString &, c
|
|||||||
foreach (const QString &option, opts) {
|
foreach (const QString &option, opts) {
|
||||||
if (option.startsWith(QLatin1String("QSQLITE_BUSY_TIMEOUT="))) {
|
if (option.startsWith(QLatin1String("QSQLITE_BUSY_TIMEOUT="))) {
|
||||||
bool ok;
|
bool ok;
|
||||||
const int nt = option.mid(21).toInt(&ok);
|
const int nt = option.midRef(21).toInt(&ok);
|
||||||
if (ok)
|
if (ok)
|
||||||
timeOut = nt;
|
timeOut = nt;
|
||||||
} else if (option == QLatin1String("QSQLITE_OPEN_READONLY")) {
|
} else if (option == QLatin1String("QSQLITE_OPEN_READONLY")) {
|
||||||
|
@ -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)
|
void QPlainTestLogger::outputMessage(const char *str)
|
||||||
{
|
{
|
||||||
#if defined(Q_OS_WINCE)
|
#if defined(Q_OS_WINCE)
|
||||||
@ -209,7 +213,11 @@ void QPlainTestLogger::outputMessage(const char *str)
|
|||||||
} while (!strUtf16.isEmpty());
|
} while (!strUtf16.isEmpty());
|
||||||
if (stream != stdout)
|
if (stream != stdout)
|
||||||
#elif defined(Q_OS_WIN)
|
#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)
|
#elif defined(Q_OS_ANDROID)
|
||||||
__android_log_write(ANDROID_LOG_INFO, "QTestLib", str);
|
__android_log_write(ANDROID_LOG_INFO, "QTestLib", str);
|
||||||
#endif
|
#endif
|
||||||
|
@ -151,17 +151,17 @@ namespace QTest
|
|||||||
Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
|
Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
|
||||||
{ sendKeyEvent(action, window, key, keyToAscii(key), modifier, delay); }
|
{ 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); }
|
{ 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); }
|
{ 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); }
|
{ 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); }
|
{ 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); }
|
{ 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); }
|
{ keyEvent(Press, window, key, modifier, delay); }
|
||||||
|
|
||||||
#ifdef QT_WIDGETS_LIB
|
#ifdef QT_WIDGETS_LIB
|
||||||
|
@ -56,7 +56,7 @@ QT_BEGIN_NAMESPACE
|
|||||||
|
|
||||||
namespace QTest
|
namespace QTest
|
||||||
{
|
{
|
||||||
inline static void qWait(int ms)
|
Q_DECL_UNUSED inline static void qWait(int ms)
|
||||||
{
|
{
|
||||||
Q_ASSERT(QCoreApplication::instance());
|
Q_ASSERT(QCoreApplication::instance());
|
||||||
|
|
||||||
|
@ -343,7 +343,8 @@ int runMoc(int argc, char **argv)
|
|||||||
parser.showHelp(1);
|
parser.showHelp(1);
|
||||||
}
|
}
|
||||||
Macro macro;
|
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);
|
pp.macros.insert(name, macro);
|
||||||
}
|
}
|
||||||
foreach (const QString &arg, parser.values(undefineOption)) {
|
foreach (const QString &arg, parser.values(undefineOption)) {
|
||||||
|
@ -158,8 +158,7 @@ bool Preprocessor::skipBranch()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
enum TokenizeMode { TokenizeCpp, TokenizePreprocessor, PreparePreprocessorStatement, TokenizePreprocessorStatement, TokenizeInclude, PrepareDefine, TokenizeDefine };
|
Symbols Preprocessor::tokenize(const QByteArray& input, int lineNum, Preprocessor::TokenizeMode mode)
|
||||||
static Symbols tokenize(const QByteArray &input, int lineNum = 1, TokenizeMode mode = TokenizeCpp)
|
|
||||||
{
|
{
|
||||||
Symbols symbols;
|
Symbols symbols;
|
||||||
const char *begin = input.constData();
|
const char *begin = input.constData();
|
||||||
|
@ -89,6 +89,8 @@ public:
|
|||||||
|
|
||||||
int evaluateCondition();
|
int evaluateCondition();
|
||||||
|
|
||||||
|
enum TokenizeMode { TokenizeCpp, TokenizePreprocessor, PreparePreprocessorStatement, TokenizePreprocessorStatement, TokenizeInclude, PrepareDefine, TokenizeDefine };
|
||||||
|
static Symbols tokenize(const QByteArray &input, int lineNum = 1, TokenizeMode mode = TokenizeCpp);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void until(Token);
|
void until(Token);
|
||||||
|
@ -196,8 +196,7 @@ void MetaStack::process(QChar ch, const Location& location)
|
|||||||
if (ch == QLatin1Char('{')) {
|
if (ch == QLatin1Char('{')) {
|
||||||
push(MetaStackEntry());
|
push(MetaStackEntry());
|
||||||
top().open();
|
top().open();
|
||||||
}
|
} else if (ch == QLatin1Char('}')) {
|
||||||
else if (ch == QLatin1Char('}')) {
|
|
||||||
if (count() == 1)
|
if (count() == 1)
|
||||||
location.fatal(tr("Unexpected '}'"));
|
location.fatal(tr("Unexpected '}'"));
|
||||||
|
|
||||||
@ -215,12 +214,10 @@ void MetaStack::process(QChar ch, const Location& location)
|
|||||||
}
|
}
|
||||||
++pre;
|
++pre;
|
||||||
}
|
}
|
||||||
}
|
} else if (ch == QLatin1Char(',') && count() > 1) {
|
||||||
else if (ch == QLatin1Char(',') && count() > 1) {
|
|
||||||
top().close();
|
top().close();
|
||||||
top().open();
|
top().open();
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
/*
|
/*
|
||||||
This is where all the processing is done.
|
This is where all the processing is done.
|
||||||
*/
|
*/
|
||||||
@ -296,12 +293,10 @@ Config::~Config()
|
|||||||
void Config::load(const QString& fileName)
|
void Config::load(const QString& fileName)
|
||||||
{
|
{
|
||||||
load(Location::null, fileName);
|
load(Location::null, fileName);
|
||||||
if (loc.isEmpty()) {
|
if (loc.isEmpty())
|
||||||
loc = Location(fileName);
|
loc = Location(fileName);
|
||||||
}
|
else
|
||||||
else {
|
|
||||||
loc.setEtc(true);
|
loc.setEtc(true);
|
||||||
}
|
|
||||||
lastLocation_ = Location::null;
|
lastLocation_ = Location::null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -472,9 +467,8 @@ QStringList Config::getCanonicalPathList(const QString& var) const
|
|||||||
const ConfigVar& cv = configVars[i];
|
const ConfigVar& cv = configVars[i];
|
||||||
if (!cv.location_.isEmpty())
|
if (!cv.location_.isEmpty())
|
||||||
(Location&) lastLocation_ = cv.location_;
|
(Location&) lastLocation_ = cv.location_;
|
||||||
if (!cv.plus_) {
|
if (!cv.plus_)
|
||||||
t.clear();
|
t.clear();
|
||||||
}
|
|
||||||
const QString d = cv.currentPath_;
|
const QString d = cv.currentPath_;
|
||||||
const QStringList& sl = cv.values_;
|
const QStringList& sl = cv.values_;
|
||||||
if (!sl.isEmpty()) {
|
if (!sl.isEmpty()) {
|
||||||
@ -786,9 +780,8 @@ QString Config::findFile(const Location& location,
|
|||||||
QStringList::ConstIterator d = dirs.constBegin();
|
QStringList::ConstIterator d = dirs.constBegin();
|
||||||
while (d != dirs.constEnd()) {
|
while (d != dirs.constEnd()) {
|
||||||
fileInfo.setFile(QDir(*d), firstComponent);
|
fileInfo.setFile(QDir(*d), firstComponent);
|
||||||
if (fileInfo.exists()) {
|
if (fileInfo.exists())
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
++d;
|
++d;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -808,9 +801,9 @@ QString Config::findFile(const Location& location,
|
|||||||
QString extracted = extractedDirs[fileInfo.filePath()];
|
QString extracted = extractedDirs[fileInfo.filePath()];
|
||||||
++c;
|
++c;
|
||||||
fileInfo.setFile(QDir(extracted), *c);
|
fileInfo.setFile(QDir(extracted), *c);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
userFriendlyFilePath += QLatin1Char('?');
|
userFriendlyFilePath += QLatin1Char('?');
|
||||||
}
|
}
|
||||||
@ -876,9 +869,8 @@ QString Config::copyFile(const Location& location,
|
|||||||
|
|
||||||
char buffer[1024];
|
char buffer[1024];
|
||||||
int len;
|
int len;
|
||||||
while ((len = inFile.read(buffer, sizeof(buffer))) > 0) {
|
while ((len = inFile.read(buffer, sizeof(buffer))) > 0)
|
||||||
outFile.write(buffer, len);
|
outFile.write(buffer, len);
|
||||||
}
|
|
||||||
return outFileName;
|
return outFileName;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1002,17 +994,15 @@ void Config::load(Location location, const QString& fileName)
|
|||||||
QChar c = text.at(0);
|
QChar c = text.at(0);
|
||||||
uint cc = c.unicode();
|
uint cc = c.unicode();
|
||||||
while (i < (int) text.length()) {
|
while (i < (int) text.length()) {
|
||||||
if (cc == 0)
|
if (cc == 0) {
|
||||||
++i;
|
++i;
|
||||||
else if (c.isSpace()) {
|
} else if (c.isSpace()) {
|
||||||
SKIP_CHAR();
|
SKIP_CHAR();
|
||||||
}
|
} else if (cc == '#') {
|
||||||
else if (cc == '#') {
|
|
||||||
do {
|
do {
|
||||||
SKIP_CHAR();
|
SKIP_CHAR();
|
||||||
} while (cc != '\n');
|
} while (cc != '\n');
|
||||||
}
|
} else if (isMetaKeyChar(c)) {
|
||||||
else if (isMetaKeyChar(c)) {
|
|
||||||
Location keyLoc = location;
|
Location keyLoc = location;
|
||||||
bool plus = false;
|
bool plus = false;
|
||||||
QString stringValue;
|
QString stringValue;
|
||||||
@ -1184,15 +1174,13 @@ void Config::load(Location location, const QString& fileName)
|
|||||||
++key;
|
++key;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
location.fatal(tr("Unexpected character '%1' at beginning of line").arg(c));
|
location.fatal(tr("Unexpected character '%1' at beginning of line").arg(c));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
popWorkingDir();
|
popWorkingDir();
|
||||||
if (!workingDirs_.isEmpty()) {
|
if (!workingDirs_.isEmpty())
|
||||||
QDir::setCurrent(workingDirs_.top());
|
QDir::setCurrent(workingDirs_.top());
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList Config::getFilesHere(const QString& uncleanDir,
|
QStringList Config::getFilesHere(const QString& uncleanDir,
|
||||||
@ -1219,9 +1207,8 @@ QStringList Config::getFilesHere(const QString& uncleanDir,
|
|||||||
if (!fn->startsWith(QLatin1Char('~'))) {
|
if (!fn->startsWith(QLatin1Char('~'))) {
|
||||||
QString s = dirInfo.filePath(*fn);
|
QString s = dirInfo.filePath(*fn);
|
||||||
QString c = QDir::cleanPath(s);
|
QString c = QDir::cleanPath(s);
|
||||||
if (!excludedFiles.contains(c)) {
|
if (!excludedFiles.contains(c))
|
||||||
result.append(c);
|
result.append(c);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
++fn;
|
++fn;
|
||||||
}
|
}
|
||||||
@ -1251,9 +1238,9 @@ void Config::pushWorkingDir(const QString& dir)
|
|||||||
*/
|
*/
|
||||||
QString Config::popWorkingDir()
|
QString Config::popWorkingDir()
|
||||||
{
|
{
|
||||||
if (!workingDirs_.isEmpty()) {
|
if (!workingDirs_.isEmpty())
|
||||||
return workingDirs_.pop();
|
return workingDirs_.pop();
|
||||||
}
|
|
||||||
qDebug() << "RETURNED EMPTY WORKING DIR";
|
qDebug() << "RETURNED EMPTY WORKING DIR";
|
||||||
return QString();
|
return QString();
|
||||||
}
|
}
|
||||||
|
@ -62,7 +62,6 @@ depends += \
|
|||||||
qtsql \
|
qtsql \
|
||||||
qtsvg \
|
qtsvg \
|
||||||
qttestlib \
|
qttestlib \
|
||||||
qttools \
|
|
||||||
qtuitools \
|
qtuitools \
|
||||||
qtversit \
|
qtversit \
|
||||||
qtwidgets \
|
qtwidgets \
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
!force_bootstrap {
|
!force_bootstrap {
|
||||||
load(qfeatures)
|
load(qfeatures)
|
||||||
requires(!contains(QT_DISABLED_FEATURES, xmlstreamwriter))
|
requires(!contains(QT_DISABLED_FEATURES, xmlstreamwriter))
|
||||||
|
requires(!contains(QT_DISABLED_FEATURES, dom))
|
||||||
}
|
}
|
||||||
|
|
||||||
option(host_build)
|
option(host_build)
|
||||||
|
@ -44,7 +44,7 @@ w->setWindowState(w->windowState() ^ Qt::WindowFullScreen);
|
|||||||
|
|
||||||
|
|
||||||
//! [1]
|
//! [1]
|
||||||
w->setWindowState(w->windowState() & ~Qt::WindowMinimized | Qt::WindowActive);
|
w->setWindowState((w->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
|
||||||
//! [1]
|
//! [1]
|
||||||
|
|
||||||
|
|
||||||
|
@ -2274,7 +2274,7 @@ void QGraphicsWidget::paintWindowFrame(QPainter *painter, const QStyleOptionGrap
|
|||||||
const QPointF styleOrigin = this->windowFrameRect().topLeft();
|
const QPointF styleOrigin = this->windowFrameRect().topLeft();
|
||||||
painter->translate(styleOrigin);
|
painter->translate(styleOrigin);
|
||||||
|
|
||||||
#ifdef Q_WS_MAC
|
#ifdef Q_OS_MAC
|
||||||
const QSize pixmapSize = windowFrameRect.size();
|
const QSize pixmapSize = windowFrameRect.size();
|
||||||
if (pixmapSize.width() <= 0 || pixmapSize.height() <= 0)
|
if (pixmapSize.width() <= 0 || pixmapSize.height() <= 0)
|
||||||
return;
|
return;
|
||||||
@ -2342,7 +2342,7 @@ void QGraphicsWidget::paintWindowFrame(QPainter *painter, const QStyleOptionGrap
|
|||||||
frameOptions.midLineWidth = 1;
|
frameOptions.midLineWidth = 1;
|
||||||
style()->drawPrimitive(QStyle::PE_FrameWindow, &frameOptions, painter, widget);
|
style()->drawPrimitive(QStyle::PE_FrameWindow, &frameOptions, painter, widget);
|
||||||
|
|
||||||
#ifdef Q_WS_MAC
|
#ifdef Q_OS_MAC
|
||||||
realPainter->drawPixmap(QPoint(), pm);
|
realPainter->drawPixmap(QPoint(), pm);
|
||||||
delete painter;
|
delete painter;
|
||||||
#endif
|
#endif
|
||||||
|
@ -915,6 +915,11 @@ QStyleOptionViewItem QListView::viewOptions() const
|
|||||||
} else {
|
} else {
|
||||||
option.decorationPosition = QStyleOptionViewItem::Left;
|
option.decorationPosition = QStyleOptionViewItem::Left;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (d->gridSize().isValid()) {
|
||||||
|
option.rect.setSize(d->gridSize());
|
||||||
|
}
|
||||||
|
|
||||||
return option;
|
return option;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5026,16 +5026,6 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP
|
|||||||
if (rgn.isEmpty())
|
if (rgn.isEmpty())
|
||||||
return;
|
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;
|
const bool asRoot = flags & DrawAsRoot;
|
||||||
bool onScreen = paintOnScreen();
|
bool onScreen = paintOnScreen();
|
||||||
|
|
||||||
@ -9403,26 +9393,13 @@ QWidget *QWidgetPrivate::childAt_helper(const QPoint &p, bool ignoreChildrenInDe
|
|||||||
if (children.isEmpty())
|
if (children.isEmpty())
|
||||||
return 0;
|
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))
|
if (!pointInsideRectAndMask(p))
|
||||||
return 0;
|
return 0;
|
||||||
return childAtRecursiveHelper(p, ignoreChildrenInDestructor);
|
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) {
|
for (int i = children.size() - 1; i >= 0; --i) {
|
||||||
QWidget *child = qobject_cast<QWidget *>(children.at(i));
|
QWidget *child = qobject_cast<QWidget *>(children.at(i));
|
||||||
if (!child || child->isWindow() || child->isHidden() || child->testAttribute(Qt::WA_TransparentForMouseEvents)
|
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.
|
// Map the point 'p' from parent coordinates to child coordinates.
|
||||||
QPoint childPoint = p;
|
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();
|
childPoint -= child->data->crect.topLeft();
|
||||||
|
|
||||||
// Check if the point hits the child.
|
// 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;
|
bool newParent = (parent != parentWidget()) || !wasCreated || desktopWidget;
|
||||||
|
|
||||||
if (newParent && parent && !desktopWidget) {
|
if (newParent && parent && !desktopWidget) {
|
||||||
if (testAttribute(Qt::WA_NativeWindow) && !qApp->testAttribute(Qt::AA_DontCreateNativeWidgetSiblings)
|
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
|
|
||||||
)
|
|
||||||
parent->d_func()->enforceNativeChildren();
|
parent->d_func()->enforceNativeChildren();
|
||||||
else if (parent->d_func()->nativeChildrenForced() || parent->testAttribute(Qt::WA_PaintOnScreen))
|
else if (parent->d_func()->nativeChildrenForced() || parent->testAttribute(Qt::WA_PaintOnScreen))
|
||||||
setAttribute(Qt::WA_NativeWindow);
|
setAttribute(Qt::WA_NativeWindow);
|
||||||
@ -9879,12 +9842,6 @@ void QWidget::repaint(const QRect &rect)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (hasBackingStoreSupport()) {
|
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();
|
QTLWExtra *tlwExtra = window()->d_func()->maybeTopData();
|
||||||
if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) {
|
if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) {
|
||||||
tlwExtra->inRepaint = true;
|
tlwExtra->inRepaint = true;
|
||||||
@ -9914,12 +9871,6 @@ void QWidget::repaint(const QRegion &rgn)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (hasBackingStoreSupport()) {
|
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();
|
QTLWExtra *tlwExtra = window()->d_func()->maybeTopData();
|
||||||
if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) {
|
if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) {
|
||||||
tlwExtra->inRepaint = true;
|
tlwExtra->inRepaint = true;
|
||||||
@ -9982,12 +9933,6 @@ void QWidget::update(const QRect &rect)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (hasBackingStoreSupport()) {
|
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();
|
QTLWExtra *tlwExtra = window()->d_func()->maybeTopData();
|
||||||
if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore)
|
if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore)
|
||||||
tlwExtra->backingStoreTracker->markDirty(r, this);
|
tlwExtra->backingStoreTracker->markDirty(r, this);
|
||||||
@ -10017,12 +9962,6 @@ void QWidget::update(const QRegion &rgn)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (hasBackingStoreSupport()) {
|
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();
|
QTLWExtra *tlwExtra = window()->d_func()->maybeTopData();
|
||||||
if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore)
|
if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore)
|
||||||
tlwExtra->backingStoreTracker->markDirty(r, this);
|
tlwExtra->backingStoreTracker->markDirty(r, this);
|
||||||
@ -10218,13 +10157,7 @@ void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on)
|
|||||||
qApp->inputMethod()->commit();
|
qApp->inputMethod()->commit();
|
||||||
qApp->inputMethod()->update(Qt::ImEnabled);
|
qApp->inputMethod()->update(Qt::ImEnabled);
|
||||||
}
|
}
|
||||||
if (!qApp->testAttribute(Qt::AA_DontCreateNativeWidgetSiblings) && parentWidget()
|
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
|
|
||||||
)
|
|
||||||
parentWidget()->d_func()->enforceNativeChildren();
|
parentWidget()->d_func()->enforceNativeChildren();
|
||||||
if (on && !internalWinId() && testAttribute(Qt::WA_WState_Created))
|
if (on && !internalWinId() && testAttribute(Qt::WA_WState_Created))
|
||||||
d->createWinId();
|
d->createWinId();
|
||||||
@ -11544,28 +11477,6 @@ void QWidget::clearMask()
|
|||||||
setMask(QRegion());
|
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
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
#include "moc_qwidget.cpp"
|
#include "moc_qwidget.cpp"
|
||||||
|
@ -495,7 +495,7 @@ public:
|
|||||||
void setConstraints_sys();
|
void setConstraints_sys();
|
||||||
bool pointInsideRectAndMask(const QPoint &) const;
|
bool pointInsideRectAndMask(const QPoint &) const;
|
||||||
QWidget *childAt_helper(const QPoint &, bool) 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 updateGeometry_helper(bool forceUpdate);
|
||||||
|
|
||||||
void getLayoutItemMargins(int *left, int *top, int *right, int *bottom) const;
|
void getLayoutItemMargins(int *left, int *top, int *right, int *bottom) const;
|
||||||
@ -780,7 +780,6 @@ public:
|
|||||||
void finishCreateWindow_sys_Cocoa(void * /*NSWindow * */ windowRef);
|
void finishCreateWindow_sys_Cocoa(void * /*NSWindow * */ windowRef);
|
||||||
void syncCocoaMask();
|
void syncCocoaMask();
|
||||||
void finishCocoaMaskSetup();
|
void finishCocoaMaskSetup();
|
||||||
void syncUnifiedMode();
|
|
||||||
// Did we add the drawRectOriginal method?
|
// Did we add the drawRectOriginal method?
|
||||||
bool drawRectOriginalAdded;
|
bool drawRectOriginalAdded;
|
||||||
// Is the original drawRect method available?
|
// Is the original drawRect method available?
|
||||||
|
@ -838,7 +838,10 @@ QSize QCommonStylePrivate::viewItemSize(const QStyleOptionViewItem *option, int
|
|||||||
break;
|
break;
|
||||||
case QStyleOptionViewItem::Top:
|
case QStyleOptionViewItem::Top:
|
||||||
case QStyleOptionViewItem::Bottom:
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -679,6 +679,18 @@ bool qt_macWindowIsTextured(const QWidget *window)
|
|||||||
return false;
|
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
|
QMacCGStyle globals
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
@ -2425,11 +2437,6 @@ int QMacStyle::pixelMetric(PixelMetric metric, const QStyleOption *opt, const QW
|
|||||||
break;
|
break;
|
||||||
case PM_ToolBarFrameWidth:
|
case PM_ToolBarFrameWidth:
|
||||||
ret = 1;
|
ret = 1;
|
||||||
if (widget) {
|
|
||||||
if (QMainWindow * mainWindow = qobject_cast<QMainWindow *>(widget->parent()))
|
|
||||||
if (mainWindow->unifiedTitleAndToolBarOnMac())
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case PM_ScrollView_ScrollBarOverlap:
|
case PM_ScrollView_ScrollBarOverlap:
|
||||||
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7
|
#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) {
|
if (opt->state & State_Horizontal) {
|
||||||
while (y < opt->rect.height() - RectHeight - 5) {
|
while (y < opt->rect.height() - RectHeight - 5) {
|
||||||
path.moveTo(x, y);
|
path.moveTo(x, y);
|
||||||
path.addRect(x, y, RectHeight, RectHeight);
|
path.addEllipse(x, y, RectHeight, RectHeight);
|
||||||
y += 6;
|
y += 6;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
while (x < opt->rect.width() - RectHeight - 5) {
|
while (x < opt->rect.width() - RectHeight - 5) {
|
||||||
path.moveTo(x, y);
|
path.moveTo(x, y);
|
||||||
path.addRect(x, y, RectHeight, RectHeight);
|
path.addEllipse(x, y, RectHeight, RectHeight);
|
||||||
x += 6;
|
x += 6;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
p->setPen(Qt::NoPen);
|
p->setPen(Qt::NoPen);
|
||||||
QColor dark = opt->palette.dark().color();
|
QColor dark = opt->palette.dark().color().darker();
|
||||||
dark.setAlphaF(0.75);
|
dark.setAlphaF(0.50);
|
||||||
QColor light = opt->palette.light().color();
|
|
||||||
light.setAlphaF(0.6);
|
|
||||||
p->fillPath(path, light);
|
|
||||||
p->translate(1, 1);
|
|
||||||
p->fillPath(path, dark);
|
p->fillPath(path, dark);
|
||||||
p->restore();
|
p->restore();
|
||||||
|
|
||||||
@ -3437,14 +3440,8 @@ void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter
|
|||||||
if (tb->toolButtonStyle != Qt::ToolButtonIconOnly) {
|
if (tb->toolButtonStyle != Qt::ToolButtonIconOnly) {
|
||||||
needText = true;
|
needText = true;
|
||||||
if (tb->toolButtonStyle == Qt::ToolButtonTextUnderIcon) {
|
if (tb->toolButtonStyle == Qt::ToolButtonTextUnderIcon) {
|
||||||
QMainWindow *mw = w ? qobject_cast<QMainWindow *>(w->window()) : 0;
|
pr.setHeight(pixmap.size().height() / pixmap.devicePixelRatio() + 6);
|
||||||
if (mw && mw->unifiedTitleAndToolBarOnMac()) {
|
cr.adjust(0, pr.bottom(), 0, -3);
|
||||||
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);
|
|
||||||
}
|
|
||||||
alignment |= Qt::AlignCenter;
|
alignment |= Qt::AlignCenter;
|
||||||
} else {
|
} else {
|
||||||
pr.setWidth(pixmap.width() / pixmap.devicePixelRatio() + 8);
|
pr.setWidth(pixmap.width() / pixmap.devicePixelRatio() + 8);
|
||||||
@ -4442,12 +4439,34 @@ void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CE_ToolBar: {
|
case CE_ToolBar: {
|
||||||
// For unified tool bars, draw nothing.
|
const QStyleOptionToolBar *toolBar = qstyleoption_cast<const QStyleOptionToolBar *>(opt);
|
||||||
if (w) {
|
|
||||||
|
// 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 (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;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// draw background gradient
|
// draw background gradient
|
||||||
@ -6241,18 +6260,6 @@ QSize QMacStyle::sizeFromContents(ContentsType ct, const QStyleOption *opt,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CT_ToolButton:
|
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.rwidth() += 10;
|
||||||
sz.rheight() += 10;
|
sz.rheight() += 10;
|
||||||
return sz;
|
return sz;
|
||||||
|
@ -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
|
|
@ -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
|
|
@ -2042,7 +2042,7 @@ QList<QTextEdit::ExtraSelection> QTextEdit::extraSelections() const
|
|||||||
This function returns a new MIME data object to represent the contents
|
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
|
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
|
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
|
If you reimplement this function, note that the ownership of the returned
|
||||||
QMimeData object is passed to the caller. The selection can be retrieved
|
QMimeData object is passed to the caller. The selection can be retrieved
|
||||||
|
@ -57,11 +57,6 @@
|
|||||||
#include <qwidgetaction.h>
|
#include <qwidgetaction.h>
|
||||||
#include <qtimer.h>
|
#include <qtimer.h>
|
||||||
#include <private/qwidgetaction_p.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 <private/qmainwindowlayout_p.h>
|
||||||
|
|
||||||
#include "qtoolbar_p.h"
|
#include "qtoolbar_p.h"
|
||||||
@ -74,14 +69,6 @@
|
|||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
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
|
// qmainwindow.cpp
|
||||||
extern QMainWindowLayout *qt_mainwindow_layout(const QMainWindow *window);
|
extern QMainWindowLayout *qt_mainwindow_layout(const QMainWindow *window);
|
||||||
|
|
||||||
@ -104,17 +91,6 @@ void QToolBarPrivate::init()
|
|||||||
layout = new QToolBarLayout(q);
|
layout = new QToolBarLayout(q);
|
||||||
layout->updateMarginAndSpacing();
|
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 = new QAction(q);
|
||||||
toggleViewAction->setCheckable(true);
|
toggleViewAction->setCheckable(true);
|
||||||
q->setMovable(q->style()->styleHint(QStyle::SH_ToolBar_Movable, 0, q ));
|
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;
|
flags |= Qt::FramelessWindowHint;
|
||||||
|
|
||||||
if (unplug) {
|
if (unplug)
|
||||||
flags |= Qt::X11BypassWindowManagerHint;
|
flags |= Qt::X11BypassWindowManagerHint;
|
||||||
#ifdef Q_WS_MAC
|
|
||||||
flags |= Qt::WindowStaysOnTopHint;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
q->setWindowFlags(flags);
|
q->setWindowFlags(flags);
|
||||||
}
|
}
|
||||||
@ -272,7 +244,7 @@ bool QToolBarPrivate::mousePressEvent(QMouseEvent *event)
|
|||||||
QStyleOptionToolBar opt;
|
QStyleOptionToolBar opt;
|
||||||
q->initStyleOption(&opt);
|
q->initStyleOption(&opt);
|
||||||
if (q->style()->subElementRect(QStyle::SE_ToolBarHandle, &opt, q).contains(event->pos()) == false) {
|
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
|
// 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
|
// drag between toolbar contents to move the window. Make this work by
|
||||||
// implementing the standard mouse-dragging code and then call
|
// implementing the standard mouse-dragging code and then call
|
||||||
@ -306,7 +278,7 @@ bool QToolBarPrivate::mouseReleaseEvent(QMouseEvent*)
|
|||||||
endDrag();
|
endDrag();
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
#ifdef Q_WS_MAC
|
#ifdef Q_OS_OSX
|
||||||
if (!macWindowDragging)
|
if (!macWindowDragging)
|
||||||
return false;
|
return false;
|
||||||
macWindowDragging = false;
|
macWindowDragging = false;
|
||||||
@ -322,7 +294,7 @@ bool QToolBarPrivate::mouseMoveEvent(QMouseEvent *event)
|
|||||||
Q_Q(QToolBar);
|
Q_Q(QToolBar);
|
||||||
|
|
||||||
if (!state) {
|
if (!state) {
|
||||||
#ifdef Q_WS_MAC
|
#ifdef Q_OS_OSX
|
||||||
if (!macWindowDragging)
|
if (!macWindowDragging)
|
||||||
return false;
|
return false;
|
||||||
QWidget *w = q->window();
|
QWidget *w = q->window();
|
||||||
@ -569,16 +541,6 @@ QToolBar::QToolBar(const QString &title, QWidget *parent)
|
|||||||
*/
|
*/
|
||||||
QToolBar::~QToolBar()
|
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
|
/*! \property QToolBar::movable
|
||||||
@ -665,12 +627,6 @@ void QToolBar::setAllowedAreas(Qt::ToolBarAreas areas)
|
|||||||
Qt::ToolBarAreas QToolBar::allowedAreas() const
|
Qt::ToolBarAreas QToolBar::allowedAreas() const
|
||||||
{
|
{
|
||||||
Q_D(const QToolBar);
|
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;
|
return d->allowedAreas;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1083,15 +1039,6 @@ static bool waitForPopup(QToolBar *tb, QWidget *popup)
|
|||||||
return false;
|
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 */
|
/*! \reimp */
|
||||||
bool QToolBar::event(QEvent *event)
|
bool QToolBar::event(QEvent *event)
|
||||||
{
|
{
|
||||||
@ -1115,22 +1062,9 @@ bool QToolBar::event(QEvent *event)
|
|||||||
case QEvent::Show:
|
case QEvent::Show:
|
||||||
d->toggleViewAction->setChecked(event->type() == QEvent::Show);
|
d->toggleViewAction->setChecked(event->type() == QEvent::Show);
|
||||||
emit visibilityChanged(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;
|
break;
|
||||||
case QEvent::ParentChange:
|
case QEvent::ParentChange:
|
||||||
d->layout->checkUsePopupMenu();
|
d->layout->checkUsePopupMenu();
|
||||||
#if defined(Q_WS_MAC)
|
|
||||||
if (parentWidget() && parentWidget()->isWindow())
|
|
||||||
qt_mac_updateToolBarButtonHint(parentWidget());
|
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case QEvent::MouseButtonPress: {
|
case QEvent::MouseButtonPress: {
|
||||||
|
@ -75,7 +75,7 @@ public:
|
|||||||
allowedAreas(Qt::AllToolBarAreas), orientation(Qt::Horizontal),
|
allowedAreas(Qt::AllToolBarAreas), orientation(Qt::Horizontal),
|
||||||
toolButtonStyle(Qt::ToolButtonIconOnly),
|
toolButtonStyle(Qt::ToolButtonIconOnly),
|
||||||
layout(0), state(0)
|
layout(0), state(0)
|
||||||
#ifdef Q_WS_MAC
|
#ifdef Q_OS_OSX
|
||||||
, macWindowDragging(false)
|
, macWindowDragging(false)
|
||||||
#endif
|
#endif
|
||||||
{ }
|
{ }
|
||||||
@ -107,7 +107,7 @@ public:
|
|||||||
};
|
};
|
||||||
DragState *state;
|
DragState *state;
|
||||||
|
|
||||||
#ifdef Q_WS_MAC
|
#ifdef Q_OS_OSX
|
||||||
bool macWindowDragging;
|
bool macWindowDragging;
|
||||||
QPoint macWindowDragPressPosition;
|
QPoint macWindowDragPressPosition;
|
||||||
#endif
|
#endif
|
||||||
|
@ -332,20 +332,6 @@ void QToolBarLayout::updateGeomArray() const
|
|||||||
|
|
||||||
rpick(o, that->hint) += handleExtent;
|
rpick(o, that->hint) += handleExtent;
|
||||||
that->hint += QSize(2*margin, 2*margin);
|
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;
|
that->dirty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -401,15 +387,6 @@ void QToolBarLayout::setGeometry(const QRect &rect)
|
|||||||
if (!extension->isHidden())
|
if (!extension->isHidden())
|
||||||
extension->hide();
|
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)
|
bool QToolBarLayout::layoutActions(const QSize &size)
|
||||||
|
@ -155,15 +155,6 @@ macx {
|
|||||||
widgets/qmaccocoaviewcontainer_mac.mm
|
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*: {
|
wince*: {
|
||||||
SOURCES += widgets/qmenu_wince.cpp
|
SOURCES += widgets/qmenu_wince.cpp
|
||||||
HEADERS += widgets/qmenu_wince_resource_p.h
|
HEADERS += widgets/qmenu_wince_resource_p.h
|
||||||
|
@ -121,9 +121,7 @@ private slots:
|
|||||||
|
|
||||||
// Map/unmap large file
|
// Map/unmap large file
|
||||||
void mapFile();
|
void mapFile();
|
||||||
#ifndef Q_OS_MAC
|
|
||||||
void mapOffsetOverflow();
|
void mapOffsetOverflow();
|
||||||
#endif
|
|
||||||
|
|
||||||
void closeFile() { largeFile.close(); }
|
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
|
//Mac: memory-mapping beyond EOF may succeed but it could generate bus error on access
|
||||||
#ifndef Q_OS_MAC
|
|
||||||
void tst_LargeFile::mapOffsetOverflow()
|
void tst_LargeFile::mapOffsetOverflow()
|
||||||
{
|
{
|
||||||
|
#ifndef Q_OS_MAC
|
||||||
// Out-of-range mappings should fail, and not silently clip the offset
|
// Out-of-range mappings should fail, and not silently clip the offset
|
||||||
for (int i = 50; i < 63; ++i) {
|
for (int i = 50; i < 63; ++i) {
|
||||||
uchar *address = 0;
|
uchar *address = 0;
|
||||||
@ -529,8 +527,8 @@ void tst_LargeFile::mapOffsetOverflow()
|
|||||||
address = largeFile.map(((qint64)1 << i) + blockSize, blockSize);
|
address = largeFile.map(((qint64)1 << i) + blockSize, blockSize);
|
||||||
QVERIFY( !address );
|
QVERIFY( !address );
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
QTEST_APPLESS_MAIN(tst_LargeFile)
|
QTEST_APPLESS_MAIN(tst_LargeFile)
|
||||||
#include "tst_largefile.moc"
|
#include "tst_largefile.moc"
|
||||||
|
@ -193,6 +193,8 @@ private slots:
|
|||||||
|
|
||||||
void isReadable();
|
void isReadable();
|
||||||
|
|
||||||
|
void cdNonreadable();
|
||||||
|
|
||||||
void cdBelowRoot();
|
void cdBelowRoot();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -1990,6 +1992,23 @@ void tst_QDir::isReadable()
|
|||||||
#endif
|
#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()
|
void tst_QDir::cdBelowRoot()
|
||||||
{
|
{
|
||||||
#if defined (Q_OS_UNIX)
|
#if defined (Q_OS_UNIX)
|
||||||
|
@ -52,7 +52,7 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#endif
|
#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
|
#define Q_XDG_PLATFORM
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -289,9 +289,9 @@ void tst_qstandardpaths::testDataLocation()
|
|||||||
{
|
{
|
||||||
// On all platforms, DataLocation should be GenericDataLocation / organization name / app name
|
// On all platforms, DataLocation should be GenericDataLocation / organization name / app name
|
||||||
// This allows one app to access the data of another app.
|
// 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.
|
// 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);
|
const QString base = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
|
||||||
QCOMPARE(QStandardPaths::writableLocation(QStandardPaths::DataLocation), base + "/tst_qstandardpaths");
|
QCOMPARE(QStandardPaths::writableLocation(QStandardPaths::DataLocation), base + "/tst_qstandardpaths");
|
||||||
QCoreApplication::instance()->setOrganizationName("Qt");
|
QCoreApplication::instance()->setOrganizationName("Qt");
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
TEMPLATE = subdirs
|
TEMPLATE = subdirs
|
||||||
SUBDIRS = qmimedatabase-xml
|
SUBDIRS = qmimedatabase-xml
|
||||||
unix:!mac: SUBDIRS += qmimedatabase-cache
|
unix:!mac:!qnx: SUBDIRS += qmimedatabase-cache
|
||||||
|
@ -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("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("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("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).
|
// Test Qt::RFC2822Date format (RFC 2822).
|
||||||
QTest::newRow("RFC 2822") << QString::fromLatin1("13 Feb 1987 13:24:51 +0100")
|
QTest::newRow("RFC 2822") << QString::fromLatin1("13 Feb 1987 13:24:51 +0100")
|
||||||
|
@ -2787,6 +2787,13 @@ void tst_QDateTime::daylightTransitions() const
|
|||||||
|
|
||||||
void tst_QDateTime::timeZones() 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");
|
QTimeZone nzTz = QTimeZone("Pacific/Auckland");
|
||||||
|
|
||||||
// During Standard Time NZ is +12:00
|
// During Standard Time NZ is +12:00
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user