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"
|
||||
CXXFLAGS="$SYSROOT_FLAG"
|
||||
|
||||
while [ "$#" -gt 0 ]; do
|
||||
PARAM=$1
|
||||
case $PARAM in
|
||||
-L*|-l*)
|
||||
LFLAGS="$LFLAGS $PARAM"
|
||||
;;
|
||||
-I*)
|
||||
INC=`echo $PARAM | sed -e 's/^-I//'`
|
||||
INCLUDEPATH="$INCLUDEPATH $INC"
|
||||
;;
|
||||
-D*)
|
||||
CXXFLAGS="$CXXFLAGS $PARAM"
|
||||
;;
|
||||
*) ;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
# debuggery
|
||||
[ "$VERBOSE" = "yes" ] && echo "Determining architecture... ($*)"
|
||||
|
||||
@ -26,7 +44,7 @@ CXXFLAGS="$SYSROOT_FLAG"
|
||||
test -d "$OUTDIR/config.tests/arch" || mkdir -p "$OUTDIR/config.tests/arch"
|
||||
cd "$OUTDIR/config.tests/arch"
|
||||
[ -f Makefile ] && $MAKE distclean >/dev/null 2>&1
|
||||
OUTDIR=$OUTDIR "$OUTDIR/bin/qmake" -nocache -spec "$QMKSPEC" "QT_BUILD_TREE=$OUTDIR" "LIBS+=$LFLAGS" "QMAKE_CXXFLAGS+=$CXXFLAGS" "CONFIG-=app_bundle" "$SRCDIR/config.tests/arch/arch$PROSUFFIX.pro" >/dev/null 2>&1 || echo "qmake is broken" >&2
|
||||
OUTDIR=$OUTDIR "$OUTDIR/bin/qmake" -nocache -spec "$QMKSPEC" "QT_BUILD_TREE=$OUTDIR" "LIBS+=$LFLAGS" "QMAKE_CXXFLAGS+=$CXXFLAGS" "INCLUDEPATH+=$INCLUDEPATH" "CONFIG-=app_bundle" "$SRCDIR/config.tests/arch/arch$PROSUFFIX.pro" >/dev/null 2>&1 || echo "qmake is broken" >&2
|
||||
|
||||
|
||||
ARCH=""
|
||||
|
@ -40,6 +40,7 @@
|
||||
****************************************************************************/
|
||||
|
||||
#include <linux/input.h>
|
||||
#include <linux/kd.h>
|
||||
|
||||
enum {
|
||||
e1 = ABS_PRESSURE,
|
||||
|
134
configure
vendored
134
configure
vendored
@ -95,7 +95,7 @@ if [ x"$1" = x"-top-level" ]; then
|
||||
fi
|
||||
|
||||
# later cache the command line in config.status
|
||||
OPT_CMDLINE=`echo $@ | sed "s,-v ,,g; s,-v$,,g"`
|
||||
OPT_CMDLINE=`echo $@ | sed 's,-v ,,g; s,-v$,,g'`
|
||||
|
||||
# initialize global variables
|
||||
QMAKE_SWITCHES=
|
||||
@ -170,7 +170,7 @@ expandQMakeConf()
|
||||
{
|
||||
while read line; do case "$line" in
|
||||
include*)
|
||||
inc_file=`echo "$line" | sed -n -e "/^include.*(.*)/s/include.*(\(.*\)).*$/\1/p"`
|
||||
inc_file=`echo "$line" | sed -n -e '/^include.*(.*)/s/include.*(\(.*\)).*$/\1/p'`
|
||||
current_dir=`dirname "$1"`
|
||||
conf_file="$current_dir/$inc_file"
|
||||
if [ ! -f "$conf_file" ]; then
|
||||
@ -450,7 +450,7 @@ resolveDeviceMkspec()
|
||||
match_count=$(echo "$result" | wc -w)
|
||||
if [ "$match_count" -gt 1 ]; then
|
||||
echo >&2 "Error: Multiple matches for device '$1'. Candidates are:"
|
||||
tabbed_result=$(echo "$result" | sed "s,^, ,")
|
||||
tabbed_result=$(echo "$result" | sed 's,^, ,')
|
||||
echo >&2 "$tabbed_result"
|
||||
echo "undefined"
|
||||
elif [ "$match_count" -eq 0 ]; then
|
||||
@ -829,33 +829,33 @@ while [ "$#" -gt 0 ]; do
|
||||
case "$1" in
|
||||
#Autoconf style options
|
||||
--enable-*)
|
||||
VAR=`echo $1 | sed "s,^--enable-\(.*\),\1,"`
|
||||
VAR=`echo $1 | sed 's,^--enable-\(.*\),\1,'`
|
||||
VAL=yes
|
||||
;;
|
||||
--disable-*)
|
||||
VAR=`echo $1 | sed "s,^--disable-\(.*\),\1,"`
|
||||
VAR=`echo $1 | sed 's,^--disable-\(.*\),\1,'`
|
||||
VAL=no
|
||||
;;
|
||||
--*=*)
|
||||
VAR=`echo $1 | sed "s,^--\(.*\)=.*,\1,"`
|
||||
VAL=`echo $1 | sed "s,^--.*=\(.*\),\1,"`
|
||||
VAR=`echo $1 | sed 's,^--\(.*\)=.*,\1,'`
|
||||
VAL=`echo $1 | sed 's,^--.*=\(.*\),\1,'`
|
||||
;;
|
||||
--no-*)
|
||||
VAR=`echo $1 | sed "s,^--no-\(.*\),\1,"`
|
||||
VAR=`echo $1 | sed 's,^--no-\(.*\),\1,'`
|
||||
VAL=no
|
||||
;;
|
||||
--*)
|
||||
VAR=`echo $1 | sed "s,^--\(.*\),\1,"`
|
||||
VAR=`echo $1 | sed 's,^--\(.*\),\1,'`
|
||||
VAL=yes
|
||||
;;
|
||||
#Qt plugin options
|
||||
-no-*-*|-plugin-*-*|-qt-*-*)
|
||||
VAR=`echo $1 | sed "s,^-[^-]*-\(.*\),\1,"`
|
||||
VAL=`echo $1 | sed "s,^-\([^-]*\).*,\1,"`
|
||||
VAR=`echo $1 | sed 's,^-[^-]*-\(.*\),\1,'`
|
||||
VAL=`echo $1 | sed 's,^-\([^-]*\).*,\1,'`
|
||||
;;
|
||||
#Qt style no options
|
||||
-no-*)
|
||||
VAR=`echo $1 | sed "s,^-no-\(.*\),\1,"`
|
||||
VAR=`echo $1 | sed 's,^-no-\(.*\),\1,'`
|
||||
VAL=no
|
||||
;;
|
||||
#Qt style options that pass an argument
|
||||
@ -900,14 +900,14 @@ while [ "$#" -gt 0 ]; do
|
||||
-android-ndk-host| \
|
||||
-android-arch| \
|
||||
-android-toolchain-version)
|
||||
VAR=`echo $1 | sed "s,^-\(.*\),\1,"`
|
||||
VAR=`echo $1 | sed 's,^-\(.*\),\1,'`
|
||||
shift
|
||||
VAL="$1"
|
||||
;;
|
||||
#Qt style complex options in one command
|
||||
-enable-*|-disable-*)
|
||||
VAR=`echo $1 | sed "s,^-\([^-]*\)-.*,\1,"`
|
||||
VAL=`echo $1 | sed "s,^-[^-]*-\(.*\),\1,"`
|
||||
VAR=`echo $1 | sed 's,^-\([^-]*\)-.*,\1,'`
|
||||
VAL=`echo $1 | sed 's,^-[^-]*-\(.*\),\1,'`
|
||||
;;
|
||||
-system-proxies)
|
||||
VAR=system-proxies
|
||||
@ -919,8 +919,8 @@ while [ "$#" -gt 0 ]; do
|
||||
;;
|
||||
#Qt Builtin/System style options
|
||||
-no-*|-system-*|-qt-*)
|
||||
VAR=`echo $1 | sed "s,^-[^-]*-\(.*\),\1,"`
|
||||
VAL=`echo $1 | sed "s,^-\([^-]*\)-.*,\1,"`
|
||||
VAR=`echo $1 | sed 's,^-[^-]*-\(.*\),\1,'`
|
||||
VAL=`echo $1 | sed 's,^-\([^-]*\)-.*,\1,'`
|
||||
;;
|
||||
#Options that cannot be generalized
|
||||
-k|-continue)
|
||||
@ -948,7 +948,7 @@ while [ "$#" -gt 0 ]; do
|
||||
fi
|
||||
;;
|
||||
-hostprefix)
|
||||
VAR=`echo $1 | sed "s,^-\(.*\),\1,"`
|
||||
VAR=`echo $1 | sed 's,^-\(.*\),\1,'`
|
||||
# this option may or may not be followed by an argument
|
||||
if [ -z "$2" ] || echo "$2" | grep '^-' >/dev/null 2>&1; then
|
||||
VAL=$outpath
|
||||
@ -1038,7 +1038,7 @@ while [ "$#" -gt 0 ]; do
|
||||
;;
|
||||
#General options, including Qt style yes options
|
||||
-*)
|
||||
VAR=`echo $1 | sed "s,^-\(.*\),\1,"`
|
||||
VAR=`echo $1 | sed 's,^-\(.*\),\1,'`
|
||||
VAL="yes"
|
||||
;;
|
||||
*)
|
||||
@ -1396,7 +1396,7 @@ while [ "$#" -gt 0 ]; do
|
||||
fi
|
||||
;;
|
||||
feature-*)
|
||||
FEATURE=`echo $VAR | sed "s,^[^-]*-\([^-]*\),\1," | tr 'abcdefghijklmnopqrstuvwxyz-' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
|
||||
FEATURE=`echo $VAR | sed 's,^[^-]*-\([^-]*\),\1,' | tr 'abcdefghijklmnopqrstuvwxyz-' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
|
||||
if [ "$VAL" = "no" ]; then
|
||||
QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_$FEATURE"
|
||||
elif [ "$VAL" = "yes" ] || [ "$VAL" = "unknown" ]; then
|
||||
@ -1908,8 +1908,8 @@ while [ "$#" -gt 0 ]; do
|
||||
fi
|
||||
# now $VAL is "no", "qt", or "plugin"
|
||||
OPT="$VAL"
|
||||
VAL=`echo $VAR | sed "s,^[^-]*-\([^-]*\).*,\1,"`
|
||||
VAR=`echo $VAR | sed "s,^\([^-]*\).*,\1,"`
|
||||
VAL=`echo $VAR | sed 's,^[^-]*-\([^-]*\).*,\1,'`
|
||||
VAR=`echo $VAR | sed 's,^\([^-]*\).*,\1,'`
|
||||
|
||||
# Grab the available values
|
||||
case "$VAR" in
|
||||
@ -1975,7 +1975,7 @@ while [ "$#" -gt 0 ]; do
|
||||
fi
|
||||
elif [ "$VAL" = "no" ]; then
|
||||
if [ "$OPT_VERBOSE" = "$VAL" ] && echo "$QMAKE_SWITCHES" | grep ' -d' >/dev/null 2>&1; then
|
||||
QMAKE_SWITCHES=`echo $QMAKE_SWITCHES | sed "s, -d,,"`
|
||||
QMAKE_SWITCHES=`echo $QMAKE_SWITCHES | sed 's, -d,,'`
|
||||
else
|
||||
OPT_VERBOSE=no
|
||||
fi
|
||||
@ -3047,7 +3047,7 @@ elif [ "$Edition" = "Preview" ]; then
|
||||
done
|
||||
elif [ "$Edition" != "OpenSource" ]; then
|
||||
if [ -n "$ExpiryDate" ]; then
|
||||
ExpiryDate=`echo $ExpiryDate | sed -e "s,-,,g" | tr -d "\n\r"`
|
||||
ExpiryDate=`echo $ExpiryDate | sed -e 's,-,,g' | tr -d '\n\r'`
|
||||
[ -z "$ExpiryDate" ] && ExpiryDate="0"
|
||||
Today=`date +%Y%m%d`
|
||||
if [ "$Today" -gt "$ExpiryDate" ]; then
|
||||
@ -3510,7 +3510,7 @@ function normalize(dir)
|
||||
{
|
||||
do {
|
||||
odir = dir
|
||||
gsub(/\/[^\/]+\/\.\./, "", dir)
|
||||
sub(/\/[^\/]+\/\.\./, "", dir)
|
||||
} while (dir != odir);
|
||||
do {
|
||||
odir = dir
|
||||
@ -3566,7 +3566,7 @@ if [ -z "$CFG_BUILD_PARTS" ]; then
|
||||
|
||||
# don't build tools by default when cross-compiling
|
||||
if [ "$PLATFORM" != "$XPLATFORM" ]; then
|
||||
CFG_BUILD_PARTS=`echo "$CFG_BUILD_PARTS" | sed "s, tools,,g"`
|
||||
CFG_BUILD_PARTS=`echo "$CFG_BUILD_PARTS" | sed 's, tools,,g'`
|
||||
fi
|
||||
fi
|
||||
for nobuild in $CFG_NOBUILD_PARTS; do
|
||||
@ -4017,7 +4017,7 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
|
||||
|
||||
if "$WHICH" makedepend >/dev/null 2>&1 && grep 'depend:' "$mkfile" >/dev/null 2>&1; then
|
||||
(cd "$outpath/qmake" && "$MAKE" -f "$mkfile" depend) >/dev/null 2>&1
|
||||
sed "s,^.*/\([^/]*.o\):,\1:,g" "$mkfile" >"$mkfile.tmp"
|
||||
sed 's,^.*/\([^/]*.o\):,\1:,g' "$mkfile" >"$mkfile.tmp"
|
||||
sed "s,$outpath,$adjoutpath,g" "$mkfile.tmp" >"$mkfile"
|
||||
rm "$mkfile.tmp"
|
||||
fi
|
||||
@ -4155,7 +4155,7 @@ compileTest()
|
||||
|
||||
# Use config.tests/arch/arch.pro to have the compiler tell us what the target architecture is
|
||||
OUTFILE=$outpath/arch.result
|
||||
"$unixtests/arch.test" "$XQMAKESPEC" $OPT_VERBOSE "$relpath" "$outpath" "$OUTFILE" "target"
|
||||
"$unixtests/arch.test" "$XQMAKESPEC" $OPT_VERBOSE "$relpath" "$outpath" "$OUTFILE" "target" $I_FLAGS $D_FLAGS $L_FLAGS
|
||||
if [ $? -eq 0 ]; then
|
||||
eval `cat "$OUTFILE"`
|
||||
else
|
||||
@ -4168,7 +4168,7 @@ rm -f "$OUTFILE" 2>/dev/null
|
||||
|
||||
if [ "$QMAKESPEC" != "$XQMAKESPEC" ]; then
|
||||
# Do the same test again, using the host compiler
|
||||
SYSROOT_FLAG= "$unixtests/arch.test" "$QMAKESPEC" $OPT_VERBOSE "$relpath" "$outpath" "$OUTFILE" "host"
|
||||
SYSROOT_FLAG= "$unixtests/arch.test" "$QMAKESPEC" $OPT_VERBOSE "$relpath" "$outpath" "$OUTFILE" "host" $I_FLAGS $D_FLAGS $L_FLAGS
|
||||
if [ $? -eq 0 ]; then
|
||||
eval `cat "$OUTFILE"`
|
||||
else
|
||||
@ -5118,6 +5118,42 @@ if compileTest x11/xlib "XLib"; then
|
||||
QT_CONFIG="$QT_CONFIG xlib"
|
||||
fi
|
||||
|
||||
# auto-detect Xrender support
|
||||
if [ "$CFG_XRENDER" != "no" ]; then
|
||||
if compileTest x11/xrender "Xrender"; then
|
||||
CFG_XRENDER=yes
|
||||
QT_CONFIG="$QT_CONFIG xrender"
|
||||
else
|
||||
if [ "$CFG_XRENDER" = "yes" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
|
||||
echo "Xrender support cannot be enabled due to functionality tests!"
|
||||
echo " Turn on verbose messaging (-v) to $0 to see the final report."
|
||||
echo " If you believe this message is in error you may use the continue"
|
||||
echo " switch (-continue) to $0 to continue."
|
||||
exit 101
|
||||
else
|
||||
CFG_XRENDER=no
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# auto-detect XInput2 support
|
||||
if [ "$CFG_XINPUT2" != "no" ]; then
|
||||
if compileTest x11/xinput2 "XInput2"; then
|
||||
CFG_XINPUT2=yes
|
||||
CFG_XINPUT=no
|
||||
else
|
||||
if [ "$CFG_XINPUT2" = "yes" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
|
||||
echo "XInput2 support cannot be enabled due to functionality tests!"
|
||||
echo " Turn on verbose messaging (-v) to $0 to see the final report."
|
||||
echo " If you believe this message is in error you may use the continue"
|
||||
echo " switch (-continue) to $0 to continue."
|
||||
exit 101
|
||||
else
|
||||
CFG_XINPUT2=no
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$CFG_XCB" != "no" ]; then
|
||||
if [ -n "$PKG_CONFIG" ] && $PKG_CONFIG --exists "xcb >= 1.5" 2>/dev/null; then
|
||||
QMAKE_CFLAGS_XCB="`$PKG_CONFIG --cflags xcb 2>/dev/null`"
|
||||
@ -5177,42 +5213,6 @@ if [ "$CFG_XCB" != "no" ]; then
|
||||
QT_CONFIG="$QT_CONFIG xcb-sm"
|
||||
fi
|
||||
fi
|
||||
|
||||
# auto-detect Xrender support
|
||||
if [ "$CFG_XRENDER" != "no" ]; then
|
||||
if compileTest x11/xrender "Xrender"; then
|
||||
CFG_XRENDER=yes
|
||||
QT_CONFIG="$QT_CONFIG xrender"
|
||||
else
|
||||
if [ "$CFG_XRENDER" = "yes" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
|
||||
echo "Xrender support cannot be enabled due to functionality tests!"
|
||||
echo " Turn on verbose messaging (-v) to $0 to see the final report."
|
||||
echo " If you believe this message is in error you may use the continue"
|
||||
echo " switch (-continue) to $0 to continue."
|
||||
exit 101
|
||||
else
|
||||
CFG_XRENDER=no
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# auto-detect XInput2 support. Needed by xcb too.
|
||||
if [ "$CFG_XINPUT2" != "no" ]; then
|
||||
if compileTest x11/xinput2 "XInput2"; then
|
||||
CFG_XINPUT2=yes
|
||||
CFG_XINPUT=no
|
||||
else
|
||||
if [ "$CFG_XINPUT2" = "yes" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
|
||||
echo "XInput2 support cannot be enabled due to functionality tests!"
|
||||
echo " Turn on verbose messaging (-v) to $0 to see the final report."
|
||||
echo " If you believe this message is in error you may use the continue"
|
||||
echo " switch (-continue) to $0 to continue."
|
||||
exit 101
|
||||
else
|
||||
CFG_XINPUT2=no
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
else
|
||||
if [ "$CFG_XCB" != "auto" ]; then
|
||||
echo "The test for linking against libxcb failed!"
|
||||
@ -6319,10 +6319,10 @@ EOF
|
||||
cfgdNeg=
|
||||
if [ true ] && echo "$cfgd" | grep 'QT_NO_' >/dev/null 2>&1; then
|
||||
# QT_NO_option can be forcefully turned on by QT_option
|
||||
cfgdNeg=`echo $cfgd | sed "s,QT_NO_,QT_,"`
|
||||
cfgdNeg=`echo $cfgd | sed 's,QT_NO_,QT_,'`
|
||||
elif [ true ] && echo "$cfgd" | grep 'QT_' >/dev/null 2>&1; then
|
||||
# QT_option can be forcefully turned off by QT_NO_option
|
||||
cfgdNeg=`echo $cfgd | sed "s,QT_,QT_NO_,"`
|
||||
cfgdNeg=`echo $cfgd | sed 's,QT_,QT_NO_,'`
|
||||
fi
|
||||
|
||||
if [ -z $cfgdNeg ]; then
|
||||
|
@ -30,6 +30,7 @@ Cpp.ignoretokens += \
|
||||
Q_DECL_DEPRECATED \
|
||||
Q_DECL_NOEXCEPT \
|
||||
Q_DECL_NOTHROW \
|
||||
Q_DECL_UNUSED \
|
||||
Q_DECLARATIVE_EXPORT \
|
||||
Q_EXPLICIT \
|
||||
Q_EXPORT \
|
||||
|
@ -29,7 +29,7 @@
|
||||
\example effects/fademessage
|
||||
\title Fade Message Effect Example
|
||||
\ingroup examples-graphicsview-graphicseffects
|
||||
\brief Demonstrates how to appliy effects on items in the view
|
||||
\brief Demonstrates how to apply effects on items in the view
|
||||
|
||||
\div { style="text-align: left"}
|
||||
\inlineimage fademessageeffect-example.png
|
||||
|
@ -72,7 +72,7 @@ QEglFSImx6Hooks::QEglFSImx6Hooks()
|
||||
qputenv("FB_MULTI_BUFFER", "2");
|
||||
}
|
||||
|
||||
mNativeDisplay = fbGetDisplayByIndex(0);
|
||||
mNativeDisplay = fbGetDisplayByIndex(framebufferIndex());
|
||||
fbGetDisplayGeometry(mNativeDisplay, &width, &height);
|
||||
mScreenSize.setHeight(height);
|
||||
mScreenSize.setWidth(width);
|
||||
|
@ -8,4 +8,7 @@ contains(TEMPLATE, ".*app") {
|
||||
INSTALLS *= target
|
||||
}
|
||||
}
|
||||
} else: contains(TEMPLATE, "lib"):!QTDIR_build:android_install {
|
||||
target.path = /libs/$$ANDROID_TARGET_ARCH/
|
||||
INSTALLS *= target
|
||||
}
|
||||
|
@ -97,6 +97,7 @@ probase = $$relative_path($$_PRO_FILE_PWD_, $$dirname(_QMAKE_CONF_)/examples)
|
||||
TEMPLATE = aux
|
||||
CONFIG -= have_target qt staticlib dll
|
||||
SOURCES =
|
||||
OBJECTIVE_SOURCES =
|
||||
INSTALLS -= target
|
||||
}
|
||||
}
|
||||
|
@ -174,10 +174,19 @@ QT_CPU_FEATURES = $$eval(QT_CPU_FEATURES.$$QT_ARCH)
|
||||
mips_dsp_assembler.name = assembling[mips_dsp] ${QMAKE_FILE_IN}
|
||||
silent:mips_dsp_assembler.commands = @echo assembling[mips_dsp] ${QMAKE_FILE_IN} && $$mips_dsp_assembler.commands
|
||||
QMAKE_EXTRA_COMPILERS += mips_dsp_compiler
|
||||
QMAKE_EXTRA_COMPILERS += mips_dsp_assembler
|
||||
}
|
||||
mips_dspr2 {
|
||||
HEADERS += $$MIPS_DSP_HEADERS
|
||||
|
||||
mips_dspr2_compiler.commands = $$QMAKE_CXX -c
|
||||
mips_dspr2_compiler.commands += $(CXXFLAGS) $(INCPATH) ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
|
||||
mips_dspr2_compiler.dependency_type = TYPE_C
|
||||
mips_dspr2_compiler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_OBJ)}
|
||||
mips_dspr2_compiler.input = MIPS_DSPR2_SOURCES
|
||||
mips_dspr2_compiler.variable_out = OBJECTS
|
||||
mips_dspr2_compiler.name = compiling[mips_dspr2] ${QMAKE_FILE_IN}
|
||||
silent:mips_dspr2_compiler.commands = @echo compiling[mips_dspr2] ${QMAKE_FILE_IN} && $$mips_dspr2_compiler.commands
|
||||
mips_dspr2_assembler.commands = $$QMAKE_CC -c
|
||||
mips_dspr2_assembler.commands += $(CFLAGS) $(INCPATH) ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
|
||||
mips_dspr2_assembler.dependency_type = TYPE_C
|
||||
@ -186,6 +195,7 @@ QT_CPU_FEATURES = $$eval(QT_CPU_FEATURES.$$QT_ARCH)
|
||||
mips_dspr2_assembler.variable_out = OBJECTS
|
||||
mips_dspr2_assembler.name = assembling[mips_dspr2] ${QMAKE_FILE_IN}
|
||||
silent:mips_dspr2_assembler.commands = @echo assembling[mips_dspr2] ${QMAKE_FILE_IN} && $$mips_dspr2_assembler.commands
|
||||
QMAKE_EXTRA_COMPILERS += mips_dspr2_compiler
|
||||
QMAKE_EXTRA_COMPILERS += mips_dspr2_assembler
|
||||
}
|
||||
} else:win32-msvc*|winrt {
|
||||
@ -297,7 +307,7 @@ QT_CPU_FEATURES = $$eval(QT_CPU_FEATURES.$$QT_ARCH)
|
||||
$$AVX_SOURCES $$AVX2_SOURCES \
|
||||
$$NEON_SOURCES $$NEON_ASM \
|
||||
$$IWMMXT_SOURCES \
|
||||
$$MIPS_DSP_SOURCES $$MIPS_DSP_ASM $$MIPS_DSPR2_ASM
|
||||
$$MIPS_DSP_SOURCES $$MIPS_DSPR2_SOURCES $$MIPS_DSP_ASM $$MIPS_DSPR2_ASM
|
||||
|
||||
# Headers are already done in the above sections.
|
||||
}
|
||||
|
@ -65,7 +65,6 @@ depends += \
|
||||
qtsvg \
|
||||
qtsysteminfo \
|
||||
qttestlib \
|
||||
qttools \
|
||||
qtuitools \
|
||||
qtversit \
|
||||
qtwebkit \
|
||||
|
@ -44,6 +44,7 @@
|
||||
#include "msvc_objectmodel.h"
|
||||
#include "msvc_vcproj.h"
|
||||
#include "msvc_vcxproj.h"
|
||||
#include <qscopedpointer.h>
|
||||
#include <qstringlist.h>
|
||||
#include <qfileinfo.h>
|
||||
|
||||
@ -1795,11 +1796,11 @@ void VCXProjectWriter::addFilters(VCProject &project, XmlOutput &xmlFilter, cons
|
||||
// outputs a given filter for all existing configurations of a project
|
||||
void VCXProjectWriter::outputFilter(VCProject &project, XmlOutput &xml, XmlOutput &xmlFilter, const QString &filtername)
|
||||
{
|
||||
XNode *root;
|
||||
QScopedPointer<XNode> root;
|
||||
if (project.SingleProjects.at(0).flat_files)
|
||||
root = new XFlatNode;
|
||||
root.reset(new XFlatNode);
|
||||
else
|
||||
root = new XTreeNode;
|
||||
root.reset(new XTreeNode);
|
||||
|
||||
for (int i = 0; i < project.SingleProjects.count(); ++i) {
|
||||
VCFilter filter;
|
||||
|
@ -42,6 +42,7 @@
|
||||
#include "msvc_objectmodel.h"
|
||||
#include "msvc_vcproj.h"
|
||||
#include "msvc_vcxproj.h"
|
||||
#include <qscopedpointer.h>
|
||||
#include <qstringlist.h>
|
||||
#include <qfileinfo.h>
|
||||
|
||||
@ -2854,11 +2855,11 @@ void VCProjectWriter::write(XmlOutput &xml, VCFilter &tool)
|
||||
// outputs a given filter for all existing configurations of a project
|
||||
void VCProjectWriter::outputFilter(VCProject &project, XmlOutput &xml, const QString &filtername)
|
||||
{
|
||||
Node *root;
|
||||
QScopedPointer<Node> root;
|
||||
if (project.SingleProjects.at(0).flat_files)
|
||||
root = new FlatNode;
|
||||
root.reset(new FlatNode);
|
||||
else
|
||||
root = new TreeNode;
|
||||
root.reset(new TreeNode);
|
||||
|
||||
QString name, extfilter, guid;
|
||||
triState parse = unset;
|
||||
|
@ -889,30 +889,9 @@ void QMakeEvaluator::visitProVariable(
|
||||
default: // whatever - cannot happen
|
||||
case TokAssign: // =
|
||||
zipEmpty(&varVal);
|
||||
if (!m_cumulative) {
|
||||
// FIXME: add check+warning about accidental value removal.
|
||||
// This may be a bit too noisy, though.
|
||||
m_valuemapStack.top()[varName] = varVal;
|
||||
} else {
|
||||
if (!varVal.isEmpty()) {
|
||||
// We are greedy for values. But avoid exponential growth.
|
||||
ProStringList &v = valuesRef(varName);
|
||||
if (v.isEmpty()) {
|
||||
v = varVal;
|
||||
} else {
|
||||
ProStringList old = v;
|
||||
v = varVal;
|
||||
QSet<ProString> has;
|
||||
has.reserve(v.size());
|
||||
foreach (const ProString &s, v)
|
||||
has.insert(s);
|
||||
v.reserve(v.size() + old.size());
|
||||
foreach (const ProString &s, old)
|
||||
if (!has.contains(s))
|
||||
v << s;
|
||||
}
|
||||
}
|
||||
}
|
||||
// FIXME: add check+warning about accidental value removal.
|
||||
// This may be a bit too noisy, though.
|
||||
m_valuemapStack.top()[varName] = varVal;
|
||||
debugMsg(2, "assigning");
|
||||
break;
|
||||
case TokAppendUnique: // *=
|
||||
@ -928,7 +907,7 @@ void QMakeEvaluator::visitProVariable(
|
||||
if (!m_cumulative) {
|
||||
removeEach(&valuesRef(varName), varVal);
|
||||
} else {
|
||||
// We are stingy with our values, too.
|
||||
// We are stingy with our values.
|
||||
}
|
||||
debugMsg(2, "removing");
|
||||
break;
|
||||
@ -1850,14 +1829,12 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateFile(
|
||||
VisitReturn ok = visitProFile(pro, type, flags);
|
||||
m_current = m_locationStack.pop();
|
||||
pro->deref();
|
||||
#ifdef PROEVALUATOR_FULL
|
||||
if (ok == ReturnTrue && !(flags & LoadHidden)) {
|
||||
ProStringList &iif = m_valuemapStack.first()[ProKey("QMAKE_INTERNAL_INCLUDED_FILES")];
|
||||
ProString ifn(fileName);
|
||||
if (!iif.contains(ifn))
|
||||
iif << ifn;
|
||||
}
|
||||
#endif
|
||||
return ok;
|
||||
} else {
|
||||
return ReturnFalse;
|
||||
@ -1970,13 +1947,11 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateFileInto(
|
||||
if (ret != ReturnTrue)
|
||||
return ret;
|
||||
*values = visitor.m_valuemapStack.top();
|
||||
#ifdef PROEVALUATOR_FULL
|
||||
ProKey qiif("QMAKE_INTERNAL_INCLUDED_FILES");
|
||||
ProStringList &iif = m_valuemapStack.first()[qiif];
|
||||
foreach (const ProString &ifn, values->value(qiif))
|
||||
if (!iif.contains(ifn))
|
||||
iif << ifn;
|
||||
#endif
|
||||
return ReturnTrue;
|
||||
}
|
||||
|
||||
|
@ -34,6 +34,7 @@ import java.io.FileOutputStream;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.DataInputStream;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
@ -816,6 +817,21 @@ public class QtActivity extends Activity
|
||||
public void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
try {
|
||||
m_activityInfo = getPackageManager().getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);
|
||||
for (Field f : Class.forName("android.R$style").getDeclaredFields()) {
|
||||
if (f.getInt(null) == m_activityInfo.getThemeResource()) {
|
||||
QT_ANDROID_THEMES = new String[] {f.getName()};
|
||||
QT_ANDROID_DEFAULT_THEME = f.getName();
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
setTheme(Class.forName("android.R$style").getDeclaredField(QT_ANDROID_DEFAULT_THEME).getInt(null));
|
||||
} catch (Exception e) {
|
||||
@ -840,14 +856,6 @@ public class QtActivity extends Activity
|
||||
ENVIRONMENT_VARIABLES += "\tQT_ANDROID_THEME=" + QT_ANDROID_DEFAULT_THEME
|
||||
+ "/\tQT_ANDROID_THEME_DISPLAY_DPI=" + getResources().getDisplayMetrics().densityDpi + "\t";
|
||||
|
||||
try {
|
||||
m_activityInfo = getPackageManager().getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);
|
||||
} catch (NameNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
|
||||
if (null == getLastNonConfigurationInstance()) {
|
||||
// if splash screen is defined, then show it
|
||||
if (m_activityInfo.metaData.containsKey("android.app.splash_screen") )
|
||||
|
@ -111,3 +111,17 @@ ctest_qt5_module_files.files += $$ctest_macros_file.output $$cmake_extras_mkspec
|
||||
ctest_qt5_module_files.path = $$[QT_INSTALL_LIBS]/cmake/Qt5Core
|
||||
|
||||
INSTALLS += ctest_qt5_module_files cmake_qt5_umbrella_module_files
|
||||
|
||||
mips_dsp:*-g++* {
|
||||
HEADERS += $$MIPS_DSP_HEADERS
|
||||
|
||||
mips_dsp_corelib_assembler.commands = $$QMAKE_CXX -c
|
||||
mips_dsp_corelib_assembler.commands += $(CXXFLAGS) $(INCPATH) -mips32r2 -mdsp ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
|
||||
mips_dsp_corelib_assembler.dependency_type = TYPE_C
|
||||
mips_dsp_corelib_assembler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_OBJ)}
|
||||
mips_dsp_corelib_assembler.input = MIPS_DSP_ASM
|
||||
mips_dsp_corelib_assembler.variable_out = OBJECTS
|
||||
mips_dsp_corelib_assembler.name = assembling[mips_dsp] ${QMAKE_FILE_IN}
|
||||
silent:mips_dsp_corelib_assembler.commands = @echo assembling[mips_dsp] ${QMAKE_FILE_IN} && $$mips_dsp_corelib_assembler.commands
|
||||
QMAKE_EXTRA_COMPILERS += mips_dsp_corelib_assembler
|
||||
}
|
||||
|
@ -256,7 +256,7 @@
|
||||
# if defined(__EDG__)
|
||||
# define Q_CC_EDG
|
||||
# endif
|
||||
/* Compaq have disabled EDG's _BOOL macro and use _BOOL_EXISTS instead
|
||||
/* Compaq has disabled EDG's _BOOL macro and uses _BOOL_EXISTS instead
|
||||
- observed on Compaq C++ V6.3-002.
|
||||
In any case versions prior to Compaq C++ V6.0-005 do not have bool. */
|
||||
# if !defined(_BOOL_EXISTS)
|
||||
@ -794,13 +794,13 @@
|
||||
# define Q_COMPILER_DECLTYPE
|
||||
# define Q_COMPILER_RVALUE_REFS
|
||||
# define Q_COMPILER_STATIC_ASSERT
|
||||
// MSVC's library has std::initilizer_list, but the compiler does not support the braces initialization
|
||||
// MSVC's library has std::initializer_list, but the compiler does not support the braces initialization
|
||||
//# define Q_COMPILER_INITIALIZER_LISTS
|
||||
//# define Q_COMPILER_UNIFORM_INIT
|
||||
# endif
|
||||
# if _MSC_VER >= 1700
|
||||
/* C++11 features supported in VC11 = VC2012: */
|
||||
# undef Q_DECL_OVERRIDE /* undo 2005/2098 settings... */
|
||||
# undef Q_DECL_OVERRIDE /* undo 2005/2008 settings... */
|
||||
# undef Q_DECL_FINAL /* undo 2005/2008 settings... */
|
||||
# define Q_COMPILER_EXPLICIT_OVERRIDES /* ...and use std C++11 now */
|
||||
# define Q_COMPILER_RANGE_FOR
|
||||
|
@ -829,18 +829,18 @@ Q_CORE_EXPORT void qFreeAligned(void *ptr);
|
||||
#endif
|
||||
#if defined(QT_NO_WARNINGS)
|
||||
# if defined(Q_CC_MSVC)
|
||||
# pragma warning(disable: 4251) /* class 'A' needs to have dll interface for to be used by clients of class 'B'. */
|
||||
# pragma warning(disable: 4244) /* 'conversion' conversion from 'type1' to 'type2', possible loss of data */
|
||||
# pragma warning(disable: 4251) /* class 'type' needs to have dll-interface to be used by clients of class 'type2' */
|
||||
# pragma warning(disable: 4244) /* conversion from 'type1' to 'type2', possible loss of data */
|
||||
# pragma warning(disable: 4275) /* non - DLL-interface classkey 'identifier' used as base for DLL-interface classkey 'identifier' */
|
||||
# pragma warning(disable: 4514) /* unreferenced inline/local function has been removed */
|
||||
# pragma warning(disable: 4514) /* unreferenced inline function has been removed */
|
||||
# pragma warning(disable: 4800) /* 'type' : forcing value to bool 'true' or 'false' (performance warning) */
|
||||
# pragma warning(disable: 4097) /* typedef-name 'identifier1' used as synonym for class-name 'identifier2' */
|
||||
# pragma warning(disable: 4706) /* assignment within conditional expression */
|
||||
# pragma warning(disable: 4786) /* truncating debug info after 255 characters */
|
||||
# pragma warning(disable: 4786) /* 'identifier' : identifier was truncated to 'number' characters in the debug information */
|
||||
# pragma warning(disable: 4355) /* 'this' : used in base member initializer list */
|
||||
# pragma warning(disable: 4231) /* nonstandard extension used : 'extern' before template explicit instantiation */
|
||||
# pragma warning(disable: 4231) /* nonstandard extension used : 'identifier' before template explicit instantiation */
|
||||
# pragma warning(disable: 4710) /* function not inlined */
|
||||
# pragma warning(disable: 4530) /* C++ exception handler used, but unwind semantics are not enabled. Specify -GX */
|
||||
# pragma warning(disable: 4530) /* C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc */
|
||||
# elif defined(Q_CC_BOR)
|
||||
# pragma option -w-inl
|
||||
# pragma option -w-aus
|
||||
|
@ -102,7 +102,7 @@ static inline bool hasStdErr()
|
||||
}
|
||||
# endif // !Q_OS_WINCE && !Q_OS_WINRT
|
||||
|
||||
bool qWinLogToStderr()
|
||||
Q_CORE_EXPORT bool qWinLogToStderr()
|
||||
{
|
||||
# if !defined(Q_OS_WINCE) && !defined(Q_OS_WINRT)
|
||||
static const bool result = hasStdErr();
|
||||
|
@ -144,6 +144,8 @@ win32 {
|
||||
}
|
||||
} else:blackberry {
|
||||
SOURCES += io/qstandardpaths_blackberry.cpp
|
||||
} else:android {
|
||||
SOURCES += io/qstandardpaths_android.cpp
|
||||
} else {
|
||||
SOURCES += io/qstandardpaths_unix.cpp
|
||||
}
|
||||
|
@ -855,7 +855,7 @@ QString QDir::fromNativeSeparators(const QString &pathName)
|
||||
/*!
|
||||
Changes the QDir's directory to \a dirName.
|
||||
|
||||
Returns \c true if the new directory exists and is readable;
|
||||
Returns \c true if the new directory exists;
|
||||
otherwise returns \c false. Note that the logical cd() operation is
|
||||
not performed if the new directory does not exist.
|
||||
|
||||
@ -923,7 +923,7 @@ bool QDir::cd(const QString &dirName)
|
||||
Changes directory by moving one directory up from the QDir's
|
||||
current directory.
|
||||
|
||||
Returns \c true if the new directory exists and is readable;
|
||||
Returns \c true if the new directory exists;
|
||||
otherwise returns \c false. Note that the logical cdUp() operation is
|
||||
not performed if the new directory does not exist.
|
||||
|
||||
|
@ -571,6 +571,8 @@ QFile::rename(const QString &newName)
|
||||
d->setError(QFile::RenameError, tr("Destination file exists"));
|
||||
return false;
|
||||
}
|
||||
#ifndef QT_NO_TEMPORARYFILE
|
||||
// This #ifndef disables the workaround it encloses. Therefore, this configuration is not recommended.
|
||||
#ifdef Q_OS_LINUX
|
||||
// rename() on Linux simply does nothing when renaming "foo" to "Foo" on a case-insensitive
|
||||
// FS, such as FAT32. Move the file away and rename in 2 steps to work around.
|
||||
@ -598,7 +600,8 @@ QFile::rename(const QString &newName)
|
||||
arg(QDir::toNativeSeparators(tempFile.fileName()), tempFile.errorString()));
|
||||
}
|
||||
return false;
|
||||
#endif
|
||||
#endif // Q_OS_LINUX
|
||||
#endif // QT_NO_TEMPORARYFILE
|
||||
}
|
||||
unsetError();
|
||||
close();
|
||||
|
@ -77,6 +77,7 @@ QFileSystemWatcherEngine *QFileSystemWatcherPrivate::createNativeEngine(QObject
|
||||
#elif defined(Q_OS_FREEBSD) || defined(Q_OS_MAC)
|
||||
return QKqueueFileSystemWatcherEngine::create(parent);
|
||||
#else
|
||||
Q_UNUSED(parent);
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
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
|
||||
characters.
|
||||
|
||||
This function return an empty QByteArra if \a domain is not a valid
|
||||
This function returns an empty QByteArray if \a domain is not a valid
|
||||
hostname. Note, in particular, that IPv6 literals are not valid domain
|
||||
names.
|
||||
*/
|
||||
|
@ -2334,6 +2334,31 @@ void QAbstractItemModel::doSetRoleNames(const QHash<int,QByteArray> &roleNames)
|
||||
|
||||
Returns the model's role names.
|
||||
|
||||
The default role names set by Qt are:
|
||||
|
||||
\table
|
||||
\header
|
||||
\li Qt Role
|
||||
\li QML Role Name
|
||||
\row
|
||||
\li Qt::DisplayRole
|
||||
\li display
|
||||
\row
|
||||
\li Qt::DecorationRole
|
||||
\li decoration
|
||||
\row
|
||||
\li Qt::EditRole
|
||||
\li edit
|
||||
\row
|
||||
\li Qt::ToolTipRole
|
||||
\li toolTip
|
||||
\row
|
||||
\li Qt::StatusTipRole
|
||||
\li statusTip
|
||||
\row
|
||||
\li Qt::WhatsThisRole
|
||||
\li whatsThis
|
||||
\endtable
|
||||
*/
|
||||
QHash<int,QByteArray> QAbstractItemModel::roleNames() const
|
||||
{
|
||||
@ -3378,6 +3403,9 @@ Qt::ItemFlags QAbstractTableModel::flags(const QModelIndex &index) const
|
||||
of the rowCount() and data() functions. Well behaved models also provide
|
||||
a headerData() implementation.
|
||||
|
||||
If your model is used within QML and requires roles other than the
|
||||
default ones provided by the roleNames() function, you must override it.
|
||||
|
||||
For editable list models, you must also provide an implementation of
|
||||
setData(), implement the flags() function so that it returns a value
|
||||
containing \l{Qt::ItemFlags}{Qt::ItemIsEditable}.
|
||||
|
@ -46,6 +46,7 @@ QT_BEGIN_NAMESPACE
|
||||
static JavaVM *g_javaVM = Q_NULLPTR;
|
||||
static jobject g_jActivity = Q_NULLPTR;
|
||||
static jobject g_jClassLoader = Q_NULLPTR;
|
||||
static jint g_androidSdkVersion = 0;
|
||||
|
||||
static inline bool exceptionCheck(JNIEnv *env)
|
||||
{
|
||||
@ -60,6 +61,19 @@ static inline bool exceptionCheck(JNIEnv *env)
|
||||
return false;
|
||||
}
|
||||
|
||||
static void setAndroidSdkVersion(JNIEnv *env)
|
||||
{
|
||||
jclass androidVersionClass = env->FindClass("android/os/Build$VERSION");
|
||||
if (exceptionCheck(env))
|
||||
return;
|
||||
|
||||
jfieldID androidSDKFieldID = env->GetStaticFieldID(androidVersionClass, "SDK_INT", "I");
|
||||
if (exceptionCheck(env))
|
||||
return;
|
||||
|
||||
g_androidSdkVersion = env->GetStaticIntField(androidVersionClass, androidSDKFieldID);
|
||||
}
|
||||
|
||||
jint QtAndroidPrivate::initJNI(JavaVM *vm, JNIEnv *env)
|
||||
{
|
||||
jclass jQtNative = env->FindClass("org/qtproject/qt5/android/QtNative");
|
||||
@ -93,6 +107,8 @@ jint QtAndroidPrivate::initJNI(JavaVM *vm, JNIEnv *env)
|
||||
if (exceptionCheck(env))
|
||||
return JNI_ERR;
|
||||
|
||||
setAndroidSdkVersion(env);
|
||||
|
||||
g_jClassLoader = env->NewGlobalRef(classLoader);
|
||||
env->DeleteLocalRef(classLoader);
|
||||
g_jActivity = env->NewGlobalRef(activity);
|
||||
@ -118,4 +134,9 @@ jobject QtAndroidPrivate::classLoader()
|
||||
return g_jClassLoader;
|
||||
}
|
||||
|
||||
jint QtAndroidPrivate::androidSdkVersion()
|
||||
{
|
||||
return g_androidSdkVersion;
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
@ -64,6 +64,7 @@ namespace QtAndroidPrivate
|
||||
Q_CORE_EXPORT JavaVM *javaVM();
|
||||
Q_CORE_EXPORT jint initJNI(JavaVM *vm, JNIEnv *env);
|
||||
jobject classLoader();
|
||||
jint androidSdkVersion();
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
@ -2180,7 +2180,9 @@ void QObject::deleteLater()
|
||||
|
||||
const char *qFlagLocation(const char *method)
|
||||
{
|
||||
QThreadData::current()->flaggedSignatures.store(method);
|
||||
QThreadData *currentThreadData = QThreadData::current(false);
|
||||
if (currentThreadData != 0)
|
||||
currentThreadData->flaggedSignatures.store(method);
|
||||
return method;
|
||||
}
|
||||
|
||||
@ -3553,8 +3555,11 @@ void QMetaObject::activate(QObject *sender, int signalOffset, int local_signal_i
|
||||
{
|
||||
int signal_index = signalOffset + local_signal_index;
|
||||
|
||||
if (!sender->d_func()->isSignalConnected(signal_index))
|
||||
if (!sender->d_func()->isSignalConnected(signal_index)
|
||||
&& !qt_signal_spy_callback_set.signal_begin_callback
|
||||
&& !qt_signal_spy_callback_set.signal_end_callback) {
|
||||
return; // nothing connected to these signals, and no spy
|
||||
}
|
||||
|
||||
if (sender->d_func()->blockSig)
|
||||
return;
|
||||
|
@ -247,7 +247,7 @@ public:
|
||||
|
||||
Returns \c true if the signal with index \a signal_index from object \a sender is connected.
|
||||
Signals with indices above a certain range are always considered connected (see connectedSignals
|
||||
in QObjectPrivate). If a signal spy is installed, all signals are considered connected.
|
||||
in QObjectPrivate).
|
||||
|
||||
\a signal_index must be the index returned by QObjectPrivate::signalIndex;
|
||||
*/
|
||||
@ -256,9 +256,7 @@ inline bool QObjectPrivate::isSignalConnected(uint signal_index) const
|
||||
return signal_index >= sizeof(connectedSignals) * 8
|
||||
|| (connectedSignals[signal_index >> 5] & (1 << (signal_index & 0x1f))
|
||||
|| (declarativeData && QAbstractDeclarativeData::isSignalConnected
|
||||
&& QAbstractDeclarativeData::isSignalConnected(declarativeData, q_func(), signal_index))
|
||||
|| qt_signal_spy_callback_set.signal_begin_callback
|
||||
|| qt_signal_spy_callback_set.signal_end_callback);
|
||||
&& QAbstractDeclarativeData::isSignalConnected(declarativeData, q_func(), signal_index)));
|
||||
}
|
||||
|
||||
inline QObjectPrivate::Sender *QObjectPrivate::setCurrentSender(QObject *receiver,
|
||||
|
@ -232,7 +232,7 @@ public:
|
||||
QThreadData(int initialRefCount = 1);
|
||||
~QThreadData();
|
||||
|
||||
static QThreadData *current();
|
||||
static QThreadData *current(bool createIfNecessary = true);
|
||||
static void clearCurrentThreadData();
|
||||
static QThreadData *get2(QThread *thread)
|
||||
{ Q_ASSERT_X(thread != 0, "QThread", "internal error"); return thread->d_func()->data; }
|
||||
|
@ -215,10 +215,10 @@ void QThreadData::clearCurrentThreadData()
|
||||
clear_thread_data();
|
||||
}
|
||||
|
||||
QThreadData *QThreadData::current()
|
||||
QThreadData *QThreadData::current(bool createIfNecessary)
|
||||
{
|
||||
QThreadData *data = get_thread_data();
|
||||
if (!data) {
|
||||
if (!data && createIfNecessary) {
|
||||
data = new QThreadData;
|
||||
QT_TRY {
|
||||
set_thread_data(data);
|
||||
|
@ -141,11 +141,11 @@ void QThreadData::clearCurrentThreadData()
|
||||
TlsSetValue(qt_current_thread_data_tls_index, 0);
|
||||
}
|
||||
|
||||
QThreadData *QThreadData::current()
|
||||
QThreadData *QThreadData::current(bool createIfNecessary)
|
||||
{
|
||||
qt_create_tls();
|
||||
QThreadData *threadData = reinterpret_cast<QThreadData *>(TlsGetValue(qt_current_thread_data_tls_index));
|
||||
if (!threadData) {
|
||||
if (!threadData && createIfNecessary) {
|
||||
threadData = new QThreadData;
|
||||
// This needs to be called prior to new AdoptedThread() to
|
||||
// avoid recursion.
|
||||
|
@ -720,7 +720,8 @@ QStringList QCommandLineParser::values(const QString &optionName) const
|
||||
*/
|
||||
bool QCommandLineParser::isSet(const QCommandLineOption &option) const
|
||||
{
|
||||
return isSet(option.names().first());
|
||||
// option.names() might be empty if the constructor failed
|
||||
return !option.names().isEmpty() && isSet(option.names().first());
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -1284,6 +1284,11 @@ QDate QDate::fromString(const QString& string, Qt::DateFormat format)
|
||||
}
|
||||
#endif // QT_NO_TEXTDATE
|
||||
case Qt::ISODate: {
|
||||
// Semi-strict parsing, must be long enough and have non-numeric separators
|
||||
if (string.size() < 10 || string.at(4).isDigit() || string.at(7).isDigit()
|
||||
|| (string.size() > 10 && string.at(10).isDigit())) {
|
||||
return QDate();
|
||||
}
|
||||
const int year = string.mid(0, 4).toInt();
|
||||
if (year <= 0 || year > 9999)
|
||||
return QDate();
|
||||
@ -1900,7 +1905,7 @@ int QTime::msecsTo(const QTime &t) const
|
||||
|
||||
#ifndef QT_NO_DATESTRING
|
||||
|
||||
static QTime fromIsoTimeString(const QString &string, Qt::DateFormat format, bool *isMidnight24)
|
||||
static QTime fromIsoTimeString(const QStringRef &string, Qt::DateFormat format, bool *isMidnight24)
|
||||
{
|
||||
if (isMidnight24)
|
||||
*isMidnight24 = false;
|
||||
@ -1933,9 +1938,13 @@ static QTime fromIsoTimeString(const QString &string, Qt::DateFormat format, boo
|
||||
// the maximum amount of millisecond digits it will expand to once converted to
|
||||
// seconds is 4. E.g. 12:34,99999 will expand to 12:34:59.9994. The milliseconds
|
||||
// will then be rounded up AND clamped to 999.
|
||||
const float minuteFraction = QString::fromUtf8("0.%1").arg(string.mid(6, 5)).toFloat(&ok);
|
||||
|
||||
const QStringRef minuteFractionStr = string.mid(6, 5);
|
||||
const long minuteFractionInt = minuteFractionStr.toLong(&ok);
|
||||
if (!ok)
|
||||
return QTime();
|
||||
const float minuteFraction = double(minuteFractionInt) / (std::pow(double(10), minuteFractionStr.count()));
|
||||
|
||||
const float secondWithMs = minuteFraction * 60;
|
||||
const float secondNoMs = std::floor(secondWithMs);
|
||||
const float secondFraction = secondWithMs - secondNoMs;
|
||||
@ -1947,9 +1956,11 @@ static QTime fromIsoTimeString(const QString &string, Qt::DateFormat format, boo
|
||||
if (!ok)
|
||||
return QTime();
|
||||
if (size > 8 && (string.at(8) == QLatin1Char(',') || string.at(8) == QLatin1Char('.'))) {
|
||||
const double secondFraction = QString::fromUtf8("0.%1").arg(string.mid(9, 4)).toDouble(&ok);
|
||||
const QStringRef msecStr(string.mid(9, 4));
|
||||
int msecInt = msecStr.isEmpty() ? 0 : msecStr.toInt(&ok);
|
||||
if (!ok)
|
||||
return QTime();
|
||||
const double secondFraction(msecInt / (std::pow(double(10), msecStr.count())));
|
||||
msec = qMin(qRound(secondFraction * 1000.0), 999);
|
||||
}
|
||||
}
|
||||
@ -1999,7 +2010,7 @@ QTime QTime::fromString(const QString& string, Qt::DateFormat format)
|
||||
case Qt::ISODate:
|
||||
case Qt::TextDate:
|
||||
default:
|
||||
return fromIsoTimeString(string, format, 0);
|
||||
return fromIsoTimeString(&string, format, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2767,6 +2778,15 @@ void QDateTimePrivate::refreshDateTime()
|
||||
return;
|
||||
}
|
||||
|
||||
#ifndef QT_BOOTSTRAPPED
|
||||
// If not valid time zone then is invalid
|
||||
if (m_spec == Qt::TimeZone && !m_timeZone.isValid()) {
|
||||
clearValidDateTime();
|
||||
m_offsetFromUtc = 0;
|
||||
return;
|
||||
}
|
||||
#endif // QT_BOOTSTRAPPED
|
||||
|
||||
// We have a valid date and time and a Qt::LocalTime or Qt::TimeZone that needs calculating
|
||||
// LocalTime and TimeZone might fall into "missing" DaylightTime transition hour
|
||||
// Calling toEpochMSecs will adjust the returned date/time if it does
|
||||
@ -4372,26 +4392,40 @@ QDateTime QDateTime::fromString(const QString& string, Qt::DateFormat format)
|
||||
if (size < 10)
|
||||
return QDateTime();
|
||||
|
||||
QString isoString = string;
|
||||
QStringRef isoString(&string);
|
||||
Qt::TimeSpec spec = Qt::LocalTime;
|
||||
|
||||
QDate date = QDate::fromString(isoString.left(10), Qt::ISODate);
|
||||
QDate date = QDate::fromString(string.left(10), Qt::ISODate);
|
||||
if (!date.isValid())
|
||||
return QDateTime();
|
||||
if (size == 10)
|
||||
return QDateTime(date);
|
||||
|
||||
isoString.remove(0, 11);
|
||||
isoString = isoString.right(11);
|
||||
int offset = 0;
|
||||
// Check end of string for Time Zone definition, either Z for UTC or [+-]HH:MM for Offset
|
||||
if (isoString.endsWith(QLatin1Char('Z'))) {
|
||||
spec = Qt::UTC;
|
||||
isoString.chop(1);
|
||||
isoString = isoString.left(isoString.size() - 1);
|
||||
} else {
|
||||
const int signIndex = isoString.indexOf(QRegExp(QStringLiteral("[+-]")));
|
||||
if (signIndex >= 0) {
|
||||
// the loop below is faster but functionally equal to:
|
||||
// const int signIndex = isoString.indexOf(QRegExp(QStringLiteral("[+-]")));
|
||||
const int sizeOfTimeZoneString = 4;
|
||||
int signIndex = isoString.size() - sizeOfTimeZoneString - 1;
|
||||
bool found = false;
|
||||
{
|
||||
const QChar plus = QLatin1Char('+');
|
||||
const QChar minus = QLatin1Char('-');
|
||||
do {
|
||||
QChar character(isoString.at(signIndex));
|
||||
found = character == plus || character == minus;
|
||||
} while (--signIndex >= 0 && !found);
|
||||
++signIndex;
|
||||
}
|
||||
|
||||
if (found) {
|
||||
bool ok;
|
||||
offset = fromOffsetString(isoString.mid(signIndex), &ok);
|
||||
offset = fromOffsetString(isoString.mid(signIndex).toString(), &ok);
|
||||
if (!ok)
|
||||
return QDateTime();
|
||||
isoString = isoString.left(signIndex);
|
||||
|
@ -348,6 +348,9 @@ QVariant QSystemLocalePrivate::dateTimeFormat(QLocale::FormatType type)
|
||||
|
||||
QVariant QSystemLocalePrivate::dayName(int day, QLocale::FormatType type)
|
||||
{
|
||||
if (day < 1 || day > 7)
|
||||
return QString();
|
||||
|
||||
static const LCTYPE short_day_map[]
|
||||
= { LOCALE_SABBREVDAYNAME1, LOCALE_SABBREVDAYNAME2,
|
||||
LOCALE_SABBREVDAYNAME3, LOCALE_SABBREVDAYNAME4, LOCALE_SABBREVDAYNAME5,
|
||||
|
@ -189,9 +189,23 @@ static int ucstricmp(const ushort *a, const ushort *ae, const uchar *b, const uc
|
||||
return 1;
|
||||
}
|
||||
|
||||
#if defined(__mips_dsp)
|
||||
// From qstring_mips_dsp_asm.S
|
||||
extern "C" int qt_ucstrncmp_mips_dsp_asm(const ushort *a,
|
||||
const ushort *b,
|
||||
unsigned len);
|
||||
#endif
|
||||
|
||||
// Unicode case-sensitive compare two same-sized strings
|
||||
static int ucstrncmp(const QChar *a, const QChar *b, int l)
|
||||
{
|
||||
#if defined(__mips_dsp)
|
||||
if (l >= 8) {
|
||||
return qt_ucstrncmp_mips_dsp_asm(reinterpret_cast<const ushort*>(a),
|
||||
reinterpret_cast<const ushort*>(b),
|
||||
l);
|
||||
}
|
||||
#endif // __mips_dsp
|
||||
while (l-- && *a == *b)
|
||||
a++,b++;
|
||||
if (l==-1)
|
||||
@ -3947,6 +3961,10 @@ static inline __m128i mergeQuestionMarks(__m128i chunk)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(__mips_dsp)
|
||||
extern "C" void qt_toLatin1_mips_dsp_asm(uchar *dst, const ushort *src, int length);
|
||||
#endif
|
||||
|
||||
static void toLatin1_helper(uchar *dst, const ushort *src, int length)
|
||||
{
|
||||
if (length) {
|
||||
@ -3995,10 +4013,14 @@ static void toLatin1_helper(uchar *dst, const ushort *src, int length)
|
||||
length = length % 8;
|
||||
}
|
||||
#endif
|
||||
#if defined(__mips_dsp)
|
||||
qt_toLatin1_mips_dsp_asm(dst, src, length);
|
||||
#else
|
||||
while (length--) {
|
||||
*dst++ = (*src>0xff) ? '?' : (uchar) *src;
|
||||
++src;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@ -4151,6 +4173,12 @@ QVector<uint> QString::toUcs4() const
|
||||
return v;
|
||||
}
|
||||
|
||||
#if defined(__mips_dsp)
|
||||
// From qstring_mips_dsp_asm.S
|
||||
extern "C" void qt_fromlatin1_mips_asm_unroll4 (ushort*, const char*, uint);
|
||||
extern "C" void qt_fromlatin1_mips_asm_unroll8 (ushort*, const char*, uint);
|
||||
#endif
|
||||
|
||||
QString::Data *QString::fromLatin1_helper(const char *str, int size)
|
||||
{
|
||||
Data *d;
|
||||
@ -4191,8 +4219,15 @@ QString::Data *QString::fromLatin1_helper(const char *str, int size)
|
||||
size = size % 16;
|
||||
}
|
||||
#endif
|
||||
#if defined(__mips_dsp)
|
||||
if (size > 20)
|
||||
qt_fromlatin1_mips_asm_unroll8(dst, str, size);
|
||||
else
|
||||
qt_fromlatin1_mips_asm_unroll4(dst, str, size);
|
||||
#else
|
||||
while (size--)
|
||||
*dst++ = (uchar)*str++;
|
||||
#endif
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
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>
|
||||
QVector<T>::QVector(std::initializer_list<T> args)
|
||||
{
|
||||
d = Data::allocate(args.size());
|
||||
// std::initializer_list<T>::iterator is guaranteed to be
|
||||
// const T* ([support.initlist]/1), so can be memcpy'ed away from by copyConstruct
|
||||
copyConstruct(args.begin(), args.end(), d->begin());
|
||||
d->size = int(args.size());
|
||||
if (args.size() > 0) {
|
||||
d = Data::allocate(args.size());
|
||||
// std::initializer_list<T>::iterator is guaranteed to be
|
||||
// const T* ([support.initlist]/1), so can be memcpy'ed away from by copyConstruct
|
||||
copyConstruct(args.begin(), args.end(), d->begin());
|
||||
d->size = int(args.size());
|
||||
} else {
|
||||
d = Data::sharedNull();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -198,3 +198,7 @@ INCLUDEPATH += ../3rdparty/md5 \
|
||||
!macx-icc:!vxworks:unix:LIBS_PRIVATE += -lm
|
||||
|
||||
TR_EXCLUDE += ../3rdparty/*
|
||||
|
||||
# MIPS DSP
|
||||
MIPS_DSP_ASM += tools/qstring_mips_dsp_asm.S
|
||||
MIPS_DSP_HEADERS += ../gui/painting/qt_mips_asm_dsp_p.h
|
||||
|
@ -85,3 +85,5 @@ contains(QT_CPU_FEATURES.$$QT_ARCH, sse2) {
|
||||
SOURCES += image/qimage_sse2.cpp
|
||||
SSSE3_SOURCES += image/qimage_ssse3.cpp
|
||||
}
|
||||
MIPS_DSPR2_SOURCES += image/qimage_mips_dspr2.cpp
|
||||
MIPS_DSPR2_ASM += image/qimage_mips_dspr2_asm.S
|
||||
|
@ -2172,6 +2172,12 @@ void qInitImageConversions()
|
||||
qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB32_neon;
|
||||
qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB32_neon;
|
||||
#endif
|
||||
|
||||
#ifdef QT_COMPILER_SUPPORTS_MIPS_DSPR2
|
||||
extern bool convert_ARGB_to_ARGB_PM_inplace_mips_dspr2(QImageData *data, Qt::ImageConversionFlags);
|
||||
inplace_converter_map[QImage::Format_ARGB32][QImage::Format_ARGB32_Premultiplied] = convert_ARGB_to_ARGB_PM_inplace_mips_dspr2;
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
@ -1,9 +1,9 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
|
||||
** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the QtWidgets module of the Qt Toolkit.
|
||||
** This file is part of the QtGui module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
@ -39,31 +39,31 @@
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
//
|
||||
// W A R N I N G
|
||||
// -------------
|
||||
//
|
||||
// This file is not part of the Qt API. It exists purely as an
|
||||
// implementation detail. This header file may change from version to
|
||||
// version without notice, or even be removed.
|
||||
//
|
||||
// We mean it.
|
||||
//
|
||||
|
||||
#include "qmacdefines_mac.h"
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#include "qimage.h"
|
||||
#include <private/qimage_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QMainWindowLayout;
|
||||
class QToolBar;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
@class NSToolbarItem;
|
||||
// Defined in qimage_mips_dspr2_asm.S
|
||||
//
|
||||
extern "C" void premultiply_argb_inplace_mips_asm(void*, unsigned, unsigned, int);
|
||||
|
||||
@interface QT_MANGLE_NAMESPACE(QCocoaToolBarDelegate) : NSObject {
|
||||
QT_PREPEND_NAMESPACE(QMainWindowLayout) *mainWindowLayout;
|
||||
NSToolbarItem *toolbarItem;
|
||||
bool convert_ARGB_to_ARGB_PM_inplace_mips_dspr2(QImageData *data, Qt::ImageConversionFlags)
|
||||
{
|
||||
Q_ASSERT(data->format == QImage::Format_ARGB32);
|
||||
|
||||
if (!data->width || !data->height)
|
||||
return true;
|
||||
|
||||
Q_ASSERT((data->bytes_per_line - (data->width << 2)) >= 0);
|
||||
|
||||
premultiply_argb_inplace_mips_asm(data->data,
|
||||
data->height,
|
||||
data->width,
|
||||
data->bytes_per_line - (data->width << 2));
|
||||
|
||||
data->format = QImage::Format_ARGB32_Premultiplied;
|
||||
return true;
|
||||
}
|
||||
|
||||
- (id)initWithMainWindowLayout:(QT_PREPEND_NAMESPACE(QMainWindowLayout) *)layout;
|
||||
@end
|
||||
QT_END_NAMESPACE
|
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(
|
||||
static_cast<QWindowSystemInterfacePrivate::TabletLeaveProximityEvent *>(e));
|
||||
break;
|
||||
#ifndef QT_NO_GESTURES
|
||||
case QWindowSystemInterfacePrivate::Gesture:
|
||||
QGuiApplicationPrivate::processGestureEvent(
|
||||
static_cast<QWindowSystemInterfacePrivate::GestureEvent *>(e));
|
||||
break;
|
||||
#endif
|
||||
case QWindowSystemInterfacePrivate::PlatformPanel:
|
||||
QGuiApplicationPrivate::processPlatformPanelEvent(
|
||||
static_cast<QWindowSystemInterfacePrivate::PlatformPanelEvent *>(e));
|
||||
|
@ -148,7 +148,10 @@ public:
|
||||
static void processTabletEvent(QWindowSystemInterfacePrivate::TabletEvent *e);
|
||||
static void processTabletEnterProximityEvent(QWindowSystemInterfacePrivate::TabletEnterProximityEvent *e);
|
||||
static void processTabletLeaveProximityEvent(QWindowSystemInterfacePrivate::TabletLeaveProximityEvent *e);
|
||||
|
||||
#ifndef QT_NO_GESTURES
|
||||
static void processGestureEvent(QWindowSystemInterfacePrivate::GestureEvent *e);
|
||||
#endif
|
||||
|
||||
static void processPlatformPanelEvent(QWindowSystemInterfacePrivate::PlatformPanelEvent *e);
|
||||
#ifndef QT_NO_CONTEXTMENU
|
||||
|
@ -91,7 +91,9 @@ public:
|
||||
PlatformPanel = UserInputEvent | 0x17,
|
||||
ContextMenu = UserInputEvent | 0x18,
|
||||
EnterWhatsThisMode = UserInputEvent | 0x19,
|
||||
#ifndef QT_NO_GESTURES
|
||||
Gesture = UserInputEvent | 0x1a,
|
||||
#endif
|
||||
ApplicationStateChanged = 0x19,
|
||||
FlushEvents = 0x20,
|
||||
WindowScreenChanged = 0x21
|
||||
@ -403,6 +405,7 @@ public:
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef QT_NO_GESTURES
|
||||
class GestureEvent : public InputEvent {
|
||||
public:
|
||||
GestureEvent(QWindow *window, ulong time, Qt::NativeGestureType type, QPointF pos, QPointF globalPos)
|
||||
@ -417,6 +420,7 @@ public:
|
||||
ulong sequenceId;
|
||||
quint64 intValue;
|
||||
};
|
||||
#endif
|
||||
|
||||
class WindowSystemEventList {
|
||||
QList<WindowSystemEvent *> impl;
|
||||
|
@ -436,12 +436,6 @@ inline void QT_FASTCALL storePixel<QPixelLayout::BPP24>(uchar *dest, int index,
|
||||
reinterpret_cast<quint24 *>(dest)[index] = quint24(pixel);
|
||||
}
|
||||
|
||||
template <>
|
||||
inline void QT_FASTCALL storePixel<QPixelLayout::BPP32>(uchar *dest, int index, uint pixel)
|
||||
{
|
||||
reinterpret_cast<uint *>(dest)[index] = pixel;
|
||||
}
|
||||
|
||||
template <QPixelLayout::BPP width>
|
||||
inline void QT_FASTCALL storePixels(uchar *dest, const uint *src, int index, int count)
|
||||
{
|
||||
@ -1859,7 +1853,7 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper
|
||||
return buffer;
|
||||
}
|
||||
|
||||
static const SourceFetchProc sourceFetch[NBlendTypes][QImage::NImageFormats] = {
|
||||
static SourceFetchProc sourceFetch[NBlendTypes][QImage::NImageFormats] = {
|
||||
// Untransformed
|
||||
{
|
||||
0, // Invalid
|
||||
@ -6385,6 +6379,21 @@ void qInitDrawhelperAsm()
|
||||
|
||||
destStoreProc[QImage::Format_ARGB32] = qt_destStoreARGB32_mips_dsp;
|
||||
|
||||
sourceFetch[BlendUntransformed][QImage::Format_RGB888] = qt_fetchUntransformed_888_mips_dsp;
|
||||
sourceFetch[BlendTiled][QImage::Format_RGB888] = qt_fetchUntransformed_888_mips_dsp;
|
||||
|
||||
sourceFetch[BlendUntransformed][QImage::Format_RGB444] = qt_fetchUntransformed_444_mips_dsp;
|
||||
sourceFetch[BlendTiled][QImage::Format_RGB444] = qt_fetchUntransformed_444_mips_dsp;
|
||||
|
||||
sourceFetch[BlendUntransformed][QImage::Format_ARGB8565_Premultiplied] = qt_fetchUntransformed_argb8565_premultiplied_mips_dsp;
|
||||
sourceFetch[BlendTiled][QImage::Format_ARGB8565_Premultiplied] = qt_fetchUntransformed_argb8565_premultiplied_mips_dsp;
|
||||
|
||||
#if defined(QT_COMPILER_SUPPORTS_MIPS_DSPR2)
|
||||
qBlendFunctions[QImage::Format_RGB16][QImage::Format_RGB16] = qt_blend_rgb16_on_rgb16_mips_dspr2;
|
||||
#else
|
||||
qBlendFunctions[QImage::Format_RGB16][QImage::Format_RGB16] = qt_blend_rgb16_on_rgb16_mips_dsp;
|
||||
#endif // QT_COMPILER_SUPPORTS_MIPS_DSPR2
|
||||
|
||||
#endif // QT_COMPILER_SUPPORTS_MIPS_DSP
|
||||
if (functionForModeSolidAsm) {
|
||||
const int destinationMode = QPainter::CompositionMode_Destination;
|
||||
|
@ -1,6 +1,6 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 MIPS Technologies, www.mips.com, author Damir Tatalovic <dtatalovic@mips.com>
|
||||
** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the QtGui module of the Qt Toolkit.
|
||||
@ -110,6 +110,78 @@ void qt_blend_rgb32_on_rgb32_mips_dsp(uchar *destPixels, int dbpl,
|
||||
}
|
||||
}
|
||||
|
||||
#if defined QT_COMPILER_SUPPORTS_MIPS_DSPR2
|
||||
void qt_blend_rgb16_on_rgb16_mips_dspr2(uchar *destPixels, int dbpl,
|
||||
const uchar *srcPixels, int sbpl,
|
||||
int w, int h,
|
||||
int const_alpha)
|
||||
{
|
||||
if (const_alpha == 256) {
|
||||
if (w < 256) {
|
||||
const quint16 *src = (const quint16*) srcPixels;
|
||||
quint16 *dst = (quint16*) destPixels;
|
||||
for (int y = 0; y < h; ++y) {
|
||||
qt_blend_rgb16_on_rgb16_const_alpha_256_mips_dsp_asm(dst, src, w);
|
||||
dst = (quint16*) (((uchar*) dst) + dbpl);
|
||||
src = (quint16*) (((uchar*) src) + sbpl);
|
||||
}
|
||||
}
|
||||
else {
|
||||
int length = w << 1;
|
||||
while (h--) {
|
||||
memcpy(destPixels, srcPixels, length);
|
||||
destPixels += dbpl;
|
||||
srcPixels += sbpl;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (const_alpha != 0) {
|
||||
const quint16 *src = (const quint16*) srcPixels;
|
||||
quint16 *dst = (quint16*) destPixels;
|
||||
for (int y = 0; y < h; ++y) {
|
||||
qt_blend_rgb16_on_rgb16_mips_dspr2_asm(dst, src, w, const_alpha);
|
||||
dst = (quint16*) (((uchar*) dst) + dbpl);
|
||||
src = (quint16*) (((uchar*) src) + sbpl);
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
void qt_blend_rgb16_on_rgb16_mips_dsp(uchar *destPixels, int dbpl,
|
||||
const uchar *srcPixels, int sbpl,
|
||||
int w, int h,
|
||||
int const_alpha)
|
||||
{
|
||||
if (const_alpha == 256) {
|
||||
if (w < 256) {
|
||||
const quint16 *src = (const quint16*) srcPixels;
|
||||
quint16 *dst = (quint16*) destPixels;
|
||||
for (int y = 0; y < h; ++y) {
|
||||
qt_blend_rgb16_on_rgb16_const_alpha_256_mips_dsp_asm(dst, src, w);
|
||||
dst = (quint16*) (((uchar*) dst) + dbpl);
|
||||
src = (quint16*) (((uchar*) src) + sbpl);
|
||||
}
|
||||
}
|
||||
else {
|
||||
int length = w << 1;
|
||||
while (h--) {
|
||||
memcpy(destPixels, srcPixels, length);
|
||||
destPixels += dbpl;
|
||||
srcPixels += sbpl;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (const_alpha != 0) {
|
||||
const quint16 *src = (const quint16*) srcPixels;
|
||||
quint16 *dst = (quint16*) destPixels;
|
||||
for (int y = 0; y < h; ++y) {
|
||||
qt_blend_rgb16_on_rgb16_mips_dsp_asm(dst, src, w, const_alpha);
|
||||
dst = (quint16*) (((uchar*) dst) + dbpl);
|
||||
src = (quint16*) (((uchar*) src) + sbpl);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void comp_func_Source_mips_dsp(uint *dest, const uint *src, int length, uint const_alpha)
|
||||
{
|
||||
if (const_alpha == 255) {
|
||||
@ -422,5 +494,28 @@ void QT_FASTCALL comp_func_SourceOut_mips_dsp(uint *dest, const uint *src, int l
|
||||
comp_func_SourceOut_dsp_asm_x2(dest, src, length, const_alpha);
|
||||
}
|
||||
|
||||
const uint * QT_FASTCALL qt_fetchUntransformed_888_mips_dsp (uint *buffer, const Operator *, const QSpanData *data,
|
||||
int y, int x, int length)
|
||||
{
|
||||
uchar *line = (uchar *)data->texture.scanLine(y) + x;
|
||||
fetchUntransformed_888_asm_mips_dsp(buffer, line, length);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
const uint * QT_FASTCALL qt_fetchUntransformed_444_mips_dsp (uint *buffer, const Operator *, const QSpanData *data,
|
||||
int y, int x, int length)
|
||||
{
|
||||
uchar *line = (uchar *)data->texture.scanLine(y) + x;
|
||||
fetchUntransformed_444_asm_mips_dsp(buffer, line, length);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
const uint * QT_FASTCALL qt_fetchUntransformed_argb8565_premultiplied_mips_dsp (uint *buffer, const Operator *, const QSpanData *data,
|
||||
int y, int x, int length)
|
||||
{
|
||||
uchar *line = (uchar *)data->texture.scanLine(y) + x;
|
||||
fetchUntransformed_argb8565_premultiplied_asm_mips_dsp(buffer, line, length);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
@ -1,6 +1,6 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 MIPS Technologies, www.mips.com, author Damir Tatalovic <dtatalovic@mips.com>
|
||||
** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the QtGui module of the Qt Toolkit.
|
||||
@ -1601,3 +1601,479 @@ LEAF_MIPS_DSP(qt_blend_argb32_on_argb32_const_alpha_256_mips_dsp_asm)
|
||||
nop
|
||||
|
||||
END(qt_blend_argb32_on_argb32_const_alpha_256_mips_dsp_asm)
|
||||
|
||||
|
||||
#if defined(__MIPSEL) && __MIPSEL
|
||||
# define PACK(r, s, t) packrl.ph r, s, t
|
||||
# define SWHI(r, o, b) swl r, o + 1 (b)
|
||||
# define SWLO(r, o, b) swr r, o + 0 (b)
|
||||
# define LDHI(r, o, b) lwl r, o + 1 (b)
|
||||
# define LDLO(r, o, b) lwr r, o + 2 (b)
|
||||
#else
|
||||
# define PACK(r, s, t) packrl.ph r, t, s
|
||||
# define SWHI(r, o, b) swr r, o + 1 (b)
|
||||
# define SWLO(r, o, b) swl r, o + 0 (b)
|
||||
# define LDHI(r, o, b) lwr r, o + 1 (b)
|
||||
# define LDLO(r, o, b) lwl r, o + 2 (b)
|
||||
#endif
|
||||
|
||||
LEAF_MIPS_DSP(qt_blend_rgb16_on_rgb16_const_alpha_256_mips_dsp_asm)
|
||||
/*
|
||||
* a0 - dst (*r5g6b5)
|
||||
* a1 - src (const *r5g6b5)
|
||||
* a2 - len (unsigned int)
|
||||
*
|
||||
* Register usage:
|
||||
* t0-3 - Scratch registers
|
||||
* t4 - Number of iterations to do in unrolled loops
|
||||
* t5-7 - Auxiliary scratch registers.
|
||||
*
|
||||
* Check if base addresses of src/dst are aligned, cases:
|
||||
* a) Both aligned.
|
||||
* b) Both unaligned:
|
||||
* 1. Copy a halfword
|
||||
* 2. Use aligned case.
|
||||
* c) dst aligned, src unaligned:
|
||||
* 1. Read a word from dst, halfword from src.
|
||||
* 2. Continue reading words from both.
|
||||
* d) dst unaligned, src aligned:
|
||||
* 1. Read a word from src, halfword from dst.
|
||||
* 2. Continue reading words from both.
|
||||
*/
|
||||
|
||||
beqz a2, 0f /* if (a2:len == 0): return */
|
||||
andi t0, a0, 0x3 /* t0 = a0:dst % 4 */
|
||||
andi t1, a1, 0x3 /* t1 = a1:dst % 4 */
|
||||
or t2, t0, t1 /* t1 = t0 | t1 */
|
||||
|
||||
beqz t2, 4f /* both aligned */
|
||||
nop
|
||||
beqz t0, 3f /* dst aligned, src unaligned */
|
||||
nop
|
||||
beqz t1, 2f /* src aligned, dst unaligned */
|
||||
nop
|
||||
|
||||
/*
|
||||
* Both src/dst are unaligned: read 1 halfword from each,
|
||||
* the fall-off to continue with word-aligned copy.
|
||||
*/
|
||||
lhu t0, 0 (a1) /* t0 <- ((uint16_t*) src)[0] */
|
||||
addiu a1, a1, 2 /* src++ */
|
||||
addiu a2, a2,-1 /* len-- */
|
||||
sh t0, 0 (a0) /* t1 -> ((uint16_t*) dst)[0] */
|
||||
addiu a0, a0, 2 /* dst++ */
|
||||
|
||||
/*
|
||||
* Both src/dst pointers are word-aligned, process eight
|
||||
* items at a time in an unrolled loop.
|
||||
*/
|
||||
4: beqz a2, 0f /* if (len == 0): return */
|
||||
srl t4, a2, 3 /* t4 = len / 8 */
|
||||
|
||||
beqz t4, 5f /* if (t4 == 0): tail */
|
||||
andi a2, a2, 0x07 /* len = len % 8 */
|
||||
|
||||
1: lw t0, 0 (a1)
|
||||
lw t1, 4 (a1)
|
||||
lw t2, 8 (a1)
|
||||
lw t3, 12 (a1)
|
||||
|
||||
addiu t4, t4, -1 /* t4-- */
|
||||
addiu a1, a1, 16 /* src += 8 */
|
||||
|
||||
sw t0, 0 (a0)
|
||||
sw t1, 4 (a0)
|
||||
sw t2, 8 (a0)
|
||||
sw t3, 12 (a0)
|
||||
|
||||
bnez t4, 1b
|
||||
addiu a0, a0, 16 /* dst += 8 */
|
||||
|
||||
b 5f
|
||||
nop
|
||||
|
||||
|
||||
/*
|
||||
* dst pointer is unaligned
|
||||
*/
|
||||
2: beqz a2, 0f /* if (len == 0): return */
|
||||
srl t4, a2, 3 /* t4 = len / 8 */
|
||||
beqz t4, 5f /* if (t4 == 0): tail */
|
||||
andi a2, a2, 0x07 /* len = len % 8 */
|
||||
|
||||
1: lw t0, 0 (a1)
|
||||
lw t1, 4 (a1)
|
||||
lw t2, 8 (a1)
|
||||
lw t3, 12 (a1)
|
||||
|
||||
addiu t4, t4, -1 /* t4-- */
|
||||
addiu a1, a1, 16 /* src += 8 */
|
||||
|
||||
SWLO (t0, 0, a0)
|
||||
PACK (t5, t1, t0)
|
||||
PACK (t6, t2, t1)
|
||||
PACK (t7, t3, t2)
|
||||
SWHI (t3, 14, a0)
|
||||
sw t5, 2 (a0)
|
||||
sw t6, 6 (a0)
|
||||
sw t7, 10 (a0)
|
||||
|
||||
bnez t4, 1b
|
||||
addiu a0, a0, 16 /* dst += 8 */
|
||||
|
||||
b 5f
|
||||
nop
|
||||
|
||||
/*
|
||||
* src pointer is unaligned
|
||||
*/
|
||||
3: beqz a2, 0f /* if (len == 0): return */
|
||||
srl t4, a2, 3 /* t4 = len / 8 */
|
||||
beqz t4, 5f /* if (t4 == 0): tail */
|
||||
andi a2, a2, 0x07 /* len = len % 8 */
|
||||
|
||||
1: LDHI (t0, 0, a1)
|
||||
lw t1, 2 (a1)
|
||||
lw t2, 6 (a1)
|
||||
lw t3, 10 (a1)
|
||||
LDLO (t5, 12, a1)
|
||||
|
||||
addiu t4, t4, -1 /* t4-- */
|
||||
addiu a1, a1, 16 /* src += 8 */
|
||||
|
||||
PACK (t0, t1, t0)
|
||||
PACK (t6, t2, t1)
|
||||
PACK (t7, t3, t2)
|
||||
sw t0, 0 (a0)
|
||||
PACK (t0, t5, t3)
|
||||
sw t6, 4 (a0)
|
||||
sw t7, 8 (a0)
|
||||
sw t0, 12 (a0)
|
||||
|
||||
bnez t4, 1b
|
||||
addiu a0, a0, 16 /* dst += 8 */
|
||||
|
||||
|
||||
5: /* Process remaining items (a2:len < 4), one at a time */
|
||||
beqz a2, 0f
|
||||
nop
|
||||
|
||||
1: lhu t0, 0 (a1) /* t0 <- ((uint16_t*) src)[0] */
|
||||
addiu a2, a2,-1 /* len-- */
|
||||
addiu a1, a1, 2 /* src++ */
|
||||
sh t0, 0 (a0) /* to -> ((uint16_t*) dst)[0] */
|
||||
bnez a2, 1b /* if (len != 0): loop */
|
||||
addiu a0, a0, 2 /* dst++ */
|
||||
|
||||
0: jr ra
|
||||
nop
|
||||
|
||||
END(qt_blend_rgb16_on_rgb16_const_alpha_256_mips_dsp_asm)
|
||||
|
||||
|
||||
#undef LDHI
|
||||
#undef LDLO
|
||||
#undef PACK
|
||||
#undef SWHI
|
||||
#undef SWLO
|
||||
|
||||
|
||||
LEAF_MIPS_DSP(qt_blend_rgb16_on_rgb16_mips_dsp_asm)
|
||||
/*
|
||||
* a0 - dst (*r5g6b5)
|
||||
* a1 - src (const *r5g6b5)
|
||||
* a2 - len (unsigned int) - batch length
|
||||
* a3 - alpha (int)
|
||||
*/
|
||||
|
||||
beqz a2, 2f
|
||||
li t9, 255
|
||||
sll t8, a3, 8
|
||||
subu a3, t8, a3
|
||||
srl a3, a3, 8
|
||||
subu t9, t9, a3
|
||||
addiu a3, a3, 1
|
||||
srl t4, a3, 2
|
||||
addiu t9, t9, 1
|
||||
srl t5, t9, 2
|
||||
1:
|
||||
lhu t0, 0(a1)
|
||||
lhu t1, 0(a0)
|
||||
addiu a2, a2, -1
|
||||
andi t2, t0, 0x07e0
|
||||
andi t0, t0, 0xf81f
|
||||
mul t2, t2, a3
|
||||
mul t0, t0, t4
|
||||
andi t3, t1, 0x07e0
|
||||
andi t1, t1, 0xf81f
|
||||
mul t3, t3, t9
|
||||
mul t1, t1, t5
|
||||
addiu a1, a1, 2
|
||||
srl t2, t2, 8
|
||||
srl t0, t0, 6
|
||||
andi t2, t2, 0x07e0
|
||||
andi t0, t0, 0xf81f
|
||||
or t0, t0, t2
|
||||
srl t3, t3, 8
|
||||
srl t1, t1, 6
|
||||
andi t3, t3, 0x07e0
|
||||
andi t1, t1, 0xf81f
|
||||
or t1, t1, t3
|
||||
addu t0, t0, t1
|
||||
sh t0, 0(a0)
|
||||
bgtz a2, 1b
|
||||
addiu a0, a0, 2
|
||||
2:
|
||||
jr ra
|
||||
nop
|
||||
|
||||
END(qt_blend_rgb16_on_rgb16_mips_dsp_asm)
|
||||
|
||||
|
||||
LEAF_MIPS_DSP(fetchUntransformed_888_asm_mips_dsp)
|
||||
/*
|
||||
* a0 - dst address (address of 32-bit aRGB value)
|
||||
* a1 - src address
|
||||
* a2 - length
|
||||
*/
|
||||
|
||||
beqz a2, 4f
|
||||
lui t8, 0xff00
|
||||
andi t0, a2, 0x1
|
||||
beqz t0, 1f
|
||||
nop
|
||||
/* case for one pixel */
|
||||
lbu t1, 0(a1)
|
||||
lbu v1, 2(a1)
|
||||
lbu t0, 1(a1)
|
||||
addiu a1, a1, 3
|
||||
addiu a2, a2, -1
|
||||
sll t1, t1, 0x10
|
||||
or v1, v1, t8
|
||||
sll t0, t0, 0x8
|
||||
or v1, v1, t1
|
||||
or v1, v1, t0
|
||||
sw v1, 0(a0)
|
||||
addiu a0, a0, 4
|
||||
|
||||
beqz a2, 4f /* only one pixel is present (length = 1) */
|
||||
nop
|
||||
1:
|
||||
andi t0, a1, 0x1
|
||||
beqz t0, 3f
|
||||
nop
|
||||
2:
|
||||
lbu t0, 0(a1) /* t0 = | 0 | 0 | 0 | R1 | */
|
||||
lhu t1, 1(a1) /* t1 = | 0 | 0 | B1 | G1 | */
|
||||
addiu a1, a1, 3
|
||||
lhu t2, 0(a1) /* t2 = | 0 | 0 | G2 | R2 | */
|
||||
lbu t3, 2(a1) /* t3 = | 0 | 0 | 0 | B2 | */
|
||||
|
||||
sll t0, t0, 16
|
||||
or t0, t0, t8 /* t0 = | ff | R1 | 0 | 0 | */
|
||||
shll.ph t4, t1, 8 /* t4 = | 0 | 0 | G1 | 0 | */
|
||||
srl t5, t1, 8
|
||||
or t4, t4, t5 /* t4 = | 0 | 0 | G1 | B1 | */
|
||||
or t0, t0, t4 /* t0 = | ff | R1 | G1 | B1 | */
|
||||
|
||||
shll.ph t4, t2, 8 /* t4 = | 0 | 0 | R2 | 0 | */
|
||||
srl t5, t2, 8 /* t5 = | 0 | 0 | 0 | G2 | */
|
||||
or t4, t4, t5
|
||||
sll t4, t4, 8 /* t4 = | 0 | R2 | G2 | 0 | */
|
||||
or t5, t3, t8
|
||||
or t2, t4, t5 /* t2 = | ff | R2 | G2 | B2 | */
|
||||
|
||||
sw t0, 0(a0)
|
||||
addiu a1, a1, 3
|
||||
sw t2, 4(a0)
|
||||
addiu a2, a2, -2
|
||||
bnez a2, 2b
|
||||
addiu a0, a0, 8
|
||||
b 4f
|
||||
nop
|
||||
3:
|
||||
lhu t0, 0(a1) /* t0 = | 0 | 0 | G1 | R1 | */
|
||||
lbu t1, 2(a1) /* t1 = | 0 | 0 | 0 | B1 | */
|
||||
addiu a1, a1, 3
|
||||
lbu t2, 0(a1) /* t2 = | 0 | 0 | 0 | R2 | */
|
||||
lhu t3, 1(a1) /* t3 = | 0 | 0 | B2 | G2 | */
|
||||
|
||||
srl t4, t0, 8 /* t4 = | 0 | 0 | 0 | G1 | */
|
||||
shll.ph t5, t0, 8 /* t5 = | 0 | 0 | R1 | 0 | */
|
||||
or t0, t4, t5
|
||||
sll t6, t0, 8 /* t6 = | 0 | R1 | G1 | 0 | */
|
||||
or t4, t1, t8 /* t4 = | ff | 0 | 0 | B1 | */
|
||||
or t0, t6, t4
|
||||
|
||||
sll t2, t2, 16
|
||||
srl t4, t3, 8
|
||||
shll.ph t5, t3, 8
|
||||
or t3, t4, t5
|
||||
or t2, t2, t3
|
||||
or t2, t2, t8
|
||||
|
||||
sw t0, 0(a0)
|
||||
addiu a1, a1, 3
|
||||
sw t2, 4(a0)
|
||||
addiu a2, a2, -2
|
||||
bnez a2, 3b
|
||||
addiu a0, a0, 8
|
||||
4:
|
||||
jr ra
|
||||
nop
|
||||
|
||||
END(fetchUntransformed_888_asm_mips_dsp)
|
||||
|
||||
|
||||
LEAF_MIPS_DSP(fetchUntransformed_444_asm_mips_dsp)
|
||||
/*
|
||||
* a0 - dst address (address of 32-bit aRGB value)
|
||||
* a1 - src address
|
||||
* a2 - length
|
||||
*/
|
||||
|
||||
lui t8, 0xff00
|
||||
li t4, 0x1
|
||||
|
||||
beqz a2, 5f
|
||||
move v0, a0 /* just return the address of buffer
|
||||
* for storing returning values */
|
||||
andi t0, a2, 0x1
|
||||
beqz t0, 2f /* there is more then one pixel
|
||||
* (check src memory alignment (word)) */
|
||||
nop
|
||||
1:
|
||||
lhu v0, 0(a1)
|
||||
addiu a1, a1, 2
|
||||
addiu a2, a2, -1
|
||||
andi t0, v0, 0xf00
|
||||
andi v1, v0, 0xf
|
||||
andi v0, v0, 0xf0
|
||||
sra t3, t0, 0x4
|
||||
sra t1, v0, 0x4
|
||||
sra t0, t0, 0x8
|
||||
sll t2, v1, 0x4
|
||||
or t0, t0, t3
|
||||
or v0, t1, v0
|
||||
lui t1, 0xff00
|
||||
or v1, t2, v1
|
||||
sll t0, t0, 0x10
|
||||
or v1, v1, t1
|
||||
sll v0, v0, 0x8
|
||||
or v1, v1, t0
|
||||
or v0, v1, v0
|
||||
sw v0, 0(a0)
|
||||
addiu a0, a0, 4
|
||||
beqz a2, 5f /* no more pixels for processing */
|
||||
nop
|
||||
beq a2, t4, 4f /* only one more pixel remained */
|
||||
nop
|
||||
/* check if src memory address is word aligned */
|
||||
2:
|
||||
andi t0, a1, 0x3
|
||||
beqz t0, 3f /* memory is word aligned */
|
||||
andi a3, a2, 0x1 /* set the a3 register as the comparation
|
||||
* for ending the unrolled loop
|
||||
* (1 if odd, 0 if even) */
|
||||
b 1b /* not word aligned,
|
||||
* go another turn with
|
||||
* just one pixel processing */
|
||||
nop
|
||||
3:
|
||||
lw t0, 0(a1)
|
||||
addiu a2, a2, -2
|
||||
preceu.ph.qbr t1, t0 /* t1 = | 0 | aR1 | 0 | G1B1 | */
|
||||
preceu.ph.qbl t2, t0 /* t1 = | 0 | aR2 | 0 | G2B2 | */
|
||||
shll.qb t3, t1, 4 /* t3 = | 0 | R1 0 | 0 | B1 0 | */
|
||||
srl t4, t3, 4
|
||||
or t0, t3, t4 /* t0 = | 0 | R1R1 | 0 | B1B1 | */
|
||||
andi t3, t1, 0xf0
|
||||
sll t3, t3, 8
|
||||
srl t4, t3, 4
|
||||
or t1, t3, t4
|
||||
or t0, t0, t1 /* t0 = | 0 | R1R1 | G1G1 | B1B1 | */
|
||||
or t0, t0, t8 /* t0 = | ff | R1R1 | G1G1 | B1B1 | */
|
||||
|
||||
shll.qb t3, t2, 4 /* t3 = | 0 | R1 0 | 0 | B1 0 | */
|
||||
srl t4, t3, 4
|
||||
or t7, t3, t4 /* t0 = | 0 | R1R1 | 0 | B1B1 | */
|
||||
andi t3, t2, 0xf0
|
||||
sll t3, t3, 8
|
||||
srl t4, t3, 4
|
||||
or t1, t3, t4
|
||||
or t2, t7, t1 /* t0 = | 0 | R1R1 | G1G1 | B1B1 | */
|
||||
or t2, t2, t8 /* t0 = | ff | R1R1 | G1G1 | B1B1 | */
|
||||
|
||||
sw t0, 0(a0)
|
||||
addiu a1, a1, 4
|
||||
sw t2, 4(a0)
|
||||
bne a2, a3, 3b
|
||||
addiu a0, a0, 8
|
||||
beqz a2, 5f /* no more pixels for processing */
|
||||
nop
|
||||
4:
|
||||
/* one more pixel remained (after loop unrolling process finished) */
|
||||
lhu v0, 0(a1)
|
||||
addiu a1, a1, 2
|
||||
addiu a2, a2, -1
|
||||
andi t0, v0, 0xf00
|
||||
andi v1, v0, 0xf
|
||||
andi v0, v0, 0xf0
|
||||
sra t3, t0, 0x4
|
||||
sra t1, v0, 0x4
|
||||
sra t0, t0, 0x8
|
||||
sll t2, v1, 0x4
|
||||
or t0, t0, t3
|
||||
or v0, t1, v0
|
||||
lui t1, 0xff00
|
||||
or v1, t2, v1
|
||||
sll t0, t0, 0x10
|
||||
or v1, v1, t1
|
||||
sll v0, v0, 0x8
|
||||
or v1, v1, t0
|
||||
or v0, v1, v0
|
||||
sw v0, 0(a0)
|
||||
addiu a0, a0, 4
|
||||
5:
|
||||
jr ra
|
||||
nop
|
||||
|
||||
END(fetchUntransformed_444_asm_mips_dsp)
|
||||
|
||||
|
||||
LEAF_MIPS_DSP(fetchUntransformed_argb8565_premultiplied_asm_mips_dsp)
|
||||
/*
|
||||
* a0 - dst address
|
||||
* a1 - src address
|
||||
* a2 - length
|
||||
*/
|
||||
|
||||
beqz a2, 2f
|
||||
nop
|
||||
|
||||
1:
|
||||
ulh t1, 0(a1)
|
||||
lbu t2, 2(a1)
|
||||
addiu a2, a2, -1
|
||||
wsbh t1, t1
|
||||
sll t0, t1, 8 /* t0 = 00000000rrrrrggggggbbbbb00000000 */
|
||||
ins t0, t1, 3, 16 /* t0 = 00000000rrrrrrrrrrggggggbbbbb000 */
|
||||
ins t0, t1, 5, 11 /* t0 = 00000000rrrrrrrrggggggbbbbbbb000 */
|
||||
srl t4, t1, 9 /* t4 = 0000000000000000000000000rrrrrgg */
|
||||
replv.qb t3, t2
|
||||
ins t0, t4, 8, 2 /* t0 = 00000000rrrrrrrrggggggggbbbbb000 */
|
||||
ins t0, t1, 3, 5 /* t0 = 00000000rrrrrrrrggggggggbbbbb000 */
|
||||
srl t4, t1, 2 /* t4 = 000000000000000000rrrrrggggggbbb */
|
||||
ins t0, t4, 0, 3 /* t0 = 00000000rrrrrrrrggggggggbbbbbbbb */
|
||||
ins t0, t2, 24, 8 /* t0 =aaaaaaaarrrrrrrrggggggggbbbbbbbb */
|
||||
cmpu.lt.qb t3, t0
|
||||
pick.qb t0, t3, t0
|
||||
addiu a1, a1, 3
|
||||
sw t0, 0(a0)
|
||||
bgtz a2, 1b
|
||||
addiu a0, a0, 4
|
||||
2:
|
||||
jr ra
|
||||
nop
|
||||
|
||||
END(fetchUntransformed_argb8565_premultiplied_asm_mips_dsp)
|
||||
|
@ -1,6 +1,6 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 MIPS Technologies, www.mips.com, author Damir Tatalovic <dtatalovic@mips.com>
|
||||
** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the QtGui module of the Qt Toolkit.
|
||||
@ -101,19 +101,34 @@ extern "C" void qt_blend_argb32_on_argb32_mips_dsp_asm_x2(uint *dest, const uint
|
||||
|
||||
extern "C" void qt_blend_argb32_on_argb32_const_alpha_256_mips_dsp_asm(uint *dest, const uint *src, int length);
|
||||
|
||||
extern "C" void qt_blend_rgb16_on_rgb16_const_alpha_256_mips_dsp_asm(quint16 *dest, const quint16 *src, int length);
|
||||
|
||||
extern "C" void qt_blend_rgb16_on_rgb16_mips_dsp_asm(quint16 *dest, const quint16 *src, int length, uint const_alpha);
|
||||
|
||||
extern "C" uint * destfetchARGB32_asm_mips_dsp(uint *buffer, const uint *data, int length);
|
||||
|
||||
extern "C" uint * qt_destStoreARGB32_asm_mips_dsp(uint *buffer, const uint *data, int length);
|
||||
|
||||
extern "C" uint * fetchUntransformed_888_asm_mips_dsp(uint *buffer, const uchar *line, int length);
|
||||
|
||||
extern "C" uint * fetchUntransformed_444_asm_mips_dsp(uint *buffer, const uchar *line, int length);
|
||||
|
||||
extern "C" uint * fetchUntransformed_argb8565_premultiplied_asm_mips_dsp(uint *buffer, const uchar *line, int length);
|
||||
|
||||
void qt_blend_argb32_on_argb32_mips_dsp(uchar *destPixels, int dbpl,
|
||||
const uchar *srcPixels, int sbpl,
|
||||
int w, int h,
|
||||
int const_alpha);
|
||||
|
||||
void qt_blend_rgb32_on_rgb32_mips_dsp(uchar *destPixels, int dbpl,
|
||||
const uchar *srcPixels, int sbpl,
|
||||
int w, int h,
|
||||
int const_alpha);
|
||||
const uchar *srcPixels, int sbpl,
|
||||
int w, int h,
|
||||
int const_alpha);
|
||||
|
||||
void qt_blend_rgb16_on_rgb16_mips_dsp(uchar *destPixels, int dbpl,
|
||||
const uchar *srcPixels, int sbpl,
|
||||
int w, int h,
|
||||
int const_alpha);
|
||||
|
||||
void comp_func_Source_mips_dsp(uint *dest, const uint *src, int length, uint const_alpha);
|
||||
|
||||
@ -164,6 +179,21 @@ void QT_FASTCALL comp_func_SourceOut_mips_dsp(uint *dest, const uint *src, int l
|
||||
|
||||
void QT_FASTCALL comp_func_XOR_mips_dsp(uint *dest, const uint *src, int length, uint const_alpha);
|
||||
|
||||
const uint * QT_FASTCALL qt_fetchUntransformed_888_mips_dsp (uint *buffer,
|
||||
const Operator *,
|
||||
const QSpanData *data,
|
||||
int y, int x, int length);
|
||||
|
||||
const uint * QT_FASTCALL qt_fetchUntransformed_444_mips_dsp (uint *buffer,
|
||||
const Operator *,
|
||||
const QSpanData *data,
|
||||
int y, int x, int length);
|
||||
|
||||
const uint * QT_FASTCALL qt_fetchUntransformed_argb8565_premultiplied_mips_dsp (uint *buffer,
|
||||
const Operator *,
|
||||
const QSpanData *data,
|
||||
int y, int x, int length);
|
||||
|
||||
#endif // QT_COMPILER_SUPPORTS_MIPS_DSP
|
||||
|
||||
|
||||
@ -171,6 +201,13 @@ void QT_FASTCALL comp_func_XOR_mips_dsp(uint *dest, const uint *src, int length,
|
||||
|
||||
extern "C" void qConvertRgb16To32_asm_mips_dspr2(quint32 *dest, const quint16 *src, int length);
|
||||
|
||||
extern "C" void qt_blend_rgb16_on_rgb16_mips_dspr2_asm(quint16 *dest, const quint16 *src, int length, uint const_alpha);
|
||||
|
||||
void qt_blend_rgb16_on_rgb16_mips_dspr2(uchar *destPixels, int dbpl,
|
||||
const uchar *srcPixels, int sbpl,
|
||||
int w, int h,
|
||||
int const_alpha);
|
||||
|
||||
#endif // QT_COMPILER_SUPPORTS_MIPS_DSPR2
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
@ -1,6 +1,6 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 MIPS Technologies, www.mips.com, author Damir Tatalovic <dtatalovic@mips.com>
|
||||
** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the QtGui module of the Qt Toolkit.
|
||||
@ -122,3 +122,551 @@ LEAF_MIPS_DSPR2(qConvertRgb16To32_asm_mips_dspr2)
|
||||
nop
|
||||
|
||||
END(qConvertRgb16To32_asm_mips_dspr2)
|
||||
|
||||
|
||||
#if defined(__MIPSEL) && __MIPSEL
|
||||
# define PACK(r, s, t) packrl.ph r, s, t
|
||||
# define LDHI(r, o, b) lwl r, o + 1 (b)
|
||||
# define LDLO(r, o, b) lwr r, o + 2 (b)
|
||||
#else
|
||||
# define PACK(r, s, t) packrl.ph r, t, s
|
||||
# define LDHI(r, o, b) lwr r, o + 1 (b)
|
||||
# define LDLO(r, o, b) lwl r, o + 2 (b)
|
||||
#endif
|
||||
|
||||
|
||||
LEAF_MIPS_DSPR2(qt_blend_rgb16_on_rgb16_mips_dspr2_asm)
|
||||
/*
|
||||
+ * a0 - dst (*r5g6b5)
|
||||
* a1 - src (const *r5g6b5)
|
||||
* a2 - len (unsigned int) - batch length
|
||||
* a3 - alpha (int)
|
||||
*
|
||||
* Register usage:
|
||||
* t0-3 - Scratch registers
|
||||
* t4 - Number of iterations to do in unrolled loops
|
||||
* t5 - Inverse alpha
|
||||
* t6 - Alpha >> 2
|
||||
* t7 - Inverse alpha >> 2
|
||||
* t8 - magic1 (0x07e007e0)
|
||||
* t9 - magic2 (0xf81ff81f)
|
||||
*
|
||||
* NOTE:
|
||||
* Cannot use DSP instructions for the multiplication of two
|
||||
* 16-bit values: overflow would be always rounded or saturated.
|
||||
*/
|
||||
|
||||
beqz a2, 0f
|
||||
andi t0, a0, 0x3
|
||||
andi t1, a1, 0x3
|
||||
/* Adjust alpha value, and calculate inverse alpha value */
|
||||
li t5, 255
|
||||
or t2, t0, t1 /* t0 = (dst & 0x3) | (src & 0x3) */
|
||||
sll t8, a3, 8
|
||||
subu a3, t8, a3
|
||||
li t8, 0x07e007e0 /* magic1 */
|
||||
srl a3, a3, 8 /* alpha >>= 8 */
|
||||
li t9, 0xf81ff81f /* magic2 */
|
||||
subu t5, t5, a3 /* ialpha = 255 - alpha */
|
||||
addiu a3, a3, 1 /* alpha++ */
|
||||
addiu t5, t5, 1 /* ialpha++ */
|
||||
srl t6, a3, 2 /* ashift = alpha >> 2 */
|
||||
|
||||
beqz t2, 4f /* both aligned */
|
||||
srl t7, t5, 2 /* iashift = ialpha >> 2 */
|
||||
|
||||
beqz t1, 2f /* src aligned, dst unaligned */
|
||||
nop
|
||||
|
||||
beqz t0, 3f /* dst aligned, src unaligned */
|
||||
nop
|
||||
|
||||
/*
|
||||
* Both src/dst are unaligned: read 1 halfword from each, then
|
||||
* fall-off to continue with word-aligned operation.
|
||||
*/
|
||||
lhu t1, 0 (a1)
|
||||
lhu t0, 0 (a0)
|
||||
addiu a2, a2, -1 /* len-- */
|
||||
andi t2, t1, 0x07e0
|
||||
andi t1, t1, 0xf81f
|
||||
mul t2, t2, a3
|
||||
mul t1, t1, t6
|
||||
andi t3, t0, 0x07e0
|
||||
andi t0, t0, 0xf81f
|
||||
mul t3, t3, t5
|
||||
mul t0, t0, t7
|
||||
addiu a1, a1, 2 /* src++ */
|
||||
srl t2, t2, 8
|
||||
srl t1, t1, 6
|
||||
andi t2, t2, 0x07e0
|
||||
andi t1, t1, 0xf81f
|
||||
or t1, t1, t2
|
||||
srl t3, t3, 8
|
||||
srl t0, t0, 6
|
||||
andi t3, t3, 0x07e0
|
||||
andi t0, t0, 0xf81f
|
||||
or t0, t0, t3
|
||||
addu t0, t0, t1 /* src * alpha + dst * ialpha */
|
||||
sh t0, 0 (a0)
|
||||
addiu a0, a0, 2 /* dst++ */
|
||||
|
||||
/*
|
||||
* Both src/dst pointers are word-aligned, process eight
|
||||
* items at a time in an unrolled loop.
|
||||
*/
|
||||
4: beqz a2, 0f
|
||||
srl t4, a2, 3 /* t4 = len / 8 */
|
||||
beqz t4, 5f
|
||||
andi a2, a2, 0x7 /* len = len % 8 */
|
||||
SAVE_REGS_ON_STACK 12, s0, s1, s2, s3, s4, v0, v1
|
||||
|
||||
1: lw t1, 0 (a1) /* [s0, s1] */
|
||||
lw v1, 4 (a1) /* [s2, s3] */
|
||||
lw s1, 8 (a1) /* [s4, s5] */
|
||||
lw s3, 12 (a1) /* [s6, s7] */
|
||||
|
||||
lw t0, 0 (a0) /* [d0, d1] */
|
||||
lw v0, 4 (a0) /* [d2, d3] */
|
||||
lw s0, 8 (a0) /* [d4, d5] */
|
||||
lw s2, 12 (a0) /* [d6, d7] */
|
||||
|
||||
pref 4, 16 (a1)
|
||||
pref 5, 16 (a0)
|
||||
|
||||
and t2, t1, t8
|
||||
ext t3, t2, 0, 16
|
||||
srl t2, t2, 16
|
||||
mul t3, t3, a3
|
||||
mul t2, t2, a3
|
||||
and t1, t1, t9
|
||||
ext s4, t1, 0, 16
|
||||
mul s4, s4, t6
|
||||
srl t1, t1, 16
|
||||
mul t1, t1, t6
|
||||
srl t3, t3, 8
|
||||
srl t2, t2, 8
|
||||
append t2, t3, 16
|
||||
and t2, t2, t8
|
||||
srl s4, s4, 6
|
||||
and t3, v1, t8
|
||||
srl t1, t1, 6
|
||||
append t1, s4, 16
|
||||
and t1, t1, t9
|
||||
or t1, t1, t2
|
||||
ext t2, t3, 0, 16
|
||||
srl t3, t3, 16
|
||||
mul t2, t2, a3
|
||||
mul t3, t3, a3
|
||||
and v1, v1, t9
|
||||
ext s4, v1, 0, 16
|
||||
mul s4, s4, t6
|
||||
srl v1, v1, 16
|
||||
mul v1, v1, t6
|
||||
srl t2, t2, 8
|
||||
srl t3, t3, 8
|
||||
append t3, t2, 16
|
||||
and t3, t3, t8
|
||||
srl s4, s4, 6
|
||||
and t2, s1, t8
|
||||
srl v1, v1, 6
|
||||
append v1, s4, 16
|
||||
and v1, v1, t9
|
||||
or v1, v1, t3
|
||||
ext t3, t2, 0, 16
|
||||
srl t2, t2, 16
|
||||
mul t3, t3, a3
|
||||
mul t2, t2, a3
|
||||
and s1, s1, t9
|
||||
ext s4, s1, 0, 16
|
||||
mul s4, s4, t6
|
||||
srl s1, s1, 16
|
||||
mul s1, s1, t6
|
||||
srl t3, t3, 8
|
||||
srl t2, t2, 8
|
||||
append t2, t3, 16
|
||||
and t2, t2, t8
|
||||
srl s4, s4, 6
|
||||
and t3, s3, t8
|
||||
srl s1, s1, 6
|
||||
append s1, s4, 16
|
||||
and s1, s1, t9
|
||||
or s1, s1, t2
|
||||
ext t2, t3, 0, 16
|
||||
srl t3, t3, 16
|
||||
mul t2, t2, a3
|
||||
mul t3, t3, a3
|
||||
and s3, s3, t9
|
||||
ext s4, s3, 0, 16
|
||||
mul s4, s4, t6
|
||||
srl s3, s3, 16
|
||||
mul s3, s3, t6
|
||||
srl t2, t2, 8
|
||||
srl t3, t3, 8
|
||||
append t3, t2, 16
|
||||
and t3, t3, t8
|
||||
srl s4, s4, 6
|
||||
and t2, t0, t8
|
||||
srl s3, s3, 6
|
||||
append s3, s4, 16
|
||||
and s3, s3, t9
|
||||
or s3, s3, t3
|
||||
ext t3, t2, 0, 16
|
||||
srl t2, t2, 16
|
||||
mul t3, t3, t5
|
||||
mul t2, t2, t5
|
||||
and t0, t0, t9
|
||||
ext s4, t0, 0, 16
|
||||
mul s4, s4, t7
|
||||
srl t0, t0, 16
|
||||
mul t0, t0, t7
|
||||
srl t3, t3, 8
|
||||
srl t2, t2, 8
|
||||
append t2, t3, 16
|
||||
and t2, t2, t8
|
||||
srl s4, s4, 6
|
||||
and t3, v0, t8
|
||||
srl t0, t0, 6
|
||||
append t0, s4, 16
|
||||
and t0, t0, t9
|
||||
or t0, t0, t2
|
||||
ext t2, t3, 0, 16
|
||||
srl t3, t3, 16
|
||||
mul t2, t2, t5
|
||||
mul t3, t3, t5
|
||||
and v0, v0, t9
|
||||
ext s4, v0, 0, 16
|
||||
mul s4, s4, t7
|
||||
srl v0, v0, 16
|
||||
mul v0, v0, t7
|
||||
srl t2, t2, 8
|
||||
srl t3, t3, 8
|
||||
append t3, t2, 16
|
||||
and t3, t3, t8
|
||||
srl s4, s4, 6
|
||||
and t2, s0, t8
|
||||
srl v0, v0, 6
|
||||
append v0, s4, 16
|
||||
and v0, v0, t9
|
||||
or v0, v0, t3
|
||||
ext t3, t2, 0, 16
|
||||
srl t2, t2, 16
|
||||
mul t3, t3, t5
|
||||
mul t2, t2, t5
|
||||
and s0, s0, t9
|
||||
ext s4, s0, 0, 16
|
||||
mul s4, s4, t7
|
||||
srl s0, s0, 16
|
||||
mul s0, s0, t7
|
||||
srl t3, t3, 8
|
||||
srl t2, t2, 8
|
||||
append t2, t3, 16
|
||||
and t2, t2, t8
|
||||
srl s4, s4, 6
|
||||
and t3, s2, t8
|
||||
srl s0, s0, 6
|
||||
append s0, s4, 16
|
||||
and s0, s0, t9
|
||||
or s0, s0, t2
|
||||
ext t2, t3, 0, 16
|
||||
srl t3, t3, 16
|
||||
mul t2, t2, t5
|
||||
mul t3, t3, t5
|
||||
and s2, s2, t9
|
||||
ext s4, s2, 0, 16
|
||||
mul s4, s4, t7
|
||||
srl s2, s2, 16
|
||||
mul s2, s2, t7
|
||||
srl t2, t2, 8
|
||||
srl t3, t3, 8
|
||||
append t3, t2, 16
|
||||
and t3, t3, t8
|
||||
srl s4, s4, 6
|
||||
addu.ph t0, t0, t1
|
||||
srl s2, s2, 6
|
||||
append s2, s4, 16
|
||||
and s2, s2, t9
|
||||
or s2, s2, t3
|
||||
addu.ph v0, v0, v1 /* v0 = [S2 + D2, S3 + D3] */
|
||||
addu.ph s0, s0, s1 /* s0 = [S4 + D4, S5 + D5] */
|
||||
addu.ph s2, s2, s3 /* s2 = [S6 + D6, S7 + D7] */
|
||||
|
||||
sw t0, 0 (a0) /* [SS0, SS1] */
|
||||
sw v0, 4 (a0) /* [SS2, SS3] */
|
||||
sw s0, 8 (a0) /* [SS4, SS5] */
|
||||
sw s2, 12 (a0) /* [SS6, SS7] */
|
||||
|
||||
addiu t4, t4, -1 /* t4-- */
|
||||
addiu a1, a1, 16 /* src += 8 */
|
||||
|
||||
bnez t4, 1b
|
||||
addiu a0, a0, 16 /* dst += 8 */
|
||||
|
||||
RESTORE_REGS_FROM_STACK 12, s0, s1, s2, s3, s4, v0, v1
|
||||
b 5f
|
||||
nop
|
||||
|
||||
|
||||
/* dst unaligned: do one item and fall down to the src unaligned case */
|
||||
2: lhu t1, 0 (a1)
|
||||
lhu t0, 0 (a0)
|
||||
addiu a2, a2, -1 /* len-- */
|
||||
andi t2, t1, 0x07e0
|
||||
andi t1, t1, 0xf81f
|
||||
mul t2, t2, a3
|
||||
mul t1, t1, t6
|
||||
andi t3, t0, 0x07e0
|
||||
andi t0, t0, 0xf81f
|
||||
mul t3, t3, t5
|
||||
mul t0, t0, t7
|
||||
addiu a1, a1, 2 /* src++ */
|
||||
srl t2, t2, 8
|
||||
srl t1, t1, 6
|
||||
andi t2, t2, 0x07e0
|
||||
andi t1, t1, 0xf81f
|
||||
or t1, t1, t2
|
||||
srl t3, t3, 8
|
||||
srl t0, t0, 6
|
||||
andi t3, t3, 0x07e0
|
||||
andi t0, t0, 0xf81f
|
||||
or t0, t0, t3
|
||||
addu t0, t0, t1 /* src * alpha + dst * ialpha */
|
||||
sh t0, 0 (a0)
|
||||
addiu a0, a0, 2 /* dst++ */
|
||||
|
||||
/* src unaligned */
|
||||
3: beqz a2, 0f
|
||||
srl t4, a2, 3 /* t4 = len / 8 */
|
||||
beqz t4, 5f
|
||||
andi a2, a2, 0x7 /* len = len % 8 */
|
||||
SAVE_REGS_ON_STACK 12, s0, s1, s2, s3, s4, v0, v1
|
||||
|
||||
1: lw t0, 0 (a0) /* [d0, d1] */
|
||||
lw v0, 4 (a0) /* [d2, d3] */
|
||||
lw s0, 8 (a0) /* [d4, d5] */
|
||||
lw s2, 12 (a0) /* [d6, d7] */
|
||||
|
||||
LDHI (t1, 0, a1) /* [s0, __] */
|
||||
lw v1, 2 (a1) /* [s1, s2] */
|
||||
lw s1, 6 (a1) /* [s3, s4] */
|
||||
lw s3, 10 (a1) /* [s5, s6] */
|
||||
LDLO (s4, 12, a1) /* [__, s7] */
|
||||
|
||||
pref 4, 14 (a1)
|
||||
pref 5, 16 (a0)
|
||||
|
||||
PACK (t1, v1, t1) /* [s0, s1] */
|
||||
PACK (v1, s1, v1) /* [s2, s3] */
|
||||
PACK (s1, s3, s1) /* [s4, s5] */
|
||||
PACK (s3, s4, s3) /* [s6, s7] */
|
||||
|
||||
and t2, t1, t8
|
||||
ext t3, t2, 0, 16
|
||||
srl t2, t2, 16
|
||||
mul t3, t3, a3
|
||||
mul t2, t2, a3
|
||||
and t1, t1, t9
|
||||
ext s4, t1, 0, 16
|
||||
mul s4, s4, t6
|
||||
srl t1, t1, 16
|
||||
mul t1, t1, t6
|
||||
srl t3, t3, 8
|
||||
srl t2, t2, 8
|
||||
append t2, t3, 16
|
||||
and t2, t2, t8
|
||||
srl s4, s4, 6
|
||||
and t3, v1, t8
|
||||
srl t1, t1, 6
|
||||
append t1, s4, 16
|
||||
and t1, t1, t9
|
||||
or t1, t1, t2
|
||||
ext t2, t3, 0, 16
|
||||
srl t3, t3, 16
|
||||
mul t2, t2, a3
|
||||
mul t3, t3, a3
|
||||
and v1, v1, t9
|
||||
ext s4, v1, 0, 16
|
||||
mul s4, s4, t6
|
||||
srl v1, v1, 16
|
||||
mul v1, v1, t6
|
||||
srl t2, t2, 8
|
||||
srl t3, t3, 8
|
||||
append t3, t2, 16
|
||||
and t3, t3, t8
|
||||
srl s4, s4, 6
|
||||
and t2, s1, t8
|
||||
srl v1, v1, 6
|
||||
append v1, s4, 16
|
||||
and v1, v1, t9
|
||||
or v1, v1, t3
|
||||
ext t3, t2, 0, 16
|
||||
srl t2, t2, 16
|
||||
mul t3, t3, a3
|
||||
mul t2, t2, a3
|
||||
and s1, s1, t9
|
||||
ext s4, s1, 0, 16
|
||||
mul s4, s4, t6
|
||||
srl s1, s1, 16
|
||||
mul s1, s1, t6
|
||||
srl t3, t3, 8
|
||||
srl t2, t2, 8
|
||||
append t2, t3, 16
|
||||
and t2, t2, t8
|
||||
srl s4, s4, 6
|
||||
and t3, s3, t8
|
||||
srl s1, s1, 6
|
||||
append s1, s4, 16
|
||||
and s1, s1, t9
|
||||
or s1, s1, t2
|
||||
ext t2, t3, 0, 16
|
||||
srl t3, t3, 16
|
||||
mul t2, t2, a3
|
||||
mul t3, t3, a3
|
||||
and s3, s3, t9
|
||||
ext s4, s3, 0, 16
|
||||
mul s4, s4, t6
|
||||
srl s3, s3, 16
|
||||
mul s3, s3, t6
|
||||
srl t2, t2, 8
|
||||
srl t3, t3, 8
|
||||
append t3, t2, 16
|
||||
and t3, t3, t8
|
||||
srl s4, s4, 6
|
||||
and t2, t0, t8
|
||||
srl s3, s3, 6
|
||||
append s3, s4, 16
|
||||
and s3, s3, t9
|
||||
or s3, s3, t3
|
||||
ext t3, t2, 0, 16
|
||||
srl t2, t2, 16
|
||||
mul t3, t3, t5
|
||||
mul t2, t2, t5
|
||||
and t0, t0, t9
|
||||
ext s4, t0, 0, 16
|
||||
mul s4, s4, t7
|
||||
srl t0, t0, 16
|
||||
mul t0, t0, t7
|
||||
srl t3, t3, 8
|
||||
srl t2, t2, 8
|
||||
append t2, t3, 16
|
||||
and t2, t2, t8
|
||||
srl s4, s4, 6
|
||||
and t3, v0, t8
|
||||
srl t0, t0, 6
|
||||
append t0, s4, 16
|
||||
and t0, t0, t9
|
||||
or t0, t0, t2
|
||||
ext t2, t3, 0, 16
|
||||
srl t3, t3, 16
|
||||
mul t2, t2, t5
|
||||
mul t3, t3, t5
|
||||
and v0, v0, t9
|
||||
ext s4, v0, 0, 16
|
||||
mul s4, s4, t7
|
||||
srl v0, v0, 16
|
||||
mul v0, v0, t7
|
||||
srl t2, t2, 8
|
||||
srl t3, t3, 8
|
||||
append t3, t2, 16
|
||||
and t3, t3, t8
|
||||
srl s4, s4, 6
|
||||
and t2, s0, t8
|
||||
srl v0, v0, 6
|
||||
append v0, s4, 16
|
||||
and v0, v0, t9
|
||||
or v0, v0, t3
|
||||
ext t3, t2, 0, 16
|
||||
srl t2, t2, 16
|
||||
mul t3, t3, t5
|
||||
mul t2, t2, t5
|
||||
and s0, s0, t9
|
||||
ext s4, s0, 0, 16
|
||||
mul s4, s4, t7
|
||||
srl s0, s0, 16
|
||||
mul s0, s0, t7
|
||||
srl t3, t3, 8
|
||||
srl t2, t2, 8
|
||||
append t2, t3, 16
|
||||
and t2, t2, t8
|
||||
srl s4, s4, 6
|
||||
and t3, s2, t8
|
||||
srl s0, s0, 6
|
||||
append s0, s4, 16
|
||||
and s0, s0, t9
|
||||
or s0, s0, t2
|
||||
ext t2, t3, 0, 16
|
||||
srl t3, t3, 16
|
||||
mul t2, t2, t5
|
||||
mul t3, t3, t5
|
||||
and s2, s2, t9
|
||||
ext s4, s2, 0, 16
|
||||
mul s4, s4, t7
|
||||
srl s2, s2, 16
|
||||
mul s2, s2, t7
|
||||
srl t2, t2, 8
|
||||
srl t3, t3, 8
|
||||
append t3, t2, 16
|
||||
and t3, t3, t8
|
||||
srl s4, s4, 6
|
||||
addu.ph t0, t0, t1
|
||||
srl s2, s2, 6
|
||||
append s2, s4, 16
|
||||
and s2, s2, t9
|
||||
or s2, s2, t3
|
||||
addu.ph v0, v0, v1 /* v0 = [S2 + D2, S3 + D3] */
|
||||
addu.ph s0, s0, s1 /* s0 = [S4 + D4, S5 + D5] */
|
||||
addu.ph s2, s2, s3 /* s2 = [S6 + D6, S7 + D7] */
|
||||
|
||||
sw t0, 0 (a0) /* [SS0, SS1] */
|
||||
sw v0, 4 (a0) /* [SS2, SS3] */
|
||||
sw s0, 8 (a0) /* [SS4, SS5] */
|
||||
sw s2, 12 (a0) /* [SS6, SS7] */
|
||||
|
||||
addiu t4, t4, -1 /* t4-- */
|
||||
addiu a1, a1, 16 /* src += 8 */
|
||||
|
||||
bnez t4, 1b
|
||||
addiu a0, a0, 16 /* dst += 8 */
|
||||
|
||||
RESTORE_REGS_FROM_STACK 12, s0, s1, s2, s3, s4, v0, v1
|
||||
|
||||
5: /* Process remaining items (len < 8), one at a time */
|
||||
beqz a2, 0f
|
||||
nop
|
||||
|
||||
1: lhu t1, 0 (a1)
|
||||
lhu t0, 0 (a0)
|
||||
addiu a1, a1, 2 /* src++ */
|
||||
andi t2, t1, 0x07e0
|
||||
andi t1, t1, 0xf81f
|
||||
mul t2, t2, a3
|
||||
mul t1, t1, t6
|
||||
andi t3, t0, 0x07e0
|
||||
andi t0, t0, 0xf81f
|
||||
mul t3, t3, t5
|
||||
mul t0, t0, t7
|
||||
addiu a2, a2, -1 /* len-- */
|
||||
srl t2, t2, 8
|
||||
srl t1, t1, 6
|
||||
andi t2, t2, 0x07e0
|
||||
andi t1, t1, 0xf81f
|
||||
or t1, t1, t2
|
||||
srl t3, t3, 8
|
||||
srl t0, t0, 6
|
||||
andi t3, t3, 0x07e0
|
||||
andi t0, t0, 0xf81f
|
||||
or t0, t0, t3
|
||||
|
||||
addu t0, t0, t1 /* src*alpha + dst*ialpha */
|
||||
sh t0, 0 (a0)
|
||||
bnez a2, 1b
|
||||
addiu a0, a0, 2 /* dst++ */
|
||||
|
||||
0: jr ra
|
||||
nop
|
||||
|
||||
END(qt_blend_rgb16_on_rgb16_mips_dspr2_asm)
|
||||
|
||||
#undef PACK
|
||||
#undef LDHI
|
||||
#undef LDLO
|
||||
|
@ -62,6 +62,7 @@
|
||||
#include "qglyphrun.h"
|
||||
|
||||
#include <qpa/qplatformtheme.h>
|
||||
#include <qpa/qplatformintegration.h>
|
||||
|
||||
#include <private/qfontengine_p.h>
|
||||
#include <private/qpaintengine_p.h>
|
||||
@ -155,7 +156,9 @@ static bool qt_painter_thread_test(int devType, const char *what)
|
||||
// can be drawn onto these devices safely from any thread
|
||||
break;
|
||||
default:
|
||||
if (QThread::currentThread() != qApp->thread()) {
|
||||
if (QThread::currentThread() != qApp->thread()
|
||||
&& (devType!=QInternal::Pixmap || !QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ThreadedPixmaps))
|
||||
&& (devType!=QInternal::OpenGL || !QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ThreadedOpenGL))) {
|
||||
qWarning("QPainter: It is not safe to use %s outside the GUI thread", what);
|
||||
return false;
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 MIPS Technologies, www.mips.com, author Damir Tatalovic <dtatalovic@mips.com>
|
||||
** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the QtGui module of the Qt Toolkit.
|
||||
@ -261,4 +261,168 @@ LEAF_MIPS32R2(symbol) \
|
||||
or \out_1, \scratch1, \scratch3
|
||||
.endm
|
||||
|
||||
/*
|
||||
* Checks if stack offset is big enough for storing/restoring regs_num
|
||||
* number of register to/from stack. Stack offset must be greater than
|
||||
* or equal to the number of bytes needed for storing registers (regs_num*4).
|
||||
* Since MIPS ABI allows usage of first 16 bytes of stack frame (this is
|
||||
* preserved for input arguments of the functions, already stored in a0-a3),
|
||||
* stack size can be further optimized by utilizing this space.
|
||||
*/
|
||||
.macro CHECK_STACK_OFFSET regs_num, stack_offset
|
||||
.if \stack_offset < \regs_num * 4 - 16
|
||||
.error "Stack offset too small."
|
||||
.endif
|
||||
.endm
|
||||
|
||||
/*
|
||||
* Saves set of registers on stack. Maximum number of registers that
|
||||
* can be saved on stack is limitted to 14 (a0-a3, v0-v1 and s0-s7).
|
||||
* Stack offset is number of bytes that are added to stack pointer (sp)
|
||||
* before registers are pushed in order to provide enough space on stack
|
||||
* (offset must be multiple of 4, and must be big enough, as described by
|
||||
* CHECK_STACK_OFFSET macro). This macro is intended to be used in
|
||||
* combination with RESTORE_REGS_FROM_STACK macro. Example:
|
||||
* SAVE_REGS_ON_STACK 4, v0, v1, s0, s1
|
||||
* RESTORE_REGS_FROM_STACK 4, v0, v1, s0, s1
|
||||
*/
|
||||
.macro SAVE_REGS_ON_STACK stack_offset = 0, r1, \
|
||||
r2 = 0, r3 = 0, r4 = 0, \
|
||||
r5 = 0, r6 = 0, r7 = 0, \
|
||||
r8 = 0, r9 = 0, r10 = 0, \
|
||||
r11 = 0, r12 = 0, r13 = 0, \
|
||||
r14 = 0
|
||||
.if (\stack_offset < 0) || (\stack_offset - (\stack_offset / 4) * 4)
|
||||
.error "Stack offset must be positive and multiple of 4."
|
||||
.endif
|
||||
.if \stack_offset != 0
|
||||
addiu sp, sp, -\stack_offset
|
||||
.endif
|
||||
sw \r1, 0(sp)
|
||||
.if \r2 != 0
|
||||
sw \r2, 4(sp)
|
||||
.endif
|
||||
.if \r3 != 0
|
||||
sw \r3, 8(sp)
|
||||
.endif
|
||||
.if \r4 != 0
|
||||
sw \r4, 12(sp)
|
||||
.endif
|
||||
.if \r5 != 0
|
||||
CHECK_STACK_OFFSET 5, \stack_offset
|
||||
sw \r5, 16(sp)
|
||||
.endif
|
||||
.if \r6 != 0
|
||||
CHECK_STACK_OFFSET 6, \stack_offset
|
||||
sw \r6, 20(sp)
|
||||
.endif
|
||||
.if \r7 != 0
|
||||
CHECK_STACK_OFFSET 7, \stack_offset
|
||||
sw \r7, 24(sp)
|
||||
.endif
|
||||
.if \r8 != 0
|
||||
CHECK_STACK_OFFSET 8, \stack_offset
|
||||
sw \r8, 28(sp)
|
||||
.endif
|
||||
.if \r9 != 0
|
||||
CHECK_STACK_OFFSET 9, \stack_offset
|
||||
sw \r9, 32(sp)
|
||||
.endif
|
||||
.if \r10 != 0
|
||||
CHECK_STACK_OFFSET 10, \stack_offset
|
||||
sw \r10, 36(sp)
|
||||
.endif
|
||||
.if \r11 != 0
|
||||
CHECK_STACK_OFFSET 11, \stack_offset
|
||||
sw \r11, 40(sp)
|
||||
.endif
|
||||
.if \r12 != 0
|
||||
CHECK_STACK_OFFSET 12, \stack_offset
|
||||
sw \r12, 44(sp)
|
||||
.endif
|
||||
.if \r13 != 0
|
||||
CHECK_STACK_OFFSET 13, \stack_offset
|
||||
sw \r13, 48(sp)
|
||||
.endif
|
||||
.if \r14 != 0
|
||||
CHECK_STACK_OFFSET 14, \stack_offset
|
||||
sw \r14, 52(sp)
|
||||
.endif
|
||||
.endm
|
||||
|
||||
/*
|
||||
* Restores set of registers from stack. Maximum number of registers that
|
||||
* can be restored from stack is limitted to 14 (a0-a3, v0-v1 and s0-s7).
|
||||
* Stack offset is number of bytes that are added to stack pointer (sp)
|
||||
* after registers are restored (offset must be multiple of 4, and must
|
||||
* be big enough, as described by CHECK_STACK_OFFSET macro). This macro is
|
||||
* intended to be used in combination with RESTORE_REGS_FROM_STACK macro.
|
||||
* Example:
|
||||
* SAVE_REGS_ON_STACK 4, v0, v1, s0, s1
|
||||
* RESTORE_REGS_FROM_STACK 4, v0, v1, s0, s1
|
||||
*/
|
||||
.macro RESTORE_REGS_FROM_STACK stack_offset = 0, r1, \
|
||||
r2 = 0, r3 = 0, r4 = 0, \
|
||||
r5 = 0, r6 = 0, r7 = 0, \
|
||||
r8 = 0, r9 = 0, r10 = 0, \
|
||||
r11 = 0, r12 = 0, r13 = 0, \
|
||||
r14 = 0
|
||||
.if (\stack_offset < 0) || (\stack_offset - (\stack_offset/4)*4)
|
||||
.error "Stack offset must be pozitive and multiple of 4."
|
||||
.endif
|
||||
lw \r1, 0(sp)
|
||||
.if \r2 != 0
|
||||
lw \r2, 4(sp)
|
||||
.endif
|
||||
.if \r3 != 0
|
||||
lw \r3, 8(sp)
|
||||
.endif
|
||||
.if \r4 != 0
|
||||
lw \r4, 12(sp)
|
||||
.endif
|
||||
.if \r5 != 0
|
||||
CHECK_STACK_OFFSET 5, \stack_offset
|
||||
lw \r5, 16(sp)
|
||||
.endif
|
||||
.if \r6 != 0
|
||||
CHECK_STACK_OFFSET 6, \stack_offset
|
||||
lw \r6, 20(sp)
|
||||
.endif
|
||||
.if \r7 != 0
|
||||
CHECK_STACK_OFFSET 7, \stack_offset
|
||||
lw \r7, 24(sp)
|
||||
.endif
|
||||
.if \r8 != 0
|
||||
CHECK_STACK_OFFSET 8, \stack_offset
|
||||
lw \r8, 28(sp)
|
||||
.endif
|
||||
.if \r9 != 0
|
||||
CHECK_STACK_OFFSET 9, \stack_offset
|
||||
lw \r9, 32(sp)
|
||||
.endif
|
||||
.if \r10 != 0
|
||||
CHECK_STACK_OFFSET 10, \stack_offset
|
||||
lw \r10, 36(sp)
|
||||
.endif
|
||||
.if \r11 != 0
|
||||
CHECK_STACK_OFFSET 11, \stack_offset
|
||||
lw \r11, 40(sp)
|
||||
.endif
|
||||
.if \r12 != 0
|
||||
CHECK_STACK_OFFSET 12, \stack_offset
|
||||
lw \r12, 44(sp)
|
||||
.endif
|
||||
.if \r13 != 0
|
||||
CHECK_STACK_OFFSET 13, \stack_offset
|
||||
lw \r13, 48(sp)
|
||||
.endif
|
||||
.if \r14 != 0
|
||||
CHECK_STACK_OFFSET 14, \stack_offset
|
||||
lw \r14, 52(sp)
|
||||
.endif
|
||||
.if \stack_offset != 0
|
||||
addiu sp, sp, \stack_offset
|
||||
.endif
|
||||
.endm
|
||||
|
||||
#endif // QT_MIPS_ASM_DSP_H
|
||||
|
@ -591,8 +591,7 @@ QAbstractSocketPrivate::~QAbstractSocketPrivate()
|
||||
|
||||
/*! \internal
|
||||
|
||||
Resets the socket layer, clears the read and write buffers and
|
||||
deletes any socket notifiers.
|
||||
Resets the socket layer and deletes any socket notifiers.
|
||||
*/
|
||||
void QAbstractSocketPrivate::resetSocketLayer()
|
||||
{
|
||||
@ -1834,6 +1833,7 @@ qintptr QAbstractSocket::socketDescriptor() const
|
||||
as a valid socket descriptor; otherwise returns \c false.
|
||||
The socket is opened in the mode specified by \a openMode, and
|
||||
enters the socket state specified by \a socketState.
|
||||
Read and write buffers are cleared, discarding any pending data.
|
||||
|
||||
\b{Note:} It is not possible to initialize two abstract sockets
|
||||
with the same native socket descriptor.
|
||||
@ -1846,6 +1846,8 @@ bool QAbstractSocket::setSocketDescriptor(qintptr socketDescriptor, SocketState
|
||||
Q_D(QAbstractSocket);
|
||||
|
||||
d->resetSocketLayer();
|
||||
d->writeBuffer.clear();
|
||||
d->buffer.clear();
|
||||
d->socketEngine = QAbstractSocketEngine::createSocketEngine(socketDescriptor, this);
|
||||
if (!d->socketEngine) {
|
||||
d->socketError = UnsupportedSocketOperationError;
|
||||
@ -2310,6 +2312,7 @@ void QAbstractSocket::abort()
|
||||
#if defined (QABSTRACTSOCKET_DEBUG)
|
||||
qDebug("QAbstractSocket::abort()");
|
||||
#endif
|
||||
d->writeBuffer.clear();
|
||||
if (d->state == UnconnectedState)
|
||||
return;
|
||||
#ifndef QT_NO_SSL
|
||||
@ -2324,7 +2327,6 @@ void QAbstractSocket::abort()
|
||||
d->connectTimer = 0;
|
||||
}
|
||||
|
||||
d->writeBuffer.clear();
|
||||
d->abortCalled = true;
|
||||
close();
|
||||
}
|
||||
|
@ -189,9 +189,6 @@ init_context:
|
||||
q_SSL_CTX_load_verify_locations(sslContext->ctx, 0, unixDirs.at(a).constData());
|
||||
}
|
||||
|
||||
// Register a custom callback to get all verification errors.
|
||||
X509_STORE_set_verify_cb_func(sslContext->ctx->cert_store, q_X509Callback);
|
||||
|
||||
if (!sslContext->sslConfiguration.localCertificate().isNull()) {
|
||||
// Require a private key as well.
|
||||
if (sslContext->sslConfiguration.privateKey().isNull()) {
|
||||
|
@ -65,6 +65,9 @@ QConnmanEngine::QConnmanEngine(QObject *parent)
|
||||
: QBearerEngineImpl(parent),
|
||||
connmanManager(new QConnmanManagerInterface(this))
|
||||
{
|
||||
qDBusRegisterMetaType<ConnmanMap>();
|
||||
qDBusRegisterMetaType<ConnmanMapList>();
|
||||
qRegisterMetaType<ConnmanMapList>("ConnmanMapList");
|
||||
}
|
||||
|
||||
QConnmanEngine::~QConnmanEngine()
|
||||
@ -82,6 +85,9 @@ void QConnmanEngine::initialize()
|
||||
connect(connmanManager,SIGNAL(propertyChangedContext(QString,QString,QDBusVariant)),
|
||||
this,SLOT(propertyChangedContext(QString,QString,QDBusVariant)));
|
||||
|
||||
connect(connmanManager,SIGNAL(servicesChanged(ConnmanMapList, QList<QDBusObjectPath>)),
|
||||
this, SLOT(updateServices(ConnmanMapList, QList<QDBusObjectPath>)));
|
||||
|
||||
foreach (const QString &techPath, connmanManager->getTechnologies()) {
|
||||
QConnmanTechnologyInterface *tech;
|
||||
tech = new QConnmanTechnologyInterface(techPath, this);
|
||||
@ -172,6 +178,22 @@ void QConnmanEngine::requestUpdate()
|
||||
QTimer::singleShot(0, this, SLOT(doRequestUpdate()));
|
||||
}
|
||||
|
||||
void QConnmanEngine::updateServices(const ConnmanMapList &changed, const QList<QDBusObjectPath> &removed)
|
||||
{
|
||||
foreach (const QDBusObjectPath &objectPath, removed) {
|
||||
removeConfiguration(QString::number(qHash(objectPath.path())));
|
||||
}
|
||||
|
||||
foreach (const ConnmanMap &connmanMap, changed) {
|
||||
const QString id = QString::number(qHash(connmanMap.objectPath.path()));
|
||||
if (accessPointConfigurations.contains(id)) {
|
||||
configurationChange(id);
|
||||
} else {
|
||||
addServiceConfiguration(connmanMap.objectPath.path());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QString QConnmanEngine::serviceFromId(const QString &id)
|
||||
{
|
||||
QMutexLocker locker(&mutex);
|
||||
@ -394,21 +416,23 @@ QNetworkConfiguration::StateFlags QConnmanEngine::getStateForService(const QStri
|
||||
QMutexLocker locker(&mutex);
|
||||
QConnmanServiceInterface serv(service);
|
||||
QNetworkConfiguration::StateFlags flag = QNetworkConfiguration::Defined;
|
||||
if( serv.getType() == "cellular") {
|
||||
if(serv.isSetupRequired()) {
|
||||
if (serv.getType() == "cellular") {
|
||||
if (serv.isSetupRequired() || !serv.isAutoConnect() || (serv.isRoaming() && isAlwaysAskRoaming())) {
|
||||
flag = ( flag | QNetworkConfiguration::Defined);
|
||||
} else {
|
||||
flag = ( flag | QNetworkConfiguration::Discovered);
|
||||
}
|
||||
} else {
|
||||
if(serv.isFavorite()) {
|
||||
flag = ( flag | QNetworkConfiguration::Discovered);
|
||||
if (serv.isFavorite()) {
|
||||
if (serv.isAutoConnect()) {
|
||||
flag = ( flag | QNetworkConfiguration::Discovered);
|
||||
}
|
||||
} else {
|
||||
flag = QNetworkConfiguration::Undefined;
|
||||
}
|
||||
}
|
||||
|
||||
if(serv.getState() == "ready" || serv.getState() == "online") {
|
||||
if (serv.getState() == "ready" || serv.getState() == "online") {
|
||||
flag = ( flag | QNetworkConfiguration::Active);
|
||||
}
|
||||
|
||||
@ -569,6 +593,12 @@ bool QConnmanEngine::requiresPolling() const
|
||||
return false;
|
||||
}
|
||||
|
||||
bool QConnmanEngine::isAlwaysAskRoaming()
|
||||
{
|
||||
QSettings confFile(QStringLiteral("nemomobile"), QStringLiteral("connectionagent"));
|
||||
confFile.beginGroup(QStringLiteral("Connectionagent"));
|
||||
return confFile.value(QStringLiteral("askForRoaming")).toBool();
|
||||
}
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QT_NO_DBUS
|
||||
|
@ -105,6 +105,7 @@ private Q_SLOTS:
|
||||
void servicePropertyChangedContext(const QString &,const QString &,const QDBusVariant &);
|
||||
void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
|
||||
void technologyPropertyChangedContext(const QString &,const QString &, const QDBusVariant &);
|
||||
void updateServices(const ConnmanMapList &changed, const QList<QDBusObjectPath> &removed);
|
||||
|
||||
private:
|
||||
QConnmanManagerInterface *connmanManager;
|
||||
@ -128,6 +129,7 @@ private:
|
||||
|
||||
QNetworkConfiguration::BearerType ofonoTechToBearerType(const QString &type);
|
||||
bool isRoamingAllowed(const QString &context);
|
||||
bool isAlwaysAskRoaming();
|
||||
protected:
|
||||
bool requiresPolling() const;
|
||||
};
|
||||
|
@ -127,8 +127,24 @@ void QConnmanManagerInterface::connectNotify(const QMetaMethod &signal)
|
||||
QObject::connect(helper,SIGNAL(propertyChangedContext(QString,QString,QDBusVariant)),
|
||||
this,SIGNAL(propertyChangedContext(QString,QString,QDBusVariant)), Qt::UniqueConnection);
|
||||
}
|
||||
static const QMetaMethod servicesChangedSignal = QMetaMethod::fromSignal(&QConnmanManagerInterface::servicesChanged);
|
||||
if (signal == servicesChangedSignal) {
|
||||
if (!connection().connect(QLatin1String(CONNMAN_SERVICE),
|
||||
QLatin1String(CONNMAN_MANAGER_PATH),
|
||||
QLatin1String(CONNMAN_MANAGER_INTERFACE),
|
||||
QLatin1String("ServicesChanged"),
|
||||
this,SLOT(onServicesChanged(ConnmanMapList, QList<QDBusObjectPath>)))) {
|
||||
qWarning() << "servicesChanged not connected";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void QConnmanManagerInterface::onServicesChanged(const ConnmanMapList &changed, const QList<QDBusObjectPath> &removed)
|
||||
{
|
||||
emit servicesChanged(changed, removed);
|
||||
}
|
||||
|
||||
|
||||
void QConnmanManagerInterface::disconnectNotify(const QMetaMethod &signal)
|
||||
{
|
||||
static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QConnmanManagerInterface::propertyChanged);
|
||||
|
@ -155,11 +155,16 @@ Q_SIGNALS:
|
||||
void propertyChanged(const QString &, const QDBusVariant &value);
|
||||
void stateChanged(const QString &);
|
||||
void propertyChangedContext(const QString &,const QString &,const QDBusVariant &);
|
||||
void servicesChanged(const ConnmanMapList&, const QList<QDBusObjectPath> &);
|
||||
|
||||
protected:
|
||||
void connectNotify(const QMetaMethod &signal);
|
||||
void disconnectNotify(const QMetaMethod &signal);
|
||||
QVariant getProperty(const QString &);
|
||||
|
||||
private slots:
|
||||
void onServicesChanged(const ConnmanMapList&, const QList<QDBusObjectPath> &);
|
||||
|
||||
};
|
||||
|
||||
class QConnmanProfileInterfacePrivate;
|
||||
|
@ -73,7 +73,8 @@ QPaintDevice *QCocoaBackingStore::paintDevice()
|
||||
}
|
||||
#endif
|
||||
|
||||
QImage::Format format = window()->format().hasAlpha()
|
||||
QCocoaWindow *cocoaWindow = static_cast<QCocoaWindow *>(window()->handle());
|
||||
QImage::Format format = (window()->format().hasAlpha() || cocoaWindow->m_drawContentBorderGradient)
|
||||
? QImage::Format_ARGB32_Premultiplied : QImage::Format_RGB32;
|
||||
m_qImage = QImage(m_requestedSize * scaleFactor, format);
|
||||
m_qImage.setDevicePixelRatio(scaleFactor);
|
||||
|
@ -132,6 +132,9 @@ private:
|
||||
// touch events, which then will be delivered until the widget
|
||||
// deregisters.
|
||||
static void registerTouchWindow(QWindow *window, bool enable);
|
||||
|
||||
// Request a unified title and toolbar look for the window.
|
||||
static void setContentBorderThickness(QWindow *window, int topThickness, int bottomThickness);
|
||||
};
|
||||
|
||||
#endif // QCOCOANATIVEINTERFACE_H
|
||||
|
@ -123,6 +123,8 @@ QPlatformNativeInterface::NativeResourceForIntegrationFunction QCocoaNativeInter
|
||||
return NativeResourceForIntegrationFunction(QCocoaNativeInterface::registerTouchWindow);
|
||||
if (resource.toLower() == "setembeddedinforeignview")
|
||||
return NativeResourceForIntegrationFunction(QCocoaNativeInterface::setEmbeddedInForeignView);
|
||||
if (resource.toLower() == "setcontentborderthickness")
|
||||
return NativeResourceForIntegrationFunction(QCocoaNativeInterface::setContentBorderThickness);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -268,14 +270,19 @@ void QCocoaNativeInterface::registerTouchWindow(QWindow *window, bool enable)
|
||||
if (!window)
|
||||
return;
|
||||
|
||||
// Make sure the QCocoaWindow is created when enabling. Disabling might
|
||||
// happen on window destruction, don't (re)create the QCocoaWindow then.
|
||||
if (enable)
|
||||
window->create();
|
||||
|
||||
QCocoaWindow *cocoaWindow = static_cast<QCocoaWindow *>(window->handle());
|
||||
if (cocoaWindow)
|
||||
cocoaWindow->registerTouch(enable);
|
||||
}
|
||||
|
||||
void QCocoaNativeInterface::setContentBorderThickness(QWindow *window, int topThickness, int bottomThickness)
|
||||
{
|
||||
if (!window)
|
||||
return;
|
||||
|
||||
QCocoaWindow *cocoaWindow = static_cast<QCocoaWindow *>(window->handle());
|
||||
if (cocoaWindow)
|
||||
cocoaWindow->setContentBorderThickness(topThickness, bottomThickness);
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
@ -259,13 +259,17 @@ QPixmap QCocoaTheme::fileIconPixmap(const QFileInfo &fileInfo, const QSizeF &siz
|
||||
NSImage *iconImage = [[NSWorkspace sharedWorkspace] iconForFile:QCFString::toNSString(fileInfo.canonicalFilePath())];
|
||||
if (!iconImage)
|
||||
return QPixmap();
|
||||
|
||||
NSRect iconRect = NSMakeRect(0, 0, size.width(), size.height());
|
||||
NSGraphicsContext *gc = [NSGraphicsContext currentContext];
|
||||
CGImageRef cgImage = [iconImage CGImageForProposedRect:&iconRect
|
||||
context:([gc graphicsPort] ? gc : nil)
|
||||
hints:nil];
|
||||
QPixmap pixmap = QPixmap::fromImage(qt_mac_toQImage(cgImage));
|
||||
NSSize pixmapSize = NSMakeSize(size.width(), size.height());
|
||||
QPixmap pixmap(pixmapSize.width, pixmapSize.height);
|
||||
pixmap.fill(Qt::transparent);
|
||||
[iconImage setSize:pixmapSize];
|
||||
NSRect iconRect = NSMakeRect(0, 0, pixmapSize.width, pixmapSize.height);
|
||||
CGContextRef ctx = qt_mac_cg_context(&pixmap);
|
||||
NSGraphicsContext *gc = [NSGraphicsContext graphicsContextWithGraphicsPort:ctx flipped:YES];
|
||||
[NSGraphicsContext saveGraphicsState];
|
||||
[NSGraphicsContext setCurrentContext:gc];
|
||||
[iconImage drawInRect:iconRect fromRect:iconRect operation:NSCompositeSourceOver fraction:1.0 respectFlipped:YES hints:nil];
|
||||
[NSGraphicsContext restoreGraphicsState];
|
||||
return pixmap;
|
||||
}
|
||||
|
||||
@ -281,8 +285,12 @@ QVariant QCocoaTheme::themeHint(ThemeHint hint) const
|
||||
case TabAllWidgets:
|
||||
return QVariant(bool([[NSApplication sharedApplication] isFullKeyboardAccessEnabled]));
|
||||
case IconPixmapSizes: {
|
||||
qreal devicePixelRatio = qGuiApp->devicePixelRatio();
|
||||
QList<int> sizes;
|
||||
sizes << 16 << 32 << 64 << 128;
|
||||
sizes << 16 * devicePixelRatio
|
||||
<< 32 * devicePixelRatio
|
||||
<< 64 * devicePixelRatio
|
||||
<< 128 * devicePixelRatio;
|
||||
return QVariant::fromValue(sizes);
|
||||
}
|
||||
case QPlatformTheme::PasswordMaskCharacter:
|
||||
|
@ -157,6 +157,8 @@ public:
|
||||
void setWindowCursor(NSCursor *cursor);
|
||||
|
||||
void registerTouch(bool enable);
|
||||
void setContentBorderThickness(int topThickness, int bottomThickness);
|
||||
void applyContentBorderThickness(NSWindow *window);
|
||||
|
||||
qreal devicePixelRatio() const;
|
||||
bool isWindowExposable();
|
||||
@ -215,6 +217,10 @@ public: // for QNSView
|
||||
NSInteger m_alertRequest;
|
||||
id monitor;
|
||||
|
||||
bool m_drawContentBorderGradient;
|
||||
int m_topContentBorderThickness;
|
||||
int m_bottomContentBorderThickness;
|
||||
|
||||
// used by showFullScreen in fake mode
|
||||
QRect m_normalGeometry;
|
||||
Qt::WindowFlags m_oldWindowFlags;
|
||||
|
@ -220,6 +220,9 @@ QCocoaWindow::QCocoaWindow(QWindow *tlw)
|
||||
, m_overrideBecomeKey(false)
|
||||
, m_alertRequest(NoAlertRequest)
|
||||
, monitor(nil)
|
||||
, m_drawContentBorderGradient(false)
|
||||
, m_topContentBorderThickness(0)
|
||||
, m_bottomContentBorderThickness(0)
|
||||
, m_normalGeometry(QRect(0,0,-1,-1))
|
||||
{
|
||||
#ifdef QT_COCOA_ENABLE_WINDOW_DEBUG
|
||||
@ -511,6 +514,9 @@ NSUInteger QCocoaWindow::windowStyleMask(Qt::WindowFlags flags)
|
||||
}
|
||||
}
|
||||
|
||||
if (m_drawContentBorderGradient)
|
||||
styleMask |= NSTexturedBackgroundWindowMask;
|
||||
|
||||
#ifdef QT_COCOA_ENABLE_WINDOW_DEBUG
|
||||
qDebug("windowStyleMask of '%s': flags %X -> styleMask %lX", qPrintable(window()->title()), (int)flags, styleMask);
|
||||
#endif
|
||||
@ -936,6 +942,9 @@ NSWindow * QCocoaWindow::createNSWindow()
|
||||
}
|
||||
|
||||
m_windowModality = window()->modality();
|
||||
|
||||
applyContentBorderThickness(createdWindow);
|
||||
|
||||
return createdWindow;
|
||||
}
|
||||
|
||||
@ -1100,6 +1109,38 @@ void QCocoaWindow::registerTouch(bool enable)
|
||||
[m_contentView setAcceptsTouchEvents:NO];
|
||||
}
|
||||
|
||||
void QCocoaWindow::setContentBorderThickness(int topThickness, int bottomThickness)
|
||||
{
|
||||
m_topContentBorderThickness = topThickness;
|
||||
m_bottomContentBorderThickness = bottomThickness;
|
||||
bool enable = (topThickness > 0 || bottomThickness > 0);
|
||||
m_drawContentBorderGradient = enable;
|
||||
|
||||
applyContentBorderThickness(m_nsWindow);
|
||||
}
|
||||
|
||||
void QCocoaWindow::applyContentBorderThickness(NSWindow *window)
|
||||
{
|
||||
if (!window)
|
||||
return;
|
||||
|
||||
if (m_drawContentBorderGradient)
|
||||
[window setStyleMask:[window styleMask] | NSTexturedBackgroundWindowMask];
|
||||
else
|
||||
[window setStyleMask:[window styleMask] & ~NSTexturedBackgroundWindowMask];
|
||||
|
||||
if (m_topContentBorderThickness > 0) {
|
||||
[window setContentBorderThickness:m_topContentBorderThickness forEdge:NSMaxYEdge];
|
||||
[window setAutorecalculatesContentBorderThickness:NO forEdge:NSMaxYEdge];
|
||||
}
|
||||
|
||||
if (m_bottomContentBorderThickness > 0) {
|
||||
[window setContentBorderThickness:m_topContentBorderThickness forEdge:NSMinYEdge];
|
||||
[window setAutorecalculatesContentBorderThickness:NO forEdge:NSMinYEdge];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
qreal QCocoaWindow::devicePixelRatio() const
|
||||
{
|
||||
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7
|
||||
|
@ -408,6 +408,9 @@ static QTouchDevice *touchDevice = 0;
|
||||
m_shouldSetGLContextinDrawRect = false;
|
||||
}
|
||||
|
||||
if (m_platformWindow->m_drawContentBorderGradient)
|
||||
NSDrawWindowBackground(dirtyRect);
|
||||
|
||||
if (!m_backingStore)
|
||||
return;
|
||||
|
||||
@ -451,7 +454,8 @@ static QTouchDevice *touchDevice = 0;
|
||||
|
||||
// Optimization: Copy frame buffer content instead of blending for
|
||||
// top-level windows where Qt fills the entire window content area.
|
||||
if (m_platformWindow->m_nsWindow)
|
||||
// (But don't overpaint the title-bar gradient)
|
||||
if (m_platformWindow->m_nsWindow && !m_platformWindow->m_drawContentBorderGradient)
|
||||
CGContextSetBlendMode(cgContext, kCGBlendModeCopy);
|
||||
|
||||
CGContextDrawImage(cgContext, dirtyWindowRect, cleanImg);
|
||||
|
@ -77,7 +77,8 @@ public:
|
||||
virtual bool filterConfig(EGLDisplay display, EGLConfig config) const;
|
||||
virtual void waitForVSync() const;
|
||||
|
||||
virtual const char *fbDeviceName() const;
|
||||
virtual QByteArray fbDeviceName() const;
|
||||
virtual int framebufferIndex() const;
|
||||
|
||||
static QEglFSHooks *hooks()
|
||||
{
|
||||
|
@ -42,6 +42,7 @@
|
||||
#include "qeglfshooks.h"
|
||||
#include <QtPlatformSupport/private/qeglplatformcursor_p.h>
|
||||
#include <QtPlatformSupport/private/qeglconvenience_p.h>
|
||||
#include <QtCore/QRegularExpression>
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
@ -56,17 +57,34 @@ QT_BEGIN_NAMESPACE
|
||||
// this is a global static to keep the QEglFSHooks interface as clean as possible
|
||||
static int framebuffer = -1;
|
||||
|
||||
const char *QEglFSHooks::fbDeviceName() const
|
||||
QByteArray QEglFSHooks::fbDeviceName() const
|
||||
{
|
||||
return "/dev/fb0";
|
||||
QByteArray fbDev = qgetenv("QT_QPA_EGLFS_FB");
|
||||
if (fbDev.isEmpty())
|
||||
fbDev = QByteArrayLiteral("/dev/fb0");
|
||||
|
||||
return fbDev;
|
||||
}
|
||||
|
||||
int QEglFSHooks::framebufferIndex() const
|
||||
{
|
||||
int fbIndex = 0;
|
||||
QRegularExpression fbIndexRx(QLatin1String("fb(\\d+)"));
|
||||
QRegularExpressionMatch match = fbIndexRx.match(fbDeviceName());
|
||||
if (match.hasMatch())
|
||||
fbIndex = match.captured(1).toInt();
|
||||
|
||||
return fbIndex;
|
||||
}
|
||||
|
||||
void QEglFSHooks::platformInit()
|
||||
{
|
||||
framebuffer = qt_safe_open(fbDeviceName(), O_RDONLY);
|
||||
QByteArray fbDev = fbDeviceName();
|
||||
|
||||
framebuffer = qt_safe_open(fbDev, O_RDONLY);
|
||||
|
||||
if (framebuffer == -1)
|
||||
qWarning("EGLFS: Failed to open %s", fbDeviceName());
|
||||
qWarning("EGLFS: Failed to open %s", qPrintable(fbDev));
|
||||
}
|
||||
|
||||
void QEglFSHooks::platformDestroy()
|
||||
|
@ -572,6 +572,8 @@ bool QWindowsDialogHelperBase<BaseClass>::show(Qt::WindowFlags,
|
||||
QWindow *parent)
|
||||
{
|
||||
const bool modal = (windowModality != Qt::NonModal);
|
||||
if (!parent)
|
||||
parent = QGuiApplication::focusWindow(); // Need a parent window, else the application loses activation when closed.
|
||||
if (parent) {
|
||||
m_ownerWindow = QWindowsWindow::handleOf(parent);
|
||||
} else {
|
||||
|
@ -304,6 +304,8 @@ QList<QPlatformScreen *> QWindowsScreen::virtualSiblings() const
|
||||
|
||||
void QWindowsScreen::handleChanges(const QWindowsScreenData &newData)
|
||||
{
|
||||
m_data.physicalSizeMM = newData.physicalSizeMM;
|
||||
|
||||
if (m_data.geometry != newData.geometry) {
|
||||
m_data.geometry = newData.geometry;
|
||||
QWindowSystemInterface::handleScreenGeometryChange(screen(),
|
||||
|
@ -607,7 +607,7 @@ bool QSQLiteDriver::open(const QString & db, const QString &, const QString &, c
|
||||
foreach (const QString &option, opts) {
|
||||
if (option.startsWith(QLatin1String("QSQLITE_BUSY_TIMEOUT="))) {
|
||||
bool ok;
|
||||
const int nt = option.mid(21).toInt(&ok);
|
||||
const int nt = option.midRef(21).toInt(&ok);
|
||||
if (ok)
|
||||
timeOut = nt;
|
||||
} else if (option == QLatin1String("QSQLITE_OPEN_READONLY")) {
|
||||
|
@ -197,6 +197,10 @@ namespace QTest {
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(Q_OS_WIN)
|
||||
Q_CORE_EXPORT bool qWinLogToStderr(); // defined in qlogging.cpp
|
||||
#endif
|
||||
|
||||
void QPlainTestLogger::outputMessage(const char *str)
|
||||
{
|
||||
#if defined(Q_OS_WINCE)
|
||||
@ -209,7 +213,11 @@ void QPlainTestLogger::outputMessage(const char *str)
|
||||
} while (!strUtf16.isEmpty());
|
||||
if (stream != stdout)
|
||||
#elif defined(Q_OS_WIN)
|
||||
OutputDebugStringA(str);
|
||||
// log to system log only if output is not redirected, and no console is attached
|
||||
if (!qWinLogToStderr() && stream == stdout) {
|
||||
OutputDebugStringA(str);
|
||||
return;
|
||||
}
|
||||
#elif defined(Q_OS_ANDROID)
|
||||
__android_log_write(ANDROID_LOG_INFO, "QTestLib", str);
|
||||
#endif
|
||||
|
@ -151,17 +151,17 @@ namespace QTest
|
||||
Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
|
||||
{ sendKeyEvent(action, window, key, keyToAscii(key), modifier, delay); }
|
||||
|
||||
inline static void keyClick(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
|
||||
Q_DECL_UNUSED inline static void keyClick(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
|
||||
{ keyEvent(Click, window, key, modifier, delay); }
|
||||
inline static void keyClick(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
|
||||
Q_DECL_UNUSED inline static void keyClick(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
|
||||
{ keyEvent(Click, window, key, modifier, delay); }
|
||||
inline static void keyRelease(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
|
||||
Q_DECL_UNUSED inline static void keyRelease(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
|
||||
{ keyEvent(Release, window, key, modifier, delay); }
|
||||
inline static void keyRelease(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
|
||||
Q_DECL_UNUSED inline static void keyRelease(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
|
||||
{ keyEvent(Release, window, key, modifier, delay); }
|
||||
inline static void keyPress(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
|
||||
Q_DECL_UNUSED inline static void keyPress(QWindow *window, char key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
|
||||
{ keyEvent(Press, window, key, modifier, delay); }
|
||||
inline static void keyPress(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
|
||||
Q_DECL_UNUSED inline static void keyPress(QWindow *window, Qt::Key key, Qt::KeyboardModifiers modifier = Qt::NoModifier, int delay=-1)
|
||||
{ keyEvent(Press, window, key, modifier, delay); }
|
||||
|
||||
#ifdef QT_WIDGETS_LIB
|
||||
|
@ -56,7 +56,7 @@ QT_BEGIN_NAMESPACE
|
||||
|
||||
namespace QTest
|
||||
{
|
||||
inline static void qWait(int ms)
|
||||
Q_DECL_UNUSED inline static void qWait(int ms)
|
||||
{
|
||||
Q_ASSERT(QCoreApplication::instance());
|
||||
|
||||
|
@ -343,7 +343,8 @@ int runMoc(int argc, char **argv)
|
||||
parser.showHelp(1);
|
||||
}
|
||||
Macro macro;
|
||||
macro.symbols += Symbol(0, PP_IDENTIFIER, value);
|
||||
macro.symbols = Preprocessor::tokenize(value, 1, Preprocessor::TokenizeDefine);
|
||||
macro.symbols.removeLast(); // remove the EOF symbol
|
||||
pp.macros.insert(name, macro);
|
||||
}
|
||||
foreach (const QString &arg, parser.values(undefineOption)) {
|
||||
|
@ -158,8 +158,7 @@ bool Preprocessor::skipBranch()
|
||||
}
|
||||
|
||||
|
||||
enum TokenizeMode { TokenizeCpp, TokenizePreprocessor, PreparePreprocessorStatement, TokenizePreprocessorStatement, TokenizeInclude, PrepareDefine, TokenizeDefine };
|
||||
static Symbols tokenize(const QByteArray &input, int lineNum = 1, TokenizeMode mode = TokenizeCpp)
|
||||
Symbols Preprocessor::tokenize(const QByteArray& input, int lineNum, Preprocessor::TokenizeMode mode)
|
||||
{
|
||||
Symbols symbols;
|
||||
const char *begin = input.constData();
|
||||
|
@ -89,6 +89,8 @@ public:
|
||||
|
||||
int evaluateCondition();
|
||||
|
||||
enum TokenizeMode { TokenizeCpp, TokenizePreprocessor, PreparePreprocessorStatement, TokenizePreprocessorStatement, TokenizeInclude, PrepareDefine, TokenizeDefine };
|
||||
static Symbols tokenize(const QByteArray &input, int lineNum = 1, TokenizeMode mode = TokenizeCpp);
|
||||
|
||||
private:
|
||||
void until(Token);
|
||||
|
@ -196,8 +196,7 @@ void MetaStack::process(QChar ch, const Location& location)
|
||||
if (ch == QLatin1Char('{')) {
|
||||
push(MetaStackEntry());
|
||||
top().open();
|
||||
}
|
||||
else if (ch == QLatin1Char('}')) {
|
||||
} else if (ch == QLatin1Char('}')) {
|
||||
if (count() == 1)
|
||||
location.fatal(tr("Unexpected '}'"));
|
||||
|
||||
@ -215,12 +214,10 @@ void MetaStack::process(QChar ch, const Location& location)
|
||||
}
|
||||
++pre;
|
||||
}
|
||||
}
|
||||
else if (ch == QLatin1Char(',') && count() > 1) {
|
||||
} else if (ch == QLatin1Char(',') && count() > 1) {
|
||||
top().close();
|
||||
top().open();
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
/*
|
||||
This is where all the processing is done.
|
||||
*/
|
||||
@ -296,12 +293,10 @@ Config::~Config()
|
||||
void Config::load(const QString& fileName)
|
||||
{
|
||||
load(Location::null, fileName);
|
||||
if (loc.isEmpty()) {
|
||||
if (loc.isEmpty())
|
||||
loc = Location(fileName);
|
||||
}
|
||||
else {
|
||||
else
|
||||
loc.setEtc(true);
|
||||
}
|
||||
lastLocation_ = Location::null;
|
||||
}
|
||||
|
||||
@ -472,9 +467,8 @@ QStringList Config::getCanonicalPathList(const QString& var) const
|
||||
const ConfigVar& cv = configVars[i];
|
||||
if (!cv.location_.isEmpty())
|
||||
(Location&) lastLocation_ = cv.location_;
|
||||
if (!cv.plus_) {
|
||||
if (!cv.plus_)
|
||||
t.clear();
|
||||
}
|
||||
const QString d = cv.currentPath_;
|
||||
const QStringList& sl = cv.values_;
|
||||
if (!sl.isEmpty()) {
|
||||
@ -786,9 +780,8 @@ QString Config::findFile(const Location& location,
|
||||
QStringList::ConstIterator d = dirs.constBegin();
|
||||
while (d != dirs.constEnd()) {
|
||||
fileInfo.setFile(QDir(*d), firstComponent);
|
||||
if (fileInfo.exists()) {
|
||||
if (fileInfo.exists())
|
||||
break;
|
||||
}
|
||||
++d;
|
||||
}
|
||||
}
|
||||
@ -808,9 +801,9 @@ QString Config::findFile(const Location& location,
|
||||
QString extracted = extractedDirs[fileInfo.filePath()];
|
||||
++c;
|
||||
fileInfo.setFile(QDir(extracted), *c);
|
||||
}
|
||||
else
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
|
||||
userFriendlyFilePath += QLatin1Char('?');
|
||||
}
|
||||
@ -876,9 +869,8 @@ QString Config::copyFile(const Location& location,
|
||||
|
||||
char buffer[1024];
|
||||
int len;
|
||||
while ((len = inFile.read(buffer, sizeof(buffer))) > 0) {
|
||||
while ((len = inFile.read(buffer, sizeof(buffer))) > 0)
|
||||
outFile.write(buffer, len);
|
||||
}
|
||||
return outFileName;
|
||||
}
|
||||
|
||||
@ -1002,17 +994,15 @@ void Config::load(Location location, const QString& fileName)
|
||||
QChar c = text.at(0);
|
||||
uint cc = c.unicode();
|
||||
while (i < (int) text.length()) {
|
||||
if (cc == 0)
|
||||
if (cc == 0) {
|
||||
++i;
|
||||
else if (c.isSpace()) {
|
||||
} else if (c.isSpace()) {
|
||||
SKIP_CHAR();
|
||||
}
|
||||
else if (cc == '#') {
|
||||
} else if (cc == '#') {
|
||||
do {
|
||||
SKIP_CHAR();
|
||||
} while (cc != '\n');
|
||||
}
|
||||
else if (isMetaKeyChar(c)) {
|
||||
} else if (isMetaKeyChar(c)) {
|
||||
Location keyLoc = location;
|
||||
bool plus = false;
|
||||
QString stringValue;
|
||||
@ -1184,15 +1174,13 @@ void Config::load(Location location, const QString& fileName)
|
||||
++key;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
location.fatal(tr("Unexpected character '%1' at beginning of line").arg(c));
|
||||
}
|
||||
}
|
||||
popWorkingDir();
|
||||
if (!workingDirs_.isEmpty()) {
|
||||
if (!workingDirs_.isEmpty())
|
||||
QDir::setCurrent(workingDirs_.top());
|
||||
}
|
||||
}
|
||||
|
||||
QStringList Config::getFilesHere(const QString& uncleanDir,
|
||||
@ -1219,9 +1207,8 @@ QStringList Config::getFilesHere(const QString& uncleanDir,
|
||||
if (!fn->startsWith(QLatin1Char('~'))) {
|
||||
QString s = dirInfo.filePath(*fn);
|
||||
QString c = QDir::cleanPath(s);
|
||||
if (!excludedFiles.contains(c)) {
|
||||
if (!excludedFiles.contains(c))
|
||||
result.append(c);
|
||||
}
|
||||
}
|
||||
++fn;
|
||||
}
|
||||
@ -1251,9 +1238,9 @@ void Config::pushWorkingDir(const QString& dir)
|
||||
*/
|
||||
QString Config::popWorkingDir()
|
||||
{
|
||||
if (!workingDirs_.isEmpty()) {
|
||||
if (!workingDirs_.isEmpty())
|
||||
return workingDirs_.pop();
|
||||
}
|
||||
|
||||
qDebug() << "RETURNED EMPTY WORKING DIR";
|
||||
return QString();
|
||||
}
|
||||
|
@ -62,7 +62,6 @@ depends += \
|
||||
qtsql \
|
||||
qtsvg \
|
||||
qttestlib \
|
||||
qttools \
|
||||
qtuitools \
|
||||
qtversit \
|
||||
qtwidgets \
|
||||
|
@ -1,6 +1,7 @@
|
||||
!force_bootstrap {
|
||||
load(qfeatures)
|
||||
requires(!contains(QT_DISABLED_FEATURES, xmlstreamwriter))
|
||||
requires(!contains(QT_DISABLED_FEATURES, dom))
|
||||
}
|
||||
|
||||
option(host_build)
|
||||
|
@ -44,7 +44,7 @@ w->setWindowState(w->windowState() ^ Qt::WindowFullScreen);
|
||||
|
||||
|
||||
//! [1]
|
||||
w->setWindowState(w->windowState() & ~Qt::WindowMinimized | Qt::WindowActive);
|
||||
w->setWindowState((w->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
|
||||
//! [1]
|
||||
|
||||
|
||||
|
@ -2274,7 +2274,7 @@ void QGraphicsWidget::paintWindowFrame(QPainter *painter, const QStyleOptionGrap
|
||||
const QPointF styleOrigin = this->windowFrameRect().topLeft();
|
||||
painter->translate(styleOrigin);
|
||||
|
||||
#ifdef Q_WS_MAC
|
||||
#ifdef Q_OS_MAC
|
||||
const QSize pixmapSize = windowFrameRect.size();
|
||||
if (pixmapSize.width() <= 0 || pixmapSize.height() <= 0)
|
||||
return;
|
||||
@ -2342,7 +2342,7 @@ void QGraphicsWidget::paintWindowFrame(QPainter *painter, const QStyleOptionGrap
|
||||
frameOptions.midLineWidth = 1;
|
||||
style()->drawPrimitive(QStyle::PE_FrameWindow, &frameOptions, painter, widget);
|
||||
|
||||
#ifdef Q_WS_MAC
|
||||
#ifdef Q_OS_MAC
|
||||
realPainter->drawPixmap(QPoint(), pm);
|
||||
delete painter;
|
||||
#endif
|
||||
|
@ -915,6 +915,11 @@ QStyleOptionViewItem QListView::viewOptions() const
|
||||
} else {
|
||||
option.decorationPosition = QStyleOptionViewItem::Left;
|
||||
}
|
||||
|
||||
if (d->gridSize().isValid()) {
|
||||
option.rect.setSize(d->gridSize());
|
||||
}
|
||||
|
||||
return option;
|
||||
}
|
||||
|
||||
|
@ -5026,16 +5026,6 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP
|
||||
if (rgn.isEmpty())
|
||||
return;
|
||||
|
||||
#ifdef Q_WS_MAC
|
||||
if (qt_mac_clearDirtyOnWidgetInsideDrawWidget)
|
||||
dirtyOnWidget = QRegion();
|
||||
|
||||
// We disable the rendering of QToolBar in the backingStore if
|
||||
// it's supposed to be in the unified toolbar on Mac OS X.
|
||||
if (backingStore && isInUnifiedToolbar)
|
||||
return;
|
||||
#endif // Q_WS_MAC
|
||||
|
||||
const bool asRoot = flags & DrawAsRoot;
|
||||
bool onScreen = paintOnScreen();
|
||||
|
||||
@ -9403,26 +9393,13 @@ QWidget *QWidgetPrivate::childAt_helper(const QPoint &p, bool ignoreChildrenInDe
|
||||
if (children.isEmpty())
|
||||
return 0;
|
||||
|
||||
#ifdef Q_WS_MAC
|
||||
Q_Q(const QWidget);
|
||||
// Unified tool bars on the Mac require special handling since they live outside
|
||||
// QMainWindow's geometry(). See commit: 35667fd45ada49269a5987c235fdedfc43e92bb8
|
||||
bool includeFrame = q->isWindow() && qobject_cast<const QMainWindow *>(q)
|
||||
&& static_cast<const QMainWindow *>(q)->unifiedTitleAndToolBarOnMac();
|
||||
if (includeFrame)
|
||||
return childAtRecursiveHelper(p, ignoreChildrenInDestructor, includeFrame);
|
||||
#endif
|
||||
|
||||
if (!pointInsideRectAndMask(p))
|
||||
return 0;
|
||||
return childAtRecursiveHelper(p, ignoreChildrenInDestructor);
|
||||
}
|
||||
|
||||
QWidget *QWidgetPrivate::childAtRecursiveHelper(const QPoint &p, bool ignoreChildrenInDestructor, bool includeFrame) const
|
||||
QWidget *QWidgetPrivate::childAtRecursiveHelper(const QPoint &p, bool ignoreChildrenInDestructor) const
|
||||
{
|
||||
#ifndef Q_WS_MAC
|
||||
Q_UNUSED(includeFrame);
|
||||
#endif
|
||||
for (int i = children.size() - 1; i >= 0; --i) {
|
||||
QWidget *child = qobject_cast<QWidget *>(children.at(i));
|
||||
if (!child || child->isWindow() || child->isHidden() || child->testAttribute(Qt::WA_TransparentForMouseEvents)
|
||||
@ -9432,14 +9409,6 @@ QWidget *QWidgetPrivate::childAtRecursiveHelper(const QPoint &p, bool ignoreChil
|
||||
|
||||
// Map the point 'p' from parent coordinates to child coordinates.
|
||||
QPoint childPoint = p;
|
||||
#ifdef Q_WS_MAC
|
||||
// 'includeFrame' is true if the child's parent is a top-level QMainWindow with an unified tool bar.
|
||||
// An unified tool bar on the Mac lives outside QMainWindow's geometry(), so a normal
|
||||
// QWidget::mapFromParent won't do the trick.
|
||||
if (includeFrame && qobject_cast<QToolBar *>(child))
|
||||
childPoint = qt_mac_nativeMapFromParent(child, p);
|
||||
else
|
||||
#endif
|
||||
childPoint -= child->data->crect.topLeft();
|
||||
|
||||
// Check if the point hits the child.
|
||||
@ -9614,13 +9583,7 @@ void QWidget::setParent(QWidget *parent, Qt::WindowFlags f)
|
||||
bool newParent = (parent != parentWidget()) || !wasCreated || desktopWidget;
|
||||
|
||||
if (newParent && parent && !desktopWidget) {
|
||||
if (testAttribute(Qt::WA_NativeWindow) && !qApp->testAttribute(Qt::AA_DontCreateNativeWidgetSiblings)
|
||||
#ifdef Q_WS_MAC
|
||||
// On Mac, toolbars inside the unified title bar will never overlap with
|
||||
// siblings in the content view. So we skip enforce native siblings in that case
|
||||
&& !d->isInUnifiedToolbar && parentWidget() && parentWidget()->isWindow()
|
||||
#endif // Q_WS_MAC
|
||||
)
|
||||
if (testAttribute(Qt::WA_NativeWindow) && !qApp->testAttribute(Qt::AA_DontCreateNativeWidgetSiblings))
|
||||
parent->d_func()->enforceNativeChildren();
|
||||
else if (parent->d_func()->nativeChildrenForced() || parent->testAttribute(Qt::WA_PaintOnScreen))
|
||||
setAttribute(Qt::WA_NativeWindow);
|
||||
@ -9879,12 +9842,6 @@ void QWidget::repaint(const QRect &rect)
|
||||
return;
|
||||
|
||||
if (hasBackingStoreSupport()) {
|
||||
#ifdef Q_WS_MAC
|
||||
if (qt_widget_private(this)->isInUnifiedToolbar) {
|
||||
qt_widget_private(this)->unifiedSurface->renderToolbar(this, true);
|
||||
return;
|
||||
}
|
||||
#endif // Q_WS_MAC
|
||||
QTLWExtra *tlwExtra = window()->d_func()->maybeTopData();
|
||||
if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) {
|
||||
tlwExtra->inRepaint = true;
|
||||
@ -9914,12 +9871,6 @@ void QWidget::repaint(const QRegion &rgn)
|
||||
return;
|
||||
|
||||
if (hasBackingStoreSupport()) {
|
||||
#ifdef Q_WS_MAC
|
||||
if (qt_widget_private(this)->isInUnifiedToolbar) {
|
||||
qt_widget_private(this)->unifiedSurface->renderToolbar(this, true);
|
||||
return;
|
||||
}
|
||||
#endif // Q_WS_MAC
|
||||
QTLWExtra *tlwExtra = window()->d_func()->maybeTopData();
|
||||
if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) {
|
||||
tlwExtra->inRepaint = true;
|
||||
@ -9982,12 +9933,6 @@ void QWidget::update(const QRect &rect)
|
||||
}
|
||||
|
||||
if (hasBackingStoreSupport()) {
|
||||
#ifdef Q_WS_MAC
|
||||
if (qt_widget_private(this)->isInUnifiedToolbar) {
|
||||
qt_widget_private(this)->unifiedSurface->renderToolbar(this, true);
|
||||
return;
|
||||
}
|
||||
#endif // Q_WS_MAC
|
||||
QTLWExtra *tlwExtra = window()->d_func()->maybeTopData();
|
||||
if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore)
|
||||
tlwExtra->backingStoreTracker->markDirty(r, this);
|
||||
@ -10017,12 +9962,6 @@ void QWidget::update(const QRegion &rgn)
|
||||
}
|
||||
|
||||
if (hasBackingStoreSupport()) {
|
||||
#ifdef Q_WS_MAC
|
||||
if (qt_widget_private(this)->isInUnifiedToolbar) {
|
||||
qt_widget_private(this)->unifiedSurface->renderToolbar(this, true);
|
||||
return;
|
||||
}
|
||||
#endif // Q_WS_MAC
|
||||
QTLWExtra *tlwExtra = window()->d_func()->maybeTopData();
|
||||
if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore)
|
||||
tlwExtra->backingStoreTracker->markDirty(r, this);
|
||||
@ -10218,13 +10157,7 @@ void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on)
|
||||
qApp->inputMethod()->commit();
|
||||
qApp->inputMethod()->update(Qt::ImEnabled);
|
||||
}
|
||||
if (!qApp->testAttribute(Qt::AA_DontCreateNativeWidgetSiblings) && parentWidget()
|
||||
#ifdef Q_WS_MAC
|
||||
// On Mac, toolbars inside the unified title bar will never overlap with
|
||||
// siblings in the content view. So we skip enforce native siblings in that case
|
||||
&& !d->isInUnifiedToolbar && parentWidget()->isWindow()
|
||||
#endif // Q_WS_MAC
|
||||
)
|
||||
if (!qApp->testAttribute(Qt::AA_DontCreateNativeWidgetSiblings) && parentWidget())
|
||||
parentWidget()->d_func()->enforceNativeChildren();
|
||||
if (on && !internalWinId() && testAttribute(Qt::WA_WState_Created))
|
||||
d->createWinId();
|
||||
@ -11544,28 +11477,6 @@ void QWidget::clearMask()
|
||||
setMask(QRegion());
|
||||
}
|
||||
|
||||
#ifdef Q_WS_MAC
|
||||
void QWidgetPrivate::syncUnifiedMode() {
|
||||
// The whole purpose of this method is to keep the unifiedToolbar in sync.
|
||||
// That means making sure we either exchange the drawing methods or we let
|
||||
// the toolbar know that it does not require to draw the baseline.
|
||||
Q_Q(QWidget);
|
||||
// This function makes sense only if this is a top level
|
||||
if(!q->isWindow())
|
||||
return;
|
||||
OSWindowRef window = qt_mac_window_for(q);
|
||||
if(changeMethods) {
|
||||
// Ok, we are in documentMode.
|
||||
if(originalDrawMethod)
|
||||
qt_mac_replaceDrawRect(window, this);
|
||||
} else {
|
||||
if(!originalDrawMethod)
|
||||
qt_mac_replaceDrawRectOriginal(window, this);
|
||||
}
|
||||
}
|
||||
|
||||
#endif // Q_WS_MAC
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#include "moc_qwidget.cpp"
|
||||
|
@ -495,7 +495,7 @@ public:
|
||||
void setConstraints_sys();
|
||||
bool pointInsideRectAndMask(const QPoint &) const;
|
||||
QWidget *childAt_helper(const QPoint &, bool) const;
|
||||
QWidget *childAtRecursiveHelper(const QPoint &p, bool, bool includeFrame = false) const;
|
||||
QWidget *childAtRecursiveHelper(const QPoint &p, bool) const;
|
||||
void updateGeometry_helper(bool forceUpdate);
|
||||
|
||||
void getLayoutItemMargins(int *left, int *top, int *right, int *bottom) const;
|
||||
@ -780,7 +780,6 @@ public:
|
||||
void finishCreateWindow_sys_Cocoa(void * /*NSWindow * */ windowRef);
|
||||
void syncCocoaMask();
|
||||
void finishCocoaMaskSetup();
|
||||
void syncUnifiedMode();
|
||||
// Did we add the drawRectOriginal method?
|
||||
bool drawRectOriginalAdded;
|
||||
// Is the original drawRect method available?
|
||||
|
@ -838,7 +838,10 @@ QSize QCommonStylePrivate::viewItemSize(const QStyleOptionViewItem *option, int
|
||||
break;
|
||||
case QStyleOptionViewItem::Top:
|
||||
case QStyleOptionViewItem::Bottom:
|
||||
bounds.setWidth(wrapText ? option->decorationSize.width() : QFIXED_MAX);
|
||||
if (wrapText)
|
||||
bounds.setWidth(bounds.isValid() ? bounds.width() - 2 * textMargin : option->decorationSize.width());
|
||||
else
|
||||
bounds.setWidth(QFIXED_MAX);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -679,6 +679,18 @@ bool qt_macWindowIsTextured(const QWidget *window)
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool qt_macWindowMainWindow(const QWidget *window)
|
||||
{
|
||||
if (QWindow *w = window->windowHandle()) {
|
||||
if (w->handle()) {
|
||||
if (NSWindow *nswindow = static_cast<NSWindow*>(QGuiApplication::platformNativeInterface()->nativeResourceForWindow(QByteArrayLiteral("nswindow"), w))) {
|
||||
return [nswindow isMainWindow];
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
QMacCGStyle globals
|
||||
*****************************************************************************/
|
||||
@ -2425,11 +2437,6 @@ int QMacStyle::pixelMetric(PixelMetric metric, const QStyleOption *opt, const QW
|
||||
break;
|
||||
case PM_ToolBarFrameWidth:
|
||||
ret = 1;
|
||||
if (widget) {
|
||||
if (QMainWindow * mainWindow = qobject_cast<QMainWindow *>(widget->parent()))
|
||||
if (mainWindow->unifiedTitleAndToolBarOnMac())
|
||||
ret = 0;
|
||||
}
|
||||
break;
|
||||
case PM_ScrollView_ScrollBarOverlap:
|
||||
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7
|
||||
@ -3008,23 +3015,19 @@ void QMacStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, QPai
|
||||
if (opt->state & State_Horizontal) {
|
||||
while (y < opt->rect.height() - RectHeight - 5) {
|
||||
path.moveTo(x, y);
|
||||
path.addRect(x, y, RectHeight, RectHeight);
|
||||
path.addEllipse(x, y, RectHeight, RectHeight);
|
||||
y += 6;
|
||||
}
|
||||
} else {
|
||||
while (x < opt->rect.width() - RectHeight - 5) {
|
||||
path.moveTo(x, y);
|
||||
path.addRect(x, y, RectHeight, RectHeight);
|
||||
path.addEllipse(x, y, RectHeight, RectHeight);
|
||||
x += 6;
|
||||
}
|
||||
}
|
||||
p->setPen(Qt::NoPen);
|
||||
QColor dark = opt->palette.dark().color();
|
||||
dark.setAlphaF(0.75);
|
||||
QColor light = opt->palette.light().color();
|
||||
light.setAlphaF(0.6);
|
||||
p->fillPath(path, light);
|
||||
p->translate(1, 1);
|
||||
QColor dark = opt->palette.dark().color().darker();
|
||||
dark.setAlphaF(0.50);
|
||||
p->fillPath(path, dark);
|
||||
p->restore();
|
||||
|
||||
@ -3437,14 +3440,8 @@ void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter
|
||||
if (tb->toolButtonStyle != Qt::ToolButtonIconOnly) {
|
||||
needText = true;
|
||||
if (tb->toolButtonStyle == Qt::ToolButtonTextUnderIcon) {
|
||||
QMainWindow *mw = w ? qobject_cast<QMainWindow *>(w->window()) : 0;
|
||||
if (mw && mw->unifiedTitleAndToolBarOnMac()) {
|
||||
pr.setHeight(pixmap.size().height() / pixmap.devicePixelRatio());
|
||||
cr.adjust(0, pr.bottom() + 1, 0, 1);
|
||||
} else {
|
||||
pr.setHeight(pixmap.size().height() / pixmap.devicePixelRatio() + 6);
|
||||
cr.adjust(0, pr.bottom(), 0, -3);
|
||||
}
|
||||
pr.setHeight(pixmap.size().height() / pixmap.devicePixelRatio() + 6);
|
||||
cr.adjust(0, pr.bottom(), 0, -3);
|
||||
alignment |= Qt::AlignCenter;
|
||||
} else {
|
||||
pr.setWidth(pixmap.width() / pixmap.devicePixelRatio() + 8);
|
||||
@ -4442,12 +4439,34 @@ void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter
|
||||
}
|
||||
break;
|
||||
case CE_ToolBar: {
|
||||
// For unified tool bars, draw nothing.
|
||||
if (w) {
|
||||
const QStyleOptionToolBar *toolBar = qstyleoption_cast<const QStyleOptionToolBar *>(opt);
|
||||
|
||||
// Unified title and toolbar drawing. In this mode the cocoa platform plugin will
|
||||
// fill the top toolbar area part with a background gradient that "unifies" with
|
||||
// the title bar. The following code fills the toolBar area with transparent pixels
|
||||
// to make that gradient visible.
|
||||
if (w) {
|
||||
if (QMainWindow * mainWindow = qobject_cast<QMainWindow *>(w->window())) {
|
||||
if (mainWindow->unifiedTitleAndToolBarOnMac())
|
||||
if (toolBar && toolBar->toolBarArea == Qt::TopToolBarArea && mainWindow->unifiedTitleAndToolBarOnMac()) {
|
||||
|
||||
// fill with transparent pixels.
|
||||
p->save();
|
||||
p->setCompositionMode(QPainter::CompositionMode_Source);
|
||||
p->fillRect(opt->rect, Qt::transparent);
|
||||
p->restore();
|
||||
|
||||
// drow horizontal sepearator line at toolBar bottom.
|
||||
SInt32 margin;
|
||||
GetThemeMetric(kThemeMetricSeparatorSize, &margin);
|
||||
CGRect separatorRect = CGRectMake(opt->rect.left(), opt->rect.bottom(), opt->rect.width(), margin);
|
||||
HIThemeSeparatorDrawInfo separatorDrawInfo;
|
||||
separatorDrawInfo.version = 0;
|
||||
separatorDrawInfo.state = qt_macWindowMainWindow(mainWindow) ? kThemeStateActive : kThemeStateInactive;
|
||||
QMacCGContext cg(p);
|
||||
HIThemeDrawSeparator(&separatorRect, &separatorDrawInfo, cg, kHIThemeOrientationNormal);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// draw background gradient
|
||||
@ -6241,18 +6260,6 @@ QSize QMacStyle::sizeFromContents(ContentsType ct, const QStyleOption *opt,
|
||||
}
|
||||
break;
|
||||
case CT_ToolButton:
|
||||
if (widget && qobject_cast<const QToolBar *>(widget->parentWidget())) {
|
||||
if (QMainWindow * mainWindow = qobject_cast<QMainWindow *>(widget->parent())) {
|
||||
if (mainWindow->unifiedTitleAndToolBarOnMac()) {
|
||||
sz.rwidth() += 4;
|
||||
if (sz.height() <= 32) {
|
||||
// Workaround strange HIToolBar bug when getting constraints.
|
||||
sz.rheight() += 1;
|
||||
}
|
||||
return sz;
|
||||
}
|
||||
}
|
||||
}
|
||||
sz.rwidth() += 10;
|
||||
sz.rheight() += 10;
|
||||
return sz;
|
||||
|
@ -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
|
||||
of the text edit's current selection. It is called when the selection needs
|
||||
to be encapsulated into a new QMimeData object; for example, when a drag
|
||||
and drop operation is started, or when data is copyied to the clipboard.
|
||||
and drop operation is started, or when data is copied to the clipboard.
|
||||
|
||||
If you reimplement this function, note that the ownership of the returned
|
||||
QMimeData object is passed to the caller. The selection can be retrieved
|
||||
|
@ -57,11 +57,6 @@
|
||||
#include <qwidgetaction.h>
|
||||
#include <qtimer.h>
|
||||
#include <private/qwidgetaction_p.h>
|
||||
#ifdef Q_WS_MAC
|
||||
#include <private/qt_mac_p.h>
|
||||
#include <private/qt_cocoa_helpers_mac_p.h>
|
||||
#endif
|
||||
|
||||
#include <private/qmainwindowlayout_p.h>
|
||||
|
||||
#include "qtoolbar_p.h"
|
||||
@ -74,14 +69,6 @@
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
#ifdef Q_WS_MAC
|
||||
static void qt_mac_updateToolBarButtonHint(QWidget *parentWidget)
|
||||
{
|
||||
if (!(parentWidget->windowFlags() & Qt::CustomizeWindowHint))
|
||||
parentWidget->setWindowFlags(parentWidget->windowFlags() | Qt::MacWindowToolBarButtonHint);
|
||||
}
|
||||
#endif
|
||||
|
||||
// qmainwindow.cpp
|
||||
extern QMainWindowLayout *qt_mainwindow_layout(const QMainWindow *window);
|
||||
|
||||
@ -104,17 +91,6 @@ void QToolBarPrivate::init()
|
||||
layout = new QToolBarLayout(q);
|
||||
layout->updateMarginAndSpacing();
|
||||
|
||||
#ifdef Q_WS_MAC
|
||||
if (q->parentWidget() && q->parentWidget()->isWindow()) {
|
||||
// Make sure that the window has the "toolbar" button.
|
||||
QWidget *parentWidget = q->parentWidget();
|
||||
qt_mac_updateToolBarButtonHint(parentWidget);
|
||||
reinterpret_cast<QToolBar *>(parentWidget)->d_func()->createWinId(); // Please let me create your winId...
|
||||
extern OSWindowRef qt_mac_window_for(const QWidget *); // qwidget_mac.cpp
|
||||
macWindowToolbarShow(q->parentWidget(), true);
|
||||
}
|
||||
#endif
|
||||
|
||||
toggleViewAction = new QAction(q);
|
||||
toggleViewAction->setCheckable(true);
|
||||
q->setMovable(q->style()->styleHint(QStyle::SH_ToolBar_Movable, 0, q ));
|
||||
@ -158,12 +134,8 @@ void QToolBarPrivate::updateWindowFlags(bool floating, bool unplug)
|
||||
|
||||
flags |= Qt::FramelessWindowHint;
|
||||
|
||||
if (unplug) {
|
||||
if (unplug)
|
||||
flags |= Qt::X11BypassWindowManagerHint;
|
||||
#ifdef Q_WS_MAC
|
||||
flags |= Qt::WindowStaysOnTopHint;
|
||||
#endif
|
||||
}
|
||||
|
||||
q->setWindowFlags(flags);
|
||||
}
|
||||
@ -272,7 +244,7 @@ bool QToolBarPrivate::mousePressEvent(QMouseEvent *event)
|
||||
QStyleOptionToolBar opt;
|
||||
q->initStyleOption(&opt);
|
||||
if (q->style()->subElementRect(QStyle::SE_ToolBarHandle, &opt, q).contains(event->pos()) == false) {
|
||||
#ifdef Q_WS_MAC
|
||||
#ifdef Q_OS_OSX
|
||||
// When using the unified toolbar on Mac OS X, the user can click and
|
||||
// drag between toolbar contents to move the window. Make this work by
|
||||
// implementing the standard mouse-dragging code and then call
|
||||
@ -306,7 +278,7 @@ bool QToolBarPrivate::mouseReleaseEvent(QMouseEvent*)
|
||||
endDrag();
|
||||
return true;
|
||||
} else {
|
||||
#ifdef Q_WS_MAC
|
||||
#ifdef Q_OS_OSX
|
||||
if (!macWindowDragging)
|
||||
return false;
|
||||
macWindowDragging = false;
|
||||
@ -322,7 +294,7 @@ bool QToolBarPrivate::mouseMoveEvent(QMouseEvent *event)
|
||||
Q_Q(QToolBar);
|
||||
|
||||
if (!state) {
|
||||
#ifdef Q_WS_MAC
|
||||
#ifdef Q_OS_OSX
|
||||
if (!macWindowDragging)
|
||||
return false;
|
||||
QWidget *w = q->window();
|
||||
@ -569,16 +541,6 @@ QToolBar::QToolBar(const QString &title, QWidget *parent)
|
||||
*/
|
||||
QToolBar::~QToolBar()
|
||||
{
|
||||
// Remove the toolbar button if there is nothing left.
|
||||
QMainWindow *mainwindow = qobject_cast<QMainWindow *>(parentWidget());
|
||||
if (mainwindow) {
|
||||
#ifdef Q_WS_MAC
|
||||
QMainWindowLayout *mainwin_layout = qt_mainwindow_layout(mainwindow);
|
||||
if (mainwin_layout && mainwin_layout->layoutState.toolBarAreaLayout.isEmpty()
|
||||
&& mainwindow->testAttribute(Qt::WA_WState_Created))
|
||||
macWindowToolbarShow(mainwindow, false);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/*! \property QToolBar::movable
|
||||
@ -665,12 +627,6 @@ void QToolBar::setAllowedAreas(Qt::ToolBarAreas areas)
|
||||
Qt::ToolBarAreas QToolBar::allowedAreas() const
|
||||
{
|
||||
Q_D(const QToolBar);
|
||||
#ifdef Q_WS_MAC
|
||||
if (QMainWindow *window = qobject_cast<QMainWindow *>(parentWidget())) {
|
||||
if (window->unifiedTitleAndToolBarOnMac()) // Don't allow drags to the top (for now).
|
||||
return (d->allowedAreas & ~Qt::TopToolBarArea);
|
||||
}
|
||||
#endif
|
||||
return d->allowedAreas;
|
||||
}
|
||||
|
||||
@ -1083,15 +1039,6 @@ static bool waitForPopup(QToolBar *tb, QWidget *popup)
|
||||
return false;
|
||||
}
|
||||
|
||||
#if defined(Q_WS_MAC)
|
||||
static bool toolbarInUnifiedToolBar(QToolBar *toolbar)
|
||||
{
|
||||
const QMainWindow *mainWindow = qobject_cast<const QMainWindow *>(toolbar->parentWidget());
|
||||
return mainWindow && mainWindow->unifiedTitleAndToolBarOnMac()
|
||||
&& mainWindow->toolBarArea(toolbar) == Qt::TopToolBarArea;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*! \reimp */
|
||||
bool QToolBar::event(QEvent *event)
|
||||
{
|
||||
@ -1115,22 +1062,9 @@ bool QToolBar::event(QEvent *event)
|
||||
case QEvent::Show:
|
||||
d->toggleViewAction->setChecked(event->type() == QEvent::Show);
|
||||
emit visibilityChanged(event->type() == QEvent::Show);
|
||||
#if defined(Q_WS_MAC)
|
||||
if (toolbarInUnifiedToolBar(this)) {
|
||||
// I can static_cast because I did the qobject_cast in the if above, therefore
|
||||
// we must have a QMainWindowLayout here.
|
||||
QMainWindowLayout *mwLayout = qt_mainwindow_layout(qobject_cast<QMainWindow *>(parentWidget()));
|
||||
mwLayout->fixSizeInUnifiedToolbar(this);
|
||||
mwLayout->syncUnifiedToolbarVisibility();
|
||||
}
|
||||
#endif // Q_WS_MAC
|
||||
break;
|
||||
case QEvent::ParentChange:
|
||||
d->layout->checkUsePopupMenu();
|
||||
#if defined(Q_WS_MAC)
|
||||
if (parentWidget() && parentWidget()->isWindow())
|
||||
qt_mac_updateToolBarButtonHint(parentWidget());
|
||||
#endif
|
||||
break;
|
||||
|
||||
case QEvent::MouseButtonPress: {
|
||||
|
@ -75,7 +75,7 @@ public:
|
||||
allowedAreas(Qt::AllToolBarAreas), orientation(Qt::Horizontal),
|
||||
toolButtonStyle(Qt::ToolButtonIconOnly),
|
||||
layout(0), state(0)
|
||||
#ifdef Q_WS_MAC
|
||||
#ifdef Q_OS_OSX
|
||||
, macWindowDragging(false)
|
||||
#endif
|
||||
{ }
|
||||
@ -107,7 +107,7 @@ public:
|
||||
};
|
||||
DragState *state;
|
||||
|
||||
#ifdef Q_WS_MAC
|
||||
#ifdef Q_OS_OSX
|
||||
bool macWindowDragging;
|
||||
QPoint macWindowDragPressPosition;
|
||||
#endif
|
||||
|
@ -332,20 +332,6 @@ void QToolBarLayout::updateGeomArray() const
|
||||
|
||||
rpick(o, that->hint) += handleExtent;
|
||||
that->hint += QSize(2*margin, 2*margin);
|
||||
that->dirty = false;
|
||||
#ifdef Q_WS_MAC
|
||||
if (QMainWindow *mw = qobject_cast<QMainWindow *>(parentWidget()->parentWidget())) {
|
||||
if (mw->unifiedTitleAndToolBarOnMac()
|
||||
&& mw->toolBarArea(static_cast<QToolBar *>(parentWidget())) == Qt::TopToolBarArea) {
|
||||
if (expandFlag) {
|
||||
tb->setMaximumSize(0xFFFFFF, 0xFFFFFF);
|
||||
} else {
|
||||
tb->setMaximumSize(hint);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
that->dirty = false;
|
||||
}
|
||||
|
||||
@ -401,15 +387,6 @@ void QToolBarLayout::setGeometry(const QRect &rect)
|
||||
if (!extension->isHidden())
|
||||
extension->hide();
|
||||
}
|
||||
#ifdef Q_WS_MAC
|
||||
if (QMainWindow *win = qobject_cast<QMainWindow*>(tb->parentWidget())) {
|
||||
Qt::ToolBarArea area = win->toolBarArea(tb);
|
||||
if (win->unifiedTitleAndToolBarOnMac() && area == Qt::TopToolBarArea) {
|
||||
qt_mainwindow_layout(win)->fixSizeInUnifiedToolbar(tb);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
bool QToolBarLayout::layoutActions(const QSize &size)
|
||||
|
@ -155,15 +155,6 @@ macx {
|
||||
widgets/qmaccocoaviewcontainer_mac.mm
|
||||
}
|
||||
|
||||
# TODO
|
||||
false:mac {
|
||||
OBJECTIVE_HEADERS += widgets/qcocoatoolbardelegate_mac_p.h \
|
||||
widgets/qcocoamenu_mac_p.h
|
||||
OBJECTIVE_SOURCES += widgets/qcocoatoolbardelegate_mac.mm \
|
||||
widgets/qmainwindowlayout_mac.mm
|
||||
|
||||
}
|
||||
|
||||
wince*: {
|
||||
SOURCES += widgets/qmenu_wince.cpp
|
||||
HEADERS += widgets/qmenu_wince_resource_p.h
|
||||
|
@ -121,9 +121,7 @@ private slots:
|
||||
|
||||
// Map/unmap large file
|
||||
void mapFile();
|
||||
#ifndef Q_OS_MAC
|
||||
void mapOffsetOverflow();
|
||||
#endif
|
||||
|
||||
void closeFile() { largeFile.close(); }
|
||||
|
||||
@ -513,9 +511,9 @@ void tst_LargeFile::mapFile()
|
||||
}
|
||||
|
||||
//Mac: memory-mapping beyond EOF may succeed but it could generate bus error on access
|
||||
#ifndef Q_OS_MAC
|
||||
void tst_LargeFile::mapOffsetOverflow()
|
||||
{
|
||||
#ifndef Q_OS_MAC
|
||||
// Out-of-range mappings should fail, and not silently clip the offset
|
||||
for (int i = 50; i < 63; ++i) {
|
||||
uchar *address = 0;
|
||||
@ -529,8 +527,8 @@ void tst_LargeFile::mapOffsetOverflow()
|
||||
address = largeFile.map(((qint64)1 << i) + blockSize, blockSize);
|
||||
QVERIFY( !address );
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
QTEST_APPLESS_MAIN(tst_LargeFile)
|
||||
#include "tst_largefile.moc"
|
||||
|
@ -193,6 +193,8 @@ private slots:
|
||||
|
||||
void isReadable();
|
||||
|
||||
void cdNonreadable();
|
||||
|
||||
void cdBelowRoot();
|
||||
|
||||
private:
|
||||
@ -1990,6 +1992,23 @@ void tst_QDir::isReadable()
|
||||
#endif
|
||||
}
|
||||
|
||||
void tst_QDir::cdNonreadable()
|
||||
{
|
||||
#ifdef Q_OS_UNIX
|
||||
if (::getuid() == 0)
|
||||
QSKIP("Running this test as root doesn't make sense");
|
||||
|
||||
QDir dir;
|
||||
QVERIFY(dir.mkdir("nonreadabledir2"));
|
||||
QVERIFY(0 == ::chmod("nonreadabledir2", S_IWUSR | S_IXUSR));
|
||||
QVERIFY(dir.cd("nonreadabledir2"));
|
||||
QVERIFY(!dir.isReadable());
|
||||
QVERIFY(dir.cd(".."));
|
||||
QVERIFY(0 == ::chmod("nonreadabledir2", S_IRUSR | S_IWUSR | S_IXUSR));
|
||||
QVERIFY(dir.rmdir("nonreadabledir2"));
|
||||
#endif
|
||||
}
|
||||
|
||||
void tst_QDir::cdBelowRoot()
|
||||
{
|
||||
#if defined (Q_OS_UNIX)
|
||||
|
@ -52,7 +52,7 @@
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_BLACKBERRY)
|
||||
#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(Q_OS_BLACKBERRY) && !defined(Q_OS_ANDROID)
|
||||
#define Q_XDG_PLATFORM
|
||||
#endif
|
||||
|
||||
@ -289,9 +289,9 @@ void tst_qstandardpaths::testDataLocation()
|
||||
{
|
||||
// On all platforms, DataLocation should be GenericDataLocation / organization name / app name
|
||||
// This allows one app to access the data of another app.
|
||||
// Blackberry OS and WinRT are an exception to this case, owing to the fact that
|
||||
// Blackberry OS, Android and WinRT are an exception to this case, owing to the fact that
|
||||
// applications are sandboxed.
|
||||
#if !defined(Q_OS_BLACKBERRY) && !defined(Q_OS_WINRT)
|
||||
#if !defined(Q_OS_BLACKBERRY) && !defined(Q_OS_ANDROID) && !defined(Q_OS_WINRT)
|
||||
const QString base = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
|
||||
QCOMPARE(QStandardPaths::writableLocation(QStandardPaths::DataLocation), base + "/tst_qstandardpaths");
|
||||
QCoreApplication::instance()->setOrganizationName("Qt");
|
||||
|
@ -1,3 +1,3 @@
|
||||
TEMPLATE = subdirs
|
||||
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("iso3") << QString("0999-01-01") << Qt::ISODate << QDate(999, 1, 1);
|
||||
QTest::newRow("iso3b") << QString("0999-01-01") << Qt::ISODate << QDate(999, 1, 1);
|
||||
QTest::newRow("iso4") << QString("2000101101") << Qt::ISODate << QDate();
|
||||
QTest::newRow("iso5") << QString("2000/01/01") << Qt::ISODate << QDate(2000, 1, 1);
|
||||
QTest::newRow("iso6") << QString("2000-01-01 blah") << Qt::ISODate << QDate(2000, 1, 1);
|
||||
QTest::newRow("iso7") << QString("2000-01-011blah") << Qt::ISODate << QDate();
|
||||
QTest::newRow("iso8") << QString("2000-01-01blah") << Qt::ISODate << QDate(2000, 1, 1);
|
||||
QTest::newRow("iso9") << QString("-001-01-01") << Qt::ISODate << QDate();
|
||||
QTest::newRow("iso10") << QString("99999-01-01") << Qt::ISODate << QDate();
|
||||
|
||||
// Test Qt::RFC2822Date format (RFC 2822).
|
||||
QTest::newRow("RFC 2822") << QString::fromLatin1("13 Feb 1987 13:24:51 +0100")
|
||||
|
@ -2787,6 +2787,13 @@ void tst_QDateTime::daylightTransitions() const
|
||||
|
||||
void tst_QDateTime::timeZones() const
|
||||
{
|
||||
QTimeZone invalidTz = QTimeZone("Vulcan/ShiKahr");
|
||||
QCOMPARE(invalidTz.isValid(), false);
|
||||
QDateTime invalidDateTime = QDateTime(QDate(2000, 1, 1), QTime(0, 0, 0), invalidTz);
|
||||
QCOMPARE(invalidDateTime.isValid(), false);
|
||||
QCOMPARE(invalidDateTime.date(), QDate(2000, 1, 1));
|
||||
QCOMPARE(invalidDateTime.time(), QTime(0, 0, 0));
|
||||
|
||||
QTimeZone nzTz = QTimeZone("Pacific/Auckland");
|
||||
|
||||
// During Standard Time NZ is +12:00
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user